كيف يمكنني العثور على بنية البيانات التي تمثل تخطيط الألغام في minesweeper في الذاكرة؟

StackOverflow https://stackoverflow.com/questions/931257

سؤال

أحاول أن أتعلم عن الهندسة العكسية، باستخدام minesweeper كأداة نموذجية. لقد وجدت هذا MSDN المادة في أمر WINDBG بسيط يكشف عن جميع الألغام ولكنه قديم، لا يتم شرح أي تفصيل ولا حقا ما أبحث عنه.

لدي IDA Pro disassembler. و ال عصابات النينبغ ولقد تحميل WinMine.exe في كل منهما. هل يمكن لشخص ما تقديم بعض النصائح العملية لأي من هذه البرامج من حيث إيجاد موقع بنية البيانات التي تمثل حقل الألغام؟

في WINDBG يمكنني تعيين نقاط التوقف، ولكن من الصعب أن أتخيل في أي نقطة لوضع نقطة توقف وفي موقع الذاكرة. وبالمثل، عندما أعرض التعليمات البرمجية الثابتة في IDA Pro، لست متأكدا من أين أبدأ في العثور على وظيفة أو بنية البيانات التي تمثل حقل الألغام.

هل هناك مهندسون عكسي على Stackoverflow التي يمكن أن توجيهي في الاتجاه الصحيح؟

هل كانت مفيدة؟

المحلول

الجزء 1 من 3


إذا كنت جادا في الهندسة العكسية - انسوا المدربين ومحركات الغش.

يجب أن تعرف مهندس عكسي جيد أولا معرفة نظام التشغيل، ووظائف API الأساسية، والبنية العامة البرنامج (ما يتم تشغيل الحلقة، وهياكل Windows، وإجراءات معالجة الأحداث)، تنسيق الملف (PE). يمكن أن يساعد Petzold's الكلاسيكية "برمجة Windows" (www.amazon.com/exec/obidos/isbn=157231995x) بالإضافة إلى MSDN عبر الإنترنت.

أولا، يجب أن تفكر في المكان الذي يمكن استدعاء روتين تهيئة حقل أرضي. فكرت في يلي:

  • عند إطلاق اللعبة
  • عند النقر فوق وجه سعيد
  • عند النقر فوق اللعبة-> جديد أو اضغط F2
  • عند تغيير مستوى الصعوبة

قررت التحقق من أمر Accelerator F2.

للعثور على رمز معالجة التسارع، فإنك للعثور على إجراء معالجة رسائل النافذة (WNDProC). يمكن تتبعه بواسطة CreateWindowEx و RegisterClass المكالمات.

ليقرأ:

افتح إيدا، نافذة الواردات، ابحث عن "Createwindow *"، والقفز إليه واستخدام الأمر "Jump Xref to Operand (x)" لمعرفة مكان ما يسمى. يجب أن يكون هناك مكالمة واحدة فقط.

ننظر الآن إلى وظيفة RegisterClass و IT هي المعلمة wndclass.lpfnwndproc. لقد سميت بالفعل وظيفة MainwndProc في حالتي.

.text:0100225D                 mov     [ebp+WndClass.lpfnWndProc], offset mainWndProc
.text:01002264                 mov     [ebp+WndClass.cbClsExtra], edi
.text:01002267                 mov     [ebp+WndClass.cbWndExtra], edi
.text:0100226A                 mov     [ebp+WndClass.hInstance], ecx
.text:0100226D                 mov     [ebp+WndClass.hIcon], eax

.text:01002292                 call    ds:RegisterClassW

اضغط ENTER على اسم الوظيفة (استخدم "N" لإعادة تسميته إلى شيء أفضل)

الآن نلقي نظرة على

.text:01001BCF                 mov     edx, [ebp+Msg]

هذا هو معرف الرسائل، والتي في حالة فتحة زر F2 يجب أن تحتوي على قيمة WM_COMMMAND. أنت للعثور على مكان مقارنة ب 111 ساعة. يمكن القيام به إما عن طريق تتبع edx في IDA أو عن طريق وضع نقطة توقف مشروط في WINDBG والضغط على F2 في اللعبة.

