Как я могу найти структуру данных, которая представляет план горных работ Минного тральщика в памяти?

здесь вы добавляете внешний ключ для вашей «дочерней» таблицы

ALTER TABLE child
ADD FOREIGN KEY (P_Id)
REFERENCES parent(P_Id) 
ON DELETE CASCADE
ON UPDATE CASCADE;

После этого, если вы делаете запрос DELETE для «родительской» таблицы, как этот

DELETE FROM parent WHERE .....

, поскольку дочерний элемент имеет ссылку на родительский элемент с помощью команды DELETE CASCADE, строки «дочерний элемент» также будут удалены! вместе с «родителем».

93
задан mmcdole 31 July 2009 в 03:26
поделиться

10 ответов

Часть 1 из 3


Если вы серьезно занимаетесь реверс-инжинирингом - забудьте о трейнерах и чит-движках.

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

. Сначала вы должны подумать о том, где можно вызвать процедуру инициализации минного поля. Я думал о следующем:

  • Когда вы запускаете игру
  • Когда вы нажимаете счастливое лицо
  • Когда вы нажимаете Game-> New или нажимаете F2
  • Когда вы меняете уровень сложности

Я решил проверить Команда акселератора F2.

Чтобы найти код обработки ускорителя, вам нужно найти процедуру обработки оконных сообщений (WndProc). Его можно отследить с помощью вызовов CreateWindowEx и RegisterClass.

Чтобы прочитать:

Откройте IDA, импорт окна, найдите «CreateWindow *», перейдите к нему и используйте команду «Перейти по внешней ссылке к операнду (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 - пустое поле, сообщение. Младшее слово Параметр wParam содержит идентификатор ускорителя.

Хорошо, мы уже нашли, где обрабатывается WM_COMMAND, но как определить соответствующее значение параметра wParam? Здесь и вступает в игру Ресурсный хакер . Накормите его двоичным кодом, и он вам все покажет. Как таблица ускорителей для меня.

alt text 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

Let ' s взгляните на первую часть этой функции

.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'; на break '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

, я был полностью уверен, что нашел массив минных полей. Причина цикла, который начинается с массива длиной 360 байт (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  ................................

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

) Мне пришлось использовать бумагу и ручку

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

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

) Мне пришлось использовать бумагу и ручку

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

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

123
ответ дан 24 November 2019 в 06:18
поделиться

«В WinDbg я могу устанавливать точки останова, но мне трудно представить в какой точке установить точку останова и в какое место в памяти. Аналогично, когда Я просматриваю статический код в IDA Pro, я не уверен, где даже начать искать функция или структура данных, представляет собой минное поле ».

Точно!

Что ж, вы можете поискать подпрограммы вроде random (), которые будут вызываться во время построения таблицы мин. Эта книга мне очень помогла, когда Я экспериментировал с реверс-инжинирингом. :)

В общем, хорошие места для установки точек останова - это вызовы окон сообщений, вызовы воспроизведения звука, таймеры и другие подпрограммы Win32 API.

Кстати, я сканирую тральщик правильно. теперь с OllyDbg .

Обновление: nemo напомнил мне отличный инструмент, Cheat Engine Эрика "Dark Byte" Heijnen.

Cheat Engine (CE) - отличный инструмент для отслеживания и изменения пространства памяти других процессов. Помимо этой базовой возможности, CE имеет больше специальных функций, таких как просмотр дизассемблированной памяти процесса и внедрение кода в другие процессы.

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

9
ответ дан 24 November 2019 в 06:18
поделиться

Этот веб-сайт может быть более полезным:

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

Общий способ сделать это:

  1. Каким-то образом получить исходный код.
  2. Дизассемблируйте и надейтесь, что оставшиеся символы помогут вам.
  3. Угадайте тип данных и попробуйте манипулировать им и использовать сканер памяти, чтобы ограничить возможности.

В ответ на Bounty

Что ж, при втором чтении кажется, что вам нужно руководство по использованию отладчика, такого как WinDBG, а не обычный вопрос о том, как выполнить обратное проектирование. Я уже показал вам веб-сайт, на котором указаны значения, которые нужно искать, поэтому вопрос в том, как это искать?

В этом примере я использую Блокнот, потому что у меня не установлен «Сапер». Но идея та же.

