Сделать большой брейкпоинт на структуру через dbk_useKernelmodeOpenProcess
-
Обычно, дается 4 аппаратных брейкпоинта на адреса памяти. Их можно включать одновременно и найти инструкции, которые в данный момент срабатывают. Так можно определить тип данных у адресов и найти инструкции. По инструкциям найти смещения внутри дизассемблированной инструкции. По смещениям визуально определить структуры в структурах. Расструтуризовать структуру в dessect data и найти много интересных параметров для читов. Вручную с 4мя бряками делать очень хлопотно.
Начинается все с установки огромного бряка на структуру из туториала CE.
\-- Tutorial-x86_64.exe+2B3A9 - 81 BB F0070000 E8030000 - cmp [rbx+000007F0],000003E8 { 1000 } local addressStructure = 0x000001FB07E391B0 local sizeStrucure = 0x1000 local TYPE_BREAKPOINT_ACESS = "READ" -- "READ" "WRITE" режимы брейкпоинта local scanTIme = 7000 -- через 7 секунд показать результат local stopTimee = true -- остановить таймер после получения результата if dbkInited == nil or not dbkInited then dbkInited = dbk_initialize() dbk_useKernelmodeOpenProcess() OpenProcess(getOpenedProcessID()) if not dbkInited then print("Can't load DBK") return end -- Появится диалог, жем "ДА" dbvm_initialize(true) end string.format('Start watching address: = %016X size: %X', addressStructure, sizeStrucure) local physicalAddress = dbk_getPhysicalAddress(addressStructure) print (physicalAddress) if TYPE_BREAKPOINT_ACESS == "WRITE" then IDscannerWrites = dbvm_watch_writes(physicalAddress, sizeStrucure) elseif TYPE_BREAKPOINT_ACESS == "READ" then IDscannerReads = dbvm_watch_reads(physicalAddress, sizeStrucure) end function PrintResult(IDscanner) data = dbvm_watch_retrievelog(IDscanner) if data == nil then print('Inforamtion: Data nil') return end if #data <= 0 then print('Inforamtion: #data <= 0') return end for i=1,#data do print(string.format('RIP = %016X',data[i].RIP)) print(disassemble(data[i].RIP)) end end timer = createTimer(nil, false) timer.OnTimer = function(timer) if TYPE_BREAKPOINT_ACESS == "WRITE" then print "Result Writes" PrintResult(IDscannerWrites) elseif TYPE_BREAKPOINT_ACESS == "READ" then print "Result Reads" PrintResult(IDscannerReads) end if stopTimee then print "Stop Timer" timer.Enabled = false dbvm_watch_disable(IDscannerWrites) dbvm_watch_disable(IDscannerReads) end end timer.Interval = 10000 timer.Enabled = true
Логи
Result Reads RIP = FFFFF8040E9D5320 FFFFF8040E9D5320 - 00 00 - add [rax],al RIP = FFFFF8040E9D5300 FFFFF8040E9D5300 - 00 00 - add [rax],al RIP = 000000010002B3A9 10002B3A9 - 81 BB F0070000 E8030000 - cmp [rbx+000007F0],000003E8 RIP = 000000010009D080 10009D080 - 48 83 B8 88050000 00 - cmp qword ptr [rax+00000588],00 RIP = 000000010002599D 10002599D - 80 B8 02040000 00 - cmp byte ptr [rax+00000402],00 RIP = 00000001000259AE 1000259AE - 48 8B 00 - mov rax,[rax] RIP = 00000001000A429D 1000A429D - 8A 81 00040000 - mov al,[rcx+00000400] RIP = 00000001000259C3 1000259C3 - 48 8B 00 - mov rax,[rax] RIP = 000000010001D70C 10001D70C - F7 40 50 10000000 - test [rax+50],00000010 RIP = 000000010001D71D 10001D71D - 80 B8 A1050000 00 - cmp byte ptr [rax+000005A1],00 RIP = 000000010001D734 10001D734 - 48 8B 00 - mov rax,[rax] RIP = 00000001000AAB40 1000AAB40 - 48 83 78 70 00 - cmp qword ptr [rax+70],00 RIP = 000000010001D741 10001D741 - 48 83 B8 98060000 00 - cmp qword ptr [rax+00000698],00 RIP = 000000010001D7F8 10001D7F8 - 80 B8 A1050000 00 - cmp byte ptr [rax+000005A1],00 RIP = 000000010001D809 10001D809 - F7 40 50 10000000 - test [rax+50],00000010 RIP = 000000010009B630 10009B630 - 48 83 B8 70040000 00 - cmp qword ptr [rax+00000470],00
По логам видим, что какие-то инструкции обращаются и скорее всего обращаются к нашей той самой структуре. Проверим так ли это и заодно увидим к каким другим структурам идет обращение
Видим, что одна из инструкций действительно обращается к нашей структуре и далеко за пределам диапазона 4 брейкпоинтов. Т.е. это действительно огромный такой брейкпоинт на всю структуру.
Также видим, что инструкция отработала по другим 4 структурам и это могли быть враги и друзья игрока.
Также видим, что тип данных автоматически неверно определился в окна DesectData и мы можем его скорективать - это будет 1 байт
Вот так можно проводить ручную расструктуризацию. Кропотливо по байтикам на весь размер структуры выставлять комментарий и правильный тип данных - не все типы данных могут подцепиться и при экспериментах с изменением значений могут быть глюки в игре или даже вылеты. После того как вся структура изучена, можно сделать множество читов, которых нет ни в одном трейнере, если их еще не сделали.
-
у меня такой вопрос если можно сделать большой бряк на всю структуры, можно ли найти адрес от патронов в обойме на таймер выстрела(на этом адресе можно сделать скорострельный огонь) Я когда делаю rapid fire от адреса патронов всю структуру ручками просматриваю муторно, иногда этот адрес далеко лежит. И так что мы знаем? Мы знаем что адрес таймера на выстрел во первых лежит в одной структуре с патронами, во вторых адрес в начале меняется в момент выстрела одновременно с уменьшением патронов и в пределах от одной до 100 миллисекунд возвращается в прежнее значение. может lua скрипт специальный можно сделать?
-
Пользователь @Pitronic написал в Сделать большой брейкпоинт на структуру через dbk_useKernelmodeOpenProcess:
Мы знаем что адрес таймера на выстрел во первых лежит в одной структуре с патронами, во вторых адрес в начале меняется в момент выстрела одновременно с уменьшением патронов и в пределах от одной до 100 миллисекунд возвращается в прежнее значение. может lua скрипт специальный можно сделать?
Я бы сделал без скриптов.
- делаешь dessect structure
- Далее как обычно. Создаешь структуру. Затем вот это (следить за изменениями)
- ну а дальше воспроизводишь свой выстрел
- потом создаешь структуру из изменившихся данных (потому что их будешь очень много наверняка)
- затем делаешь lock на структуру, чтобы значения зафиксирвать
- затем рядом создаешь второй ряд по ctrl +a и смотрим изменения в реальном времени (игра должна быть в оконном режим, чтобы мы видели как цифры скачут)
- чтобы увидеть изменения менее 100мс нужно поставить интервал меньше
По идее это должно сработать
- делаешь dessect structure