في كلتا الحالتين يؤدي إلى شيء مثل

.text:01001D5B                 sub     eax, 111h
.text:01001D60                 jz      short loc_1001DBC

انقر بزر الماوس الأيمن فوق 111 ساعة واستخدام "ثابت رمز" -> "استخدام ثابت رمزي قياسي"، اكتب WM_ وأدخل. يجب أن يكون لديك الآن

.text:01001D5B                 sub     eax, WM_COMMAND
.text:01001D60                 jz      short loc_1001DBC

إنها طريقة سهلة لمعرفة قيم معرف الرسالة.

لفهم معالجة التسارع تحقق من:

إنه الكثير من النص للحصول على إجابة واحدة. إذا كنت مهتما، يمكنني كتابة زوجين آخرين من المشاركات. قصة حقل ألغام قصيرة طويلة مخزنة كمجموعة من البايتات [24x36]، 0x0F تظهر أن البايت لا يستخدم (لعب حقل أصغر)، 0x10 - حقل فارغ، 0x80 - الألغام.

الجزء 2 من 3


حسنا، دعنا نذهب مع زر F2.

وفق باستخدام مسرعات لوحة المفاتيح عندما يتم ضغط زر F2 وظيفة WNDProC

... يتلقى رسالة WM_COMMAND أو WM_SYSCOMMAND. تحتوي الكلمة المنخفضة على المعلمة WPARAM على معرف التسارع.

حسنا، لقد وجدنا بالفعل حيث تتم معالجة WM_COMMAND، ولكن كيفية تحديد قيمة المعلمة WPARAM المقابلة؟ هذا هو المكان هاكر الموارد يأتي دور. إطعامه مع ثنائي ويظهر لك كل شيء. مثل الطاولة المسرع بالنسبة لي.

نص Alt http://files.getdropbox.com/u/1478671/2009-07-29_161532.jpg.

يمكنك أن ترى هنا، أن زر F2 يتوافق مع 510 في WPARAM.

الآن دعنا نعود إلى التعليمات البرمجية، التي تتعامل مع WM_COMMAND. يقارن WPARAM مع ثوابت مختلفة.

.text:01001DBC HandleWM_COMMAND:                       ; CODE XREF: mainWndProc+197j
.text:01001DBC                 movzx   eax, word ptr [ebp+wParam]
.text:01001DC0                 mov     ecx, 210h
.text:01001DC5                 cmp     eax, ecx
.text:01001DC7                 jg      loc_1001EDC
.text:01001DC7
.text:01001DCD                 jz      loc_1001ED2
.text:01001DCD
.text:01001DD3                 cmp     eax, 1FEh
.text:01001DD8                 jz      loc_1001EC8

استخدم قائمة السياق أو اختصار لوحة المفاتيح "H" لعرض القيم العشرية ويمكنك أن ترى قفزتنا

.text:01001DBC HandleWM_COMMAND:                       ; CODE XREF: mainWndProc+197j
.text:01001DBC                 movzx   eax, word ptr [ebp+wParam]
.text:01001DC0                 mov     ecx, 528
.text:01001DC5                 cmp     eax, ecx
.text:01001DC7                 jg      loc_1001EDC
.text:01001DC7
.text:01001DCD                 jz      loc_1001ED2
.text:01001DCD
.text:01001DD3                 cmp     eax, 510
.text:01001DD8                 jz      loc_1001EC8 ; here is our jump

إنه يؤدي إلى قطع رمز يدعو بعض بروك ويخرج WNDProC.

.text:01001EC8 loc_1001EC8:                            ; CODE XREF: mainWndProc+20Fj
.text:01001EC8                 call    sub_100367A     ; startNewGame ?
.text:01001EC8
.text:01001ECD                 jmp     callDefAndExit  ; default

هل هذه هي الوظيفة التي تبدأ لعبة جديدة؟ تجد ذلك في الجزء الأخير! ابقوا متابعين.

الجزء 3 من 3