alt text

Вы вводите

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

Нажмите "?"

4
ответ дан 24 November 2019 в 06:18
поделиться

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

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

Править

И эта статья, хотя и не о сапере напрямую, дает вам хорошее пошаговое руководство по поиску памяти с помощью WinDbg:

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

Edit 2

Опять же, речь идет не о сапере, но он определенно дал мне пищу для размышлений по поводу отладки памяти, здесь есть множество руководств:

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

Также скачайте CheatEngine (упомянутый Ником Д.) и изучите прилагаемое к нему руководство.

11
ответ дан 24 November 2019 в 06:18
поделиться

Хороший момент для начала трассировки в отладчике - это навести курсор мыши. Итак, найдите процедуру главного окна (я думаю, что такие инструменты, как spyxx, могут проверять свойства окон, и адрес обработчика событий является одним из них). Зайдите в него и найдите, где он обрабатывает события мыши - там будет переключатель, если вы сможете распознать его в ассемблере (посмотрите значение WM_XXX для мыши вверх в windows.h).

Поместите там точку останова и запустите Когда вы отпустите кнопку мыши и обновите экран, Victum получит доступ к структуре данных, которую вы ищете.

Будьте терпеливы, попытайтесь определить, что делается в любой момент времени, но не смотрите слишком глубоко в коде, который вы подозреваете, что он неинтересен для вашей текущей цели. Чтобы решить эту проблему, может потребоваться несколько запусков отладчика.

0
ответ дан 24 November 2019 в 06:18
поделиться

Похоже, вы пытаетесь дизассемблировать исходный код, но вам нужно посмотреть объем памяти запущенной программы. В шестнадцатеричном редакторе HxD есть функция, которая позволяет вам это сделать.

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

Как только вы попадаете в область памяти, вам нужно делать снимки памяти, пока вы возитесь с доской. Изолируйте, что меняется, а что нет. Когда вы думаете, что знаете, где находится структура данных в шестнадцатеричной памяти, попробуйте отредактировать ее, пока она находится в памяти, и посмотрите, изменится ли в результате плата.

Процесс, который вам нужен, мало чем отличается от создания «тренера». для видеоигры. Обычно они основаны на обнаружении в памяти таких значений, как здоровье и боеприпасы, и их изменении на лету. Возможно, вы найдете несколько хороших руководств по созданию игровых трейнеров.

15
ответ дан 24 November 2019 в 06:18
поделиться

Хорошую статью по этой теме можно найти по адресу Uninformed . Он довольно подробно описывает реверсирование Minesweeper (как введение в обратное проектирование приложений Win32) и представляет собой отличный ресурс.

5
ответ дан 24 November 2019 в 06:18
поделиться

Мины, вероятно, будут храниться в виде какого-то двумерного массива. Это означает, что это либо массив указателей, либо единственный массив логических значений в стиле C.

Всякий раз, когда форма получает событие «вверх» мыши, делается ссылка на эту структуру данных. Индекс будет рассчитываться с использованием координаты мыши, возможно, с использованием целочисленного деления. Это означает, что вам, вероятно, следует искать команду cmp или аналогичную инструкцию, в которой один из операндов вычисляется с использованием смещения и x , где x - это результат вычисления с целочисленным делением. Тогда смещение будет указателем на начало структуры данных.

0
ответ дан 24 November 2019 в 06:18
поделиться

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

Также возможно, что это упакованный битовый массив (3 бита на каждую шахту должно быть достаточно для записи всех возможных состояний - закрыто / открыто, мое / нет, отмечены / не отмечены), поэтому я бы тоже обратил внимание на это (шаблоны также будут повторяться, хотя их труднее обнаружить). Но это неудобная структура, и я не

0
ответ дан 24 November 2019 в 06:18
поделиться

Хотя это и не совсем «инструмент реверс-инженера», а скорее игрушка, которую мог бы использовать даже такой идиот, как я, ознакомьтесь с Cheat Engine . Это несколько упрощает отслеживание того, какие части памяти были изменены, когда, и даже имеет условия для отслеживания измененных частей памяти с помощью указателей (хотя вам, вероятно, это не нужно). Включен красивый интерактивный учебник.

0
ответ дан 24 November 2019 в 06:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: