Большой брейкпоинт page exceptions
-
Наткнувшись на тему вспомнил, что не все написал. В прошлом посте блога рассматривал бряк через DBVM. К сожалению, та версия dbvm из поста блога пропускала очень много инструкций и практически смысла нет её юзать. Например она определяла 16 инструкций, когда их было несколько тысяч, т.е. например 500 оффестов и на каждой по 10 инструкций. По DBVM надо, конечно, писать Дарк Байту, но желания нет.
Так вот. Не только с DBVM можно ставить бряки на участок памяти. Есть еще тип брейкпоинтов page exceptions. О нем давно-давно известно и он как на ладони, но почему-то я пропустил его, когда искал оффсеты в структурах
С ним можно работать с lua и без. Ловит огромное количество инструкций. Желательно мощное железо, т.к. игра скорее всего будет очень тормозить по 2-5 fps. Но на короткий запуск сойдет. 5 секунд и достаточно для снятия логов. На пару действий в игре тоже сойдет: выстрел или пермещение персонажа, прыжок или вообще ничего не делаем просто снимаем логи.- способ поставить бряк из окна памяти. Подопытная программа "Tutorial-x86_64.exe"
Здесь видно, что размер 720 байт
Логи из окна инструкций CE
1000259AE - 48 8B 00 - mov rax,[rax]
1000259C3 - 48 8B 00 - mov rax,[rax]
10001D70C - F7 40 50 10000000 - test [rax+50],00000010
10001D734 - 48 8B 00 - mov rax,[rax]
1000AAB40 - 48 83 78 70 00 - cmp qword ptr [rax+70],00
10001D809 - F7 40 50 10000000 - test [rax+50],00000010
10000D452 - 48 8B 0A - mov rcx,[rdx]
10005AE70 - 83 40 68 01 - add dword ptr [rax+68],01
1000A4CF5 - F7 40 50 10000000 - test [rax+50],00000010
1000A4EB8 - 48 8B 00 - mov rax,[rax]
10000DA76 - 4C 8B 32 - mov r14,[rdx]
10005AE90 - 83 68 68 01 - sub dword ptr [rax+68],01
100139C13 - F7 40 50 10000000 - test [rax+50],00000010
100139C32 - 48 8B 48 60 - mov rcx,[rax+60]
100139C46 - 48 8B 40 60 - mov rax,[rax+60]
10009CEFB - 48 8B 00 - mov rax,[rax]
100098850 - 8B 80 80010000 - mov eax,[rax+00000180]
1000A4E81 - 81 88 00010000 00200000 - or [rax+00000100],00002000
1000A4E98 - 48 8B 00 - mov rax,[rax]
1000AD685 - F7 40 50 08000000 - test [rax+50],00000008
10009BFB8 - 8B 40 50 - mov eax,[rax+50]
10009816F - F7 40 50 08000000 - test [rax+50],00000008
100098236 - 48 8B 00 - mov rax,[rax]
10001BECE - 48 8B 00 - mov rax,[rax]
100098419 - F7 40 50 08000000 - test [rax+50],00000008
1000A2A28 - 48 8B 00 - mov rax,[rax]
1000A29F4 - 48 8B 12 - mov rdx,[rdx]
1000A4CC8 - 81 A0 00010000 FFDFFFFF - and [rax+00000100],FFFFDFFF
10001CC58 - F7 40 50 10000000 - test [rax+50],00000010
10000DB13 - 48 8B 00 - mov rax,[rax]
100095C65 - 48 8B 48 60 - mov rcx,[rax+60]
100095C75 - 48 8B 40 60 - mov rax,[rax+60]
10001CB04 - F7 40 50 10000000 - test [rax+50],00000010
10009BF35 - 8B 40 50 - mov eax,[rax+50]
10009932D - 48 8B 00 - mov rax,[rax]
10001F5C8 - F7 40 50 08000000 - test [rax+50],00000008
10001F638 - 8B 40 50 - mov eax,[rax+50]
100021803 - F7 40 50 08000000 - test [rax+50],00000008
100021923 - F7 40 50 08000000 - test [rax+50],00000008
10001ACB1 - 8B 41 50 - mov eax,[rcx+50]
10001B850 - 48 8B 48 60 - mov rcx,[rax+60]
10001B85C - 48 8B 40 60 - mov rax,[rax+60]
1000A2AC0 - 48 8B 00 - mov rax,[rax]
10013A2A3 - F7 40 50 10000000 - test [rax+50],00000010
10013A336 - 48 8B 00 - mov rax,[rax]
100098AC4 - 4C 8B 02 - mov r8,[rdx]
100098AD9 - 48 8B 00 - mov rax,[rax]
10013A35C - 48 8B 00 - mov rax,[rax]
10008A0C1 - 48 8B 00 - mov rax,[rax]
1000192A9 - 48 8B 12 - mov rdx,[rdx]
1000A3B99 - 48 8B 12 - mov rdx,[rdx]
100096636 - 8B 82 D0010000 - mov eax,[rdx+000001D0]
10008A0ED - 48 8B 00 - mov rax,[rax]
100097DF9 - 48 8B 00 - mov rax,[rax]
1000A4325 - 81 B8 80010000 FF7F0000 - cmp [rax+00000180],00007FFF
1000A6218 - F7 40 50 10000000 - test [rax+50],00000010
1000A6240 - 48 8B 00 - mov rax,[rax]
1000A6254 - 48 8B 00 - mov rax,[rax]
100097727 - 48 8B 48 60 - mov rcx,[rax+60]
100097733 - 48 8B 40 60 - mov rax,[rax+60]
10018E4D9 - F7 40 50 10000000 - test [rax+50],00000010
1000AA369 - F7 80 58010000 00400000 - test [rax+00000158],00004000
1000AA394 - 48 8B 00 - mov rax,[rax]
1000AA600 - 48 83 B8 B0020000 00 - cmp qword ptr [rax+000002B0],00
100097E3B - 48 8B 00 - mov rax,[rax]
1000A74A9 - 48 8B 00 - mov rax,[rax]- Способ через Lua (подробнее в документации)
debug_setBreakpoint(structure_address, sizeMemory, bptAccess, bpmException, onBreakpoint)
P.S. Я написал про два способа установки брейкпоинта на множество адресов без DBVM. Вручную можно ставить такие брейкпоинты, но дальше уже кропотливый просмотр на предмет того чем это может помочь. Это может помочь определить типы данных и помочь прикинуть размер структуры, а также найти активные оффсеты. Можно на Lua автоматически определять активные offsets по базовому адресу структуры и эту структуру создать и заполнить в dessectData. Если будет время напишу скрипт.
- способ поставить бряк из окна памяти. Подопытная программа "Tutorial-x86_64.exe"