دعونا نلقي نظرة على الجزء الأول من هذه الوظيفة

.text:0100367A sub_100367A     proc near               ; CODE XREF: sub_100140C+CAp
.text:0100367A                                         ; sub_1001B49+33j ...
.text:0100367A                 mov     eax, dword_10056AC
.text:0100367F                 mov     ecx, uValue
.text:01003685                 push    ebx
.text:01003686                 push    esi
.text:01003687                 push    edi
.text:01003688                 xor     edi, edi
.text:0100368A                 cmp     eax, dword_1005334
.text:01003690                 mov     dword_1005164, edi
.text:01003696                 jnz     short loc_10036A4
.text:01003696
.text:01003698                 cmp     ecx, dword_1005338
.text:0100369E                 jnz     short loc_10036A4

هناك قيمتان (dword_10056ac، uvalue) تقرأ في التسجيلات EAX و ECX ومقارنة مع قيمين آخرين (DWORD_1005164، DWORD_1005338).

ألق نظرة على القيم الفعلية باستخدام WINDBG ('BP 01003696'؛ على استراحة 'p eax؛ p eCX') - بدا أنها أبعاد حقل الألغام بالنسبة لي. أظهر اللعب مع حجم ألغام الألغام المخصصة أن الزوج الأول أبعاد جديدة والأبعاد الحالية الثانية. دعونا وضع أسماء جديدة.

.text:0100367A startNewGame    proc near               ; CODE XREF: handleButtonPress+CAp
.text:0100367A                                         ; sub_1001B49+33j ...
.text:0100367A                 mov     eax, newMineFieldWidth
.text:0100367F                 mov     ecx, newMineFieldHeight
.text:01003685                 push    ebx
.text:01003686                 push    esi
.text:01003687                 push    edi
.text:01003688                 xor     edi, edi
.text:0100368A                 cmp     eax, currentMineFieldWidth
.text:01003690                 mov     dword_1005164, edi
.text:01003696                 jnz     short loc_10036A4
.text:01003696
.text:01003698                 cmp     ecx, currentMineFieldHeight
.text:0100369E                 jnz     short loc_10036A4

يتم استدعاء القيم الجديدة في وقت لاحق الكتابة فوق الكتابة الفرعية

.text:010036A7                 mov     currentMineFieldWidth, eax
.text:010036AC                 mov     currentMineFieldHeight, ecx
.text:010036B2                 call    sub_1002ED5

وعندما رأيته

.text:01002ED5 sub_1002ED5     proc near               ; CODE XREF: sub_1002B14:loc_1002B1Ep
.text:01002ED5                                         ; sub_100367A+38p
.text:01002ED5                 mov     eax, 360h
.text:01002ED5
.text:01002EDA
.text:01002EDA loc_1002EDA:                            ; CODE XREF: sub_1002ED5+Dj
.text:01002EDA                 dec     eax
.text:01002EDB                 mov     byte ptr dword_1005340[eax], 0Fh
.text:01002EE2                 jnz     short loc_1002EDA

كنت متأكدا تماما من أنني وجدت صفيف ألغلي. سبب الدورة التي تقوم بها 360h بايت صفيف (DWORD_1005340) مع 0xf.

لماذا 360h = 864؟ هناك بعض الإشارات أدناه التي يستغرقها هذا الصف 32 بايت و 864 يمكن تقسيمها على 32، لذلك يمكن أن تعقد الصفيف 27 * 32 خلايا (على الرغم من أن واجهة المستخدم تسمح بحقل ماكس 24 * 30، فهناك حشوة بايت واحدة حول صفيف للحدود).

يتكون التعليمات البرمجية التالية على حدود حقل الألغام أعلى وأسفل الحدود (0x10 byte). آمل أن تتمكن من رؤية التكرار الحلقة في تلك الفوضى؛) كان علي استخدام الورق والقلم

.text:01002EE4                 mov     ecx, currentMineFieldWidth
.text:01002EEA                 mov     edx, currentMineFieldHeight
.text:01002EF0                 lea     eax, [ecx+2]
.text:01002EF3                 test    eax, eax
.text:01002EF5                 push    esi
.text:01002EF6                 jz      short loc_1002F11    ; 
.text:01002EF6
.text:01002EF8                 mov     esi, edx
.text:01002EFA                 shl     esi, 5
.text:01002EFD                 lea     esi, dword_1005360[esi]
.text:01002EFD
.text:01002F03 draws top and bottom borders
.text:01002F03 
.text:01002F03 loc_1002F03:                            ; CODE XREF: sub_1002ED5+3Aj
.text:01002F03                 dec     eax
.text:01002F04                 mov     byte ptr MineField?[eax], 10h ; top border
.text:01002F0B                 mov     byte ptr [esi+eax], 10h       ; bottom border
.text:01002F0F                 jnz     short loc_1002F03
.text:01002F0F
.text:01002F11
.text:01002F11 loc_1002F11:                            ; CODE XREF: sub_1002ED5+21j
.text:01002F11                 lea     esi, [edx+2]
.text:01002F14                 test    esi, esi
.text:01002F16                 jz      short loc_1002F39

وبقية الروتين الفرعي يسحب الحدود اليسرى واليمين

.text:01002F18                 mov     eax, esi
.text:01002F1A                 shl     eax, 5
.text:01002F1D                 lea     edx, MineField?[eax]
.text:01002F23                 lea     eax, (MineField?+1)[eax+ecx]
.text:01002F23
.text:01002F2A
.text:01002F2A loc_1002F2A:                            ; CODE XREF: sub_1002ED5+62j
.text:01002F2A                 sub     edx, 20h
.text:01002F2D                 sub     eax, 20h
.text:01002F30                 dec     esi
.text:01002F31                 mov     byte ptr [edx], 10h
.text:01002F34                 mov     byte ptr [eax], 10h
.text:01002F37                 jnz     short loc_1002F2A
.text:01002F37
.text:01002F39
.text:01002F39 loc_1002F39:                            ; CODE XREF: sub_1002ED5+41j
.text:01002F39                 pop     esi
.text:01002F3A                 retn

الاستخدام الذكي لأوامر WINDBG يمكن أن توفر لك تفريغ الألغام الرائعة (حجم مخصص 9x9). تحقق من الحدود!

0:000> db /c 20 01005340 L360
01005340  10 10 10 10 10 10 10 10-10 10 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005360  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005380  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
010053a0  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
010053c0  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
010053e0  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005400  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005420  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005440  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005460  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005480  10 10 10 10 10 10 10 10-10 10 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
010054a0  0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
010054c0  0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
010054e0  0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................

حسنا، يبدو أنني سأحتاج إلى منشور آخر لإغلاق الموضوع

نصائح أخرى

يبدو أنك تحاول تفكيك المصدر ولكن ما عليك القيام به هو إلقاء نظرة على مساحة الذاكرة لبرنامج التشغيل. محرر عرافة HXD. لديه ميزة تتيح لك ذلك فقط.

http://www.freeimagehosting.net/uploads/fcc1991162.png

بمجرد أن تكون في مساحة الذاكرة، فمن المسألة اتخاذ لقطات من الذاكرة أثناء الفوضى مع اللوحة. عزل ما يتغير مقابل ما لا. عندما تعتقد أن لديك مقبض على المكان الذي يكمن فيه هيكل البيانات في ذاهب Hex، حاول تحريره أثناء وجوده في الذاكرة ومعرفة ما إذا كان اللوحة يتغير نتيجة لذلك.

العملية التي تريدها ليست على عكس بناء "مدرب" للحصول على لعبة فيديو. عادة ما يعيش هؤلاء في العثور على قيم مثل الصحة والذخيرة في الذاكرة وتغييرها على الطيران. قد تتمكن من العثور على بعض البرامج التعليمية الجيدة حول كيفية بناء مدربي اللعبة.

تحقق من مشروع مشروع الرمز هذا، إنه أكثر بقليل من العمق من منشور المدونة التي ذكرتها.

http://www.codeproject.com/kb/trace/minememoryReader.aspx.

