Як я можу знайти в пам'яті структуру даних, що представляє шахтне розташування шахтного трактора?


94

Я намагаюся дізнатися про зворотну техніку, використовуючи Minesweeper як зразок програми. Я знайшов цю статтю MSDN про просту команду WinDbg, яка розкриває всі міни, але вона стара, не пояснюється докладно, і насправді це не те, що я шукаю.

У мене є розбиральник IDA Pro та налагоджувач WinDbg, і я завантажив winmine.exe в обидва. Чи може хтось надати кілька практичних порад для будь-якої з цих програм з точки зору пошуку місця розташування структури даних, що представляє шахтне поле?

У WinDbg я можу встановити точки перерви, але мені важко уявити, в який момент встановити точку розриву та в якому місці пам'яті. Так само, переглядаючи статичний код в IDA Pro, я не знаю, з чого навіть почати знаходити функцію або структуру даних, що представляє шахтне поле.

Чи є інженери з реверсу на Stackoverflow, які можуть направити мене в правильному напрямку?


27
Яка чудова ідея для завдання для студентів. Це свого роду схоже на лабораторію анатомії з тральщиком, як кіт.
ojblass

3
для наших міжнародних читачів, які можуть заплутатися, тральщик - це американська версія щасливої ​​гри з пошуку квітів, яка постачається з Windows Vista. microsoft.blognewschannel.com/index.php/archives/2006/09/28/…
Kip

16
Щаслива гра з пошуку квітів? O_o Політкоректність зайшла занадто далеко.
Євген

10
Ну, версія тральщика - це за замовчуванням принаймні у шведській версії Vista. Я припускаю, що вони за замовчуванням версії "щасливі квіти" в місцях, де міни насправді схильні дітям на шматки.
JesperE

1
Отже ... просто натискання на деякі випадкові квадрати, щоб побачити, чи є вони мінами, це не корисно для цього, так?
Смандолі

Відповіді:


125

Частина 1 з 3


Якщо ви серйозно ставитесь до зворотного проектування - забудьте про тренерів і чіт-двигунів.

Хороший інженер з реверсу повинен спочатку ознайомитися з ОС, основними функціями API, загальною структурою програми (що таке цикл запуску, структурами Windows, процедурами обробки подій), форматом файлу (PE). Класика Petzold "Програмування Windows" може допомогти (www.amazon.com/exec/obidos/ISBN=157231995X), а також онлайн-MSDN.

Спочатку слід подумати, де можна викликати процедуру ініціалізації мінного поля. Я думав про наступне:

  • Коли ви запускаєте гру
  • Коли ви натискаєте щасливе обличчя
  • Коли ви натискаєте Гра-> Створити або натисніть F2
  • При зміні рівня складності

Я вирішив перевірити F2 прискорювач команди.

Щоб знайти код обробки прискорювача, ви повинні знайти процедуру обробки віконних повідомлень (WndProc). Це можна простежити за допомогою викликів CreateWindowEx та RegisterClass.

Читати:

Відкрийте вікно ІДА, імпорт, знайдіть «Створити вікно *», перейдіть до нього та скористайтеся командою «Перейти xref до операнду (X)», щоб побачити, куди він викликаний. Повинен бути лише один дзвінок.

Тепер перегляньте вище функцію RegisterClass та її параметр 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_COMMAND. Ви повинні знайти, де це порівняно з 111h. Це можна зробити, відстежуючи edx в IDA або встановлюючи умовну точку розриву в WinDbg і натискаючи F2 в грі.

Будь-який спосіб веде до чогось подібного

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

Клацніть правою кнопкою миші на 111h та використовуйте "Символічна константа" -> "Використовувати стандартну символічну константу", введіть WM_ та Enter. Тепер ви повинні мати

.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? Тут грає хакер на ресурси . Подавайте його двійковим, і він все вам показує. Як таблиця акселераторів для мене.

альтернативний текст 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

Це призводить до фрагмента коду, який викликає деякий proc і виходить з 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 байт). Сподіваюся, ви можете побачити ітерацію циклу в цьому безладі;) Мені довелося використовувати папір та ручку

.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  ................................

Хм, схоже, мені знадобиться ще одна публікація, щоб закрити тему


1
@Stanislav, гарна відповідь Станіславе. Якщо ви взагалі можете детальніше розглянути це, будь ласка, зробіть це. Ці довгі, інформативні відповіді - найкращі. Можливо, трохи більше про те, як ви зробили нуль у структурі даних мінного поля?
KingNestor

@ Станіслав, я прийняв вашу відповідь, оскільки закінчилася сума в розмірі 250 представників. Вітаємо!
KingNestor

1
@ Станіслав, я відредагував вашу відповідь на багато частин в одну відповідь. Ви не наблизилися до обмеження розміру вашої єдиної відповіді, і я думаю, що зазвичай бажано мати одну відповідь, а не декілька. Не соромтесь відредагувати оригінальну відповідь (цю) та додати до неї, як вважаєте за потрібне.
mmcdole

2
Також, епічна відповідь Станіслава. Велике спасибі за вашу працьовитість!
mmcdole

15

Схоже, ви намагаєтесь розібрати джерело, але те, що вам потрібно зробити, це подивитися на простір пам'яті запущеної програми. Шестнадцятковий редактор HxD має функцію, яка дозволяє вам просто це.

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

Опинившись у просторі пам’яті, вам належить зробити знімки пам’яті, коли ви возитися з дошкою. Виділіть, що змінюється порівняно з тим, що ні. Якщо ви думаєте, що у вас є ручка про те, де структура даних лежить у шістнадцятковій пам'яті, спробуйте відредагувати її, поки вона знаходиться в пам'яті, і подивіться, чи зміниться плата в результаті.

Хочений процес не відрізняється від створення «тренера» для відеоігор. Зазвичай вони базуються на знаходженні, де такі цінності, як здоров’я та боєприпаси, живуть в пам'яті та змінюють їх на ходу. Можливо, ви зможете знайти кілька хороших підручників про те, як створити ігрові тренажери.


2
Ну, ви можете ~ знайти місцезнаходження пам'яті за допомогою статичної розбирання. Ви можете слідувати інструкціям з монтажу, шукаючи такі речі, як функції rand (), які викликаються для генерування шахтного поля, а потім простежте звідти, щоб побачити, в якому місці поле зберігається в пам'яті (і як).
mmcdole

Обидва підходи є складними. Я раніше намагався розібрати додатки, і вважав, що це дуже боляче. Як саме ви помічаєте функцію rand ()?
Джеймс Макмахон

Дякую за відповідь немо.
KingNestor

11

Перегляньте цю статтю кодового проекту, вона трохи глибша, ніж згадана вами публікація в блозі.

http://www.codeproject.com/KB/trace/minememoryreader.aspx

Редагувати

І ця стаття, хоча й не про безпосередньо тральщика, дає вам хороший покроковий посібник з полювання через пам’ять за допомогою WinDbg:

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

Редагуйте 2

Знову ж таки, мова не про тральщиків, але вона, безумовно, дала мені трохи їжі для роздумів для моєї налагодження пам’яті, тут є безліч навчальних посібників:

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

Крім того, завантажте CheatEngine (згаданий Ніком Д.) і працюйте з підручником, який він постачає.


9

"У WinDbg я можу встановити точки зупинку, але мені важко уявити, в якій точці встановити точку зупинки і в якому місці пам'яті. Подібним чином, коли я переглядаю статичний код в IDA Pro, я не впевнений, з чого навіть починати знайти функцію або структуру даних, що представляє шахтне поле. "

Саме так!

Ну, ви можете шукати підпрограми типу random (), які будуть викликані під час побудови таблиці мін. Ця книга мені дуже допомогла, коли я експериментував із зворотною технікою. :)

Загалом, хорошими місцями для встановлення точок перерви є дзвінки до скриньки повідомлень, дзвінки для відтворення звуку, таймери та інші підпрограми API Win32.

До речі, я зараз сканую тральщик з OllyDbg .

Оновлення: Nemo нагадав мені чудовий інструмент, Cheat Engine від Еріка "Темний Байт" Хеййнен.

Cheat Engine (CE) - чудовий інструмент для перегляду та модифікації простору пам’яті інших процесів. Крім цієї основної можливості, CE має ще й такі особливості, як перегляд розібраної пам'яті процесу та введення коду в інші процеси.

( реальна цінність цього проекту полягає в тому, що ви можете завантажити вихідний код -Delphi- і подивитися, як ці механізми були реалізовані - я це робив багато років тому: o)


5

Досить гарну статтю на цю саму тему можна знайти в « Неінформовані» . Він висвітлює реверсивну роботу міночистача (як вступ до зворотної інженерної програми Win32) досить чудово та детально, і все навколо досить чудовий ресурс.


4

Цей веб-сайт може бути кориснішим:

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

Загальний спосіб зробити це:

  1. Якось дістати вихідний код.
  2. Розберіть і сподівайтеся, що залишки символів можуть вам допомогти.
  3. Відгадайте тип даних і спробуйте маніпулювати ними та скористайтеся сканером пам’яті, щоб обмежити можливості.

У відповідь Баунті

Що ж, у другому читанні здається, що ви хочете посібника про те, як використовувати налагоджувач типу WinDBG, а не звичайне питання про те, як повернути інженера. Я вже показав вам веб-сайт, який повідомляє вам значення, які потрібно шукати, тому питання полягає в тому, як ви його шукаєте?

У цьому прикладі я використовую Блокнот, оскільки у мене не встановлено «Сапер». Але ідея та ж.

alt текст

Ви вводите

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

Натисніть "?", А потім "s", щоб переглянути допомогу.

Знайшовши потрібний шаблон пам'яті, ви можете натиснути клавіші alt + 5, щоб відкрити засіб перегляду пам'яті для гарного відображення.

alt текст

WinDBG вимагає певного звикання, але він такий же хороший, як і будь-який інший налагоджувач.


1
"Якимось чином отримати вихідний код" - це нерозумне твердження, оскільки Minesweeper надсилається без джерела. І зворотне проектування з джерелом - це не зворотне проектування ... це аналіз вихідного коду.
mrduclaw

@mrduclaw є програми, які можуть декомпілювати збірку на мову джерела. Не існує терміна, що називається "аналіз вихідного коду".
Невідомо

1
@Unknown Є програми, які намагаються реконструювати програму мовою джерела із заданого зібраного двійкового файлу. Але ви не можете отримати "вихідний код" з авторськими коментарями та цитатами зі складеного бінарного файлу. Звичайно, деякі з цих "декомпіляторів" роблять краще роботу, ніж інші, але вони не дають вам коду, який написав автор (оптимізований компілятором код дуже сильно відрізняється від коду програміста). І ви ніколи не проводили тестування на забезпечення якості? Що роблять такі інструменти, як PREfast і Sparse? Статичний аналіз вихідного коду.
mrduclaw

Статичний аналіз вихідного коду в PREfast та Sparse абсолютно відрізняється від читання декомпільованого коду вручну з метою його злому. Я не думаю, що хтось би переплутав ці дві різні ідеї як один з одним.
Невідомо

@Unknown Я беру на це ще один крок і погоджуюсь, що ви не повинні плутати зворотне інженерне розбирання з переглядом вихідного коду (декомпільованого чи іншого, якщо у вас є джерело, яке ви виконуєте для аналізу вихідного коду). Це була вся моя суть. Тож, будь ласка, припиніть плутати це двоє. :)
mrduclaw

0

Хороший момент, щоб почати відстежувати налагоджувач, було б на миші вгору. Тому знайдіть процедуру головного вікна (я думаю, такі інструменти, як spyxx, можуть перевірити властивості Windows, а адреса обробника подій - одна з них). Перейдіть до нього і знайдіть, де він обробляє події миші - буде перемикач, якщо ви зможете розпізнати його в асемблері (подивіться значення WM_XXX для миші в windows.h).

Поставте туди перерву і починайте заходити. Десь між часом, коли ви відпустите кнопку миші та оновлений екран, winum отримає доступ до потрібної структури даних.

Будьте терплячі, намагайтеся визначити, що робиться в будь-який момент часу, але не турбуйтеся занадто заглиблюватися в код, який ви підозрюєте, що він нецікавий для вашої поточної мети. Це може зайняти кілька прогонів у відладці, щоб прибити її.

Знання нормальних робочих процесів програм Win32 також допомагає.


0

Міни, ймовірно, зберігатимуться в якомусь двовимірному масиві. Це означає, що це або масив покажчиків, або одиночний масив булевих стилів C.

Щоразу, коли форма отримує подію миші, ця структура даних посилається. Індекс буде обчислюватися за допомогою координати миші, ймовірно, використовуючи ціле ділення. Це означає, що вам, мабуть, слід шукати cmpабо подібну інструкцію, де один з операндів обчислюється із зміщенням, а xде xрезультат обчислення, що включає ціле ділення. Зсув буде тоді вказівником на початок структури даних.


0

Доцільно припустити, що інформація про міни постійно зберігається в пам'яті принаймні для рядків (тобто це 2D-масив або масив масивів). Таким чином, я б спробував відкрити кілька сусідніх комірок в одному рядку, зробивши дамп пам'яті процесу, коли я йду, а потім розрізняю їх і шукаю будь-які повторювані зміни в тій же області пам’яті (тобто 1 байт змінено на першому кроці, на наступному байт змінено на точно таке ж значення на наступному кроці тощо).

Існує також можливість, що це запакований бітовий масив (3 біта на міну повинно бути достатньо для запису всіх можливих станів - закритого / відкритого, шахтного / не мінного, позначеного / не флагмірованного), тому я б також звернув увагу на це ( візерунки також будуть повторюваними, хоча їх важче помітити). Але це не зручна структура для вирішення, і я не думаю, що використання пам'яті було вузьким місцем для тральщика, тому малоймовірно, що подібні речі будуть використані.


0

Незважаючи на те, що це не суто «інструмент зворотного інженера», а більше іграшка, яку міг би використовувати навіть такий ідіот, як я, перевірте Cheat Engine . Це дозволяє дещо легко відслідковувати, які частини пам’яті змінилися, коли і навіть мають положення для відстеження змінених частин пам’яті за допомогою покажчиків (хоча, напевно, це не потрібно). Включений приємний інтерактивний підручник.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.