يحرر

وهذا المقال، على الرغم من أنه ليس عن Minesweeper مباشرة، يمنحك دليل خطوة بخطوة جيدة على الصيد من خلال الذاكرة باستخدام WINDBG:

http://www.codingthewheel.com/archives/extracting-hidden-text-with-windbg.

تحرير 2.

مرة أخرى، هذا ليس عن minesweeper، لكنه أعطاني بالتأكيد بعض الطعام لفكر لتصحيح ذاكرتي، وهناك ثروة من البرامج التعليمية هنا:

http://memoryhacking.com/forums/index.php.

أيضا، تحميل محرك الغش (ذكرها نيك د) والعمل من خلال البرنامج التعليمي الذي يأتي به.

"في WINDBG أستطيع ضبط نقاط التوقف، ولكن من الصعب أن أتخيل ما أتروا نقطة توقف وفي موقع الذاكرة. وبالمثل، عندما عرض الرمز الثابت في IDA Pro، لست متأكدا من أين أبدأ للعثور على الوظيفة أو التحتية التي تمثل حقل الألغام. "

بالضبط!

حسنا، يمكنك البحث عن إجراءات مثل عشوائي () سيتم استدعاؤها أثناء بناء جدول الألغام. هذه كتاب ساعدني كثيرا عندما كنت تجريب الهندسة العكسية. :)

بشكل عام، يتم إجراء أماكن جيدة لإعداد نقاط الاستراحة مكالمات إلى صناديق الرسائل، والمكالمات لتشغيل الصوت والموزعات وإجراءات API الأخرى Win32.

راجع للشغل، أنا مسح minesweeper الآن مع ollydbg..

تحديث: نيمو ذكرني أداة رائعة، محرك الغش بواسطة إريك "بايت داكن" heijnen.

محرك الغش (CE) هو أداة رائعة لمشاهدة وتعديل مساحة الذاكرة العمليات الأخرى. أبعد من ذلك الأساسي مرفق، CE لديه المزيد من ميزات خاصة مثل عرض الذاكرة المفككة لعملية وعقن رمز في العمليات الأخرى.

(ال حقيقة قيمة هذا المشروع هو أنه يمكنك تنزيل شفرة المصدر -Delphi - ومعرفة كيفية تنفيذ هذه الآليات - فعلت ذلك منذ سنوات عديدة: O)

يمكن العثور على مقال جيد جدا حول هذا الموضوع في غير مطلع. وبعد ويغطي عكس الألواح الزراعية (كإجراء مقدمة لعكس تطبيقات Win32 Engineering) بتفصيل كبير جدا، وهو كل شيء حول مورد رائع جدا.

قد يكون هذا الموقع أكثر فائدة:

http://www.subversity.net/reversing/hacking-minesweeper.

الطريقة العامة للقيام بذلك هي:

  1. بطريقة أو بأخرى الحصول على شفرة المصدر.
  2. تفكيك وأمل الرموز بقايا يمكن أن تساعدك.
  3. تخمين نوع البيانات ومحاولة التعامل معها واستخدام ماسح ضوئي للذاكرة للحد من الاحتمالات.

ردا على مكافأة

حسنا، في قراءة ثانية، يبدو كما لو كنت تريد دليلا حول كيفية استخدام مصحح الأخطاء مثل WINDBG بدلا من السؤال المعتاد الخاص بكيفية عكس المهندس. لقد أظهرت لك بالفعل موقع الويب الذي يخبرك بالقيم التي تحتاجها للبحث عنها، لذلك السؤال هو، كيف يمكنك البحث عن ذلك؟

أنا أستخدم المفكرة في هذا المثال لأنني لا أستطيع تثبيت Minesweeper. ولكن الفكرة هي نفسها.

alt text

أنت تكتب

s <options> <memory start> <memory end> <pattern>

اضغط على "؟" ثم "S" لمعرفة المساعدة.

بمجرد العثور على نمط الذاكرة الذي تريده، يمكنك بعد ذلك الضغط على Alt + 5 لإظهار عارض الذاكرة لعرض جميل.

alt text

Windbg يأخذ بعض التعود، ولكنه جيد مثل أي مصحح آخر هناك.

إن نقطة جيدة لبدء البحث في مصحح الأخطاء ستكون على الماوس. لذلك ابحث عن إجراء النوافذ الرئيسية (أعتقد أن أدوات SPYXX يمكن أن تفقد عنوان ويندوز معالج الأحداث هو واحد منهم). اقتحمها وإيجاد مكان ما يتعامل مع أحداث الماوس - سيكون هناك تبديل، إذا كنت تستطيع التعرف عليه في المجمع (انظر إلى قيمة WM_XXX للماوس في Windows.H).

ضع نقطة توقف هناك وبدء تشغيل فيها. في مكان ما بين الوقت الذي تحررت فيه زر الماوس والشاشة التي يجري تحديثها، سيتم الوصول إلى Victumn الوصول إلى البيانات التي تبحث عنها.

التحلي بالصبر، حاول تحديد ما يجري القيام به في أي وقت معين، ولكن لا تهتم في النظر بعمق في التعليمات البرمجية التي تشك في كونها غير متفادا لتحقيق هدفك الحالي. قد يستغرق الأمر عدة أشواط في مصحح الأخطاء لتسجيله.

معرفة تطبيقات تطبيقات Win32 العادية تساعد أيضا.

من المحتمل أن يتم تخزين الألغام في نوع من صفيف ثنائي الأبعاد. هذا يعني أنه إما مجموعة من المؤشرات أو مجموعة أسلوب C واحدة من المنطاقين.

كلما تلقي النموذج حدث ماوس ما فوق تم الإشارة إلى بنية البيانات. سيتم احتساب الفهرس باستخدام تنسيق الماوس، وربما يستخدم قسم عدد صحيح. هذا يعني أنه ربما يجب أن تبحث عن cmp أو تعليمات مماثلة، حيث يتم حساب أحد المعاملات باستخدام إزاحة و x, ، أين x هي نتيجة لحساب تنطوي على قسم عدد صحيح. ستكون الإزاحة بعد ذلك المؤشر إلى بداية هيكل البيانات.

من المعقول إلى حد ما افتراض أن المعلومات حول الألغام يتم وضعها بشكل متلازم في الذاكرة على الأقل بالنسبة للصفوف (أي مجموعة 2D، أو صفيف صفائف). وبالتالي، سأحاول فتح العديد من الخلايا المجاورة في نفس الصف، مما يجعل مقالب ذاكرة العملية كما أذهب، ثم فتحها والبحث عن أي تغييرات متكررة في نفس منطقة الذاكرة (أي بايت 1 تغيرت في الخطوة الأولى، التالي تغيرت البايت إلى نفس القيمة بالضبط في الخطوة التالية، إلخ).

هناك أيضا إمكانية أنها مجموعة بت معبأة (يجب أن تكون 3 بت لكل من الألغام كافية لتسجيل جميع الدول الممكنة - مغلقة / مفتوحة، الألغام / عدم الألغام، العلمية / غير الموضحة)، لذلك أنا أنظر إلى ذلك أيضا ( ستكون الأنماط قابلة للتكرار أيضا، على الرغم من صعوبة اكتشافها). لكنه ليس عبارة عن هيكل مناسب للتعامل معه، ولا أعتقد أن استخدام الذاكرة كان عنق الزجاجة للألغام والأحد، لذلك من غير المرجح أن يتم استخدام هذا النوع من الأشياء.

في حين أنه ليس بدقة "أداة مهندس عكسية"، وأكثر من لعبة حتى أحمق مثلي يمكن استخدامها، تحقق من محرك الغش. وبعد يجعلها سهلة إلى حد ما لتتبع أجزاء من الذاكرة التي تغيرت، ومتى، وحتى لديها أحكام لتتبع أجزاء الذاكرة المتغيرة من خلال المؤشرات (على الرغم من أنك لا تحتاج إلى ذلك). يتم تضمين برنامج تعليمي تفاعلي لطيف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top