Перейти к содержанию

Узнаем несрабатываемые call-ы на участке кода


Рекомендуемые сообщения

Скрипт нужен для поиска call-ов, которые срабатывают или не срабатывают при действиях в игре.

 

Call-ы, которые не срабатывают остаются в окне брейкпоинтов, которое можно найти из меню окна дизассемблера.

 

Call-ы, которые сработали остаются в логах с меткой времени. Т.е. можно увидеть какие были удалены сопоставляя с тем, что делаем в игре.

 

 

Set break point 0041CE45 - E8 3CB20033 - call 33428086

Set break point 0041CE6C - E8 7F8C5400 - call 00965AF0

Set break point 0041CEA0 - E8 EBA35400 - call 00967290

Set break point 0041CED2 - FF D2 - call edx

Set break point 0041CEDB - E8 90F9FFFF - call 0041C870

Set break point 0041CEEE - E8 7D350000 - call 00420470

Set break point 0041CF04 - E8 77350000 - call 00420480

Set break point 0041CF19 - E8 722D0000 - call 0041FC90

Set break point 0041CF4C - FF D0 - call eax

Set break point 0041CF84 - E8 37F9FFFF - call 0041C8C0

Set break point 0041CFBD - E8 AE340000 - call 00420470

Set break point 0041CFD3 - E8 A8340000 - call 00420480

Set break point 0041CFEB - E8 802F0000 - call 0041FF70

Set break point 0041D004 - E8 67340000 - call 00420470

Set break point 0041D015 - E8 66340000 - call 00420480

Set break point 0041D02D - E8 FE2E0000 - call 0041FF30

Set break point 0041D04C - E8 1F340000 - call 00420470

Set break point 0041D063 - E8 18340000 - call 00420480

Set break point 0041D07B - E8 302F0000 - call 0041FFB0

Set break point 0041D09C - E8 5FFDFFFF - call 0041CE00

Set break point 0041D0AC - FF D2 - call edx

Set break point 0041D0CD - FF D2 - call edx

Set break point 0041D10C - E8 EFFCFFFF - call 0041CE00

Set break point 0041D120 - FF D0 - call eax

Set break point 0041D13E - FF D0 - call eax

Set break point 0041D17F - E8 7CFCFFFF - call 0041CE00

Set break point 0041D193 - FF D0 - call eax

Set break point 0041D1B1 - FF D0 - call eax

Set break point 0041D1F2 - E8 09FCFFFF - call 0041CE00

Set break point 0041D206 - FF D0 - call eax

Set break point 0041D224 - FF D0 - call eax

Set break point 0041D265 - E8 96FBFFFF - call 0041CE00

Set break point 0041D279 - FF D0 - call eax

Set break point 0041D294 - FF D0 - call eax

Set break point 0041D2D5 - E8 26FBFFFF - call 0041CE00

Set break point 0041D2E9 - FF D0 - call eax

Set break point 0041D304 - FF D0 - call eax

Set break point 0041D39C - E8 BF665500 - call 00973A60

Set break point 0041D3AA - FF D0 - call eax

Set break point 0041D3B7 - E8 A4665500 - call 00973A60

Set break point 0041D3C5 - FF D2 - call edx

Set break point 0041D3D7 - E8 F49E5400 - call 009672D0

Set break point 0041D3F5 - E8 56A6FEFF - call 00407A50

Set break point 0041D3FC - E8 6FB90000 - call 00428D70

Set break point 0041D40B - E8 C09E5400 - call 009672D0

Set break point 0041D415 - E8 EB116A11 - call 11ABE605

Set break point 0041D41A - E8 B19E5400 - call 009672D0

Set break point 0041D424 - E8 EB02D9EE - call EF1AD714

Set break point 0041D448 - E8 03A6FEFF - call 00407A50

Set break point 0041D44F - E8 1CB90000 - call 00428D70

Set break point 0041D45E - E8 6D9E5400 - call 009672D0

Set break point 0041D468 - E8 EB116A12 - call 12ABE658

Set break point 0041D46D - E8 5E9E5400 - call 009672D0

Set break point 0041D477 - E8 EB02D9EE - call EF1AD767

Set break point 0041D49D - E8 4E865400 - call 00965AF0

Set break point 0041D4A4 - E8 87875400 - call 00965C30

Set break point 0041D4B5 - E8 969C4900 - call 008B7150

Set break point 0041D4D8 - E8 13865400 - call 00965AF0

Set break point 0041D4DF - E8 4C875400 - call 00965C30

Set break point 0041D4F2 - E8 599C4900 - call 008B7150

Set break point 0041D511 - E8 DA855400 - call 00965AF0

Set break point 0041D518 - E8 13875400 - call 00965C30

Set break point 0041D529 - E8 229C4900 - call 008B7150

Set break point 0041D548 - E8 A3855400 - call 00965AF0

Set break point 0041D54F - E8 DC865400 - call 00965C30

Set break point 0041D562 - E8 E99B4900 - call 008B7150

Set break point 0041D589 - FF D0 - call eax

Set break point 0041D5B1 - FF D0 - call eax

Set break point 0041D5C1 - E8 0F000000 - call 0041D5D5

Set break point 0041D5CD - E8 6E07FFFF - call 0040DD40

Set break point 0041D5DD - E8 1E0D0100 - call 0042E300

Set break point 0041D5E4 - E8 97100100 - call 0042E680

Set break point 0041D5F8 - E8 720C8B55 - call 55CCE26F

Set break point 0041D5FF - E8 10625500 - call 00973814

Set break point 0041D61B - E8 0F000000 - call 0041D62F

Set break point 0041D627 - E8 1407FFFF - call 0040DD40

Set break point 0041D637 - E8 C40C0100 - call 0042E300

Set break point 0041D63E - E8 BD140100 - call 0042EB00

Set break point 0041D645 - E8 0F82D300 - call 01155859

Set break point 0041D685 - FF D2 - call edx

Set break point 0041D693 - E8 0F000000 - call 0041D6A7

Set break point 0041D69F - E8 9C06FFFF - call 0040DD40

Set break point 0041D6AF - E8 4C0C0100 - call 0042E300

Set break point 0041D6B6 - E8 C50F0100 - call 0042E680

Set break point 0041D6C7 - E8 720C8B4D - call 4DCCE33E

Set break point 0041D6CE - E8 41615500 - call 00973814

Set break point 0041D6F2 - E8 4906FFFF - call 0040DD40

Set break point 0041D702 - E8 F90B0100 - call 0042E300

Set break point 0041D709 - E8 E20F0100 - call 0042E6F0

Set break point 0041D717 - E8 F8605500 - call 00973814

Set break point 0041D732 - E8 0F625500 - call 00973946

Remove Break Point 0041CE6C - E8 7F8C5400 - call 00965AF0 at 962.07 sec

Remove Break Point 0041CEA0 - E8 EBA35400 - call 00967290 at 964.88 sec

Remove Break Point 0041CEEE - E8 7D350000 - call 00420470 at 964.92 sec

Remove Break Point 0041CF04 - E8 77350000 - call 00420480 at 964.95 sec

Remove Break Point 0041CF19 - E8 722D0000 - call 0041FC90 at 964.99 sec

Remove Break Point 0041CF4C - FF D0 - call eax at 965.02 sec

Remove Break Point 0041D09C - E8 5FFDFFFF - call 0041CE00 at 965.06 sec

Remove Break Point 0041D0AC - FF D2 - call edx at 965.09 sec

Remove Break Point 0041D10C - E8 EFFCFFFF - call 0041CE00 at 965.13 sec

Remove Break Point 0041D120 - FF D0 - call eax at 965.16 sec

Remove Break Point 0041D17F - E8 7CFCFFFF - call 0041CE00 at 965.19 sec

Remove Break Point 0041D193 - FF D0 - call eax at 965.22 sec

Remove Break Point 0041D1F2 - E8 09FCFFFF - call 0041CE00 at 965.26 sec

Remove Break Point 0041D206 - FF D0 - call eax at 965.29 sec

Remove Break Point 0041D265 - E8 96FBFFFF - call 0041CE00 at 965.32 sec

Remove Break Point 0041D279 - FF D0 - call eax at 965.35 sec

Remove Break Point 0041D2D5 - E8 26FBFFFF - call 0041CE00 at 965.38 sec

Remove Break Point 0041D2E9 - FF D0 - call eax at 965.41 sec

Remove Break Point 0041D39C - E8 BF665500 - call 00973A60 at 965.45 sec

Remove Break Point 0041D3AA - FF D0 - call eax at 965.48 sec

Remove Break Point 0041D3B7 - E8 A4665500 - call 00973A60 at 965.51 sec

Remove Break Point 0041D3C5 - FF D2 - call edx at 965.54 sec

Remove Break Point 0041D3D7 - E8 F49E5400 - call 009672D0 at 965.58 sec

Remove Break Point 0041D3F5 - E8 56A6FEFF - call 00407A50 at 965.61 sec

Remove Break Point 0041D3FC - E8 6FB90000 - call 00428D70 at 965.63 sec

Remove Break Point 0041D41A - E8 B19E5400 - call 009672D0 at 965.66 sec

Remove Break Point 0041D448 - E8 03A6FEFF - call 00407A50 at 965.69 sec

Remove Break Point 0041D44F - E8 1CB90000 - call 00428D70 at 965.72 sec

Remove Break Point 0041D46D - E8 5E9E5400 - call 009672D0 at 965.75 sec

Remove Break Point 0041D49D - E8 4E865400 - call 00965AF0 at 965.78 sec

Remove Break Point 0041D4A4 - E8 87875400 - call 00965C30 at 965.81 sec

Remove Break Point 0041D4B5 - E8 969C4900 - call 008B7150 at 965.83 sec

Remove Break Point 0041D4D8 - E8 13865400 - call 00965AF0 at 965.86 sec

Remove Break Point 0041D4DF - E8 4C875400 - call 00965C30 at 965.89 sec

Remove Break Point 0041D4F2 - E8 599C4900 - call 008B7150 at 965.91 sec

Remove Break Point 0041D511 - E8 DA855400 - call 00965AF0 at 965.94 sec

Remove Break Point 0041D518 - E8 13875400 - call 00965C30 at 965.97 sec

Remove Break Point 0041D529 - E8 229C4900 - call 008B7150 at 965.99 sec

Remove Break Point 0041D548 - E8 A3855400 - call 00965AF0 at 966.02 sec

Remove Break Point 0041D54F - E8 DC865400 - call 00965C30 at 966.04 sec

Remove Break Point 0041D562 - E8 E99B4900 - call 008B7150 at 966.07 sec

Remove Break Point 0041D589 - FF D0 - call eax at 966.10 sec

Remove Break Point 0041D732 - E8 0F625500 - call 00973946 at 966.12 sec

Remove Break Point 0041CF84 - E8 37F9FFFF - call 0041C8C0 at 967.17 sec

Remove Break Point 0041CFBD - E8 AE340000 - call 00420470 at 967.20 sec

Remove Break Point 0041CFD3 - E8 A8340000 - call 00420480 at 967.23 sec

Remove Break Point 0041CFEB - E8 802F0000 - call 0041FF70 at 967.25 sec

Remove Break Point 0041D004 - E8 67340000 - call 00420470 at 967.28 sec

Remove Break Point 0041D015 - E8 66340000 - call 00420480 at 967.30 sec

Remove Break Point 0041D02D - E8 FE2E0000 - call 0041FF30 at 967.33 sec

Remove Break Point 0041D04C - E8 1F340000 - call 00420470 at 968.70 sec

Remove Break Point 0041D063 - E8 18340000 - call 00420480 at 968.73 sec

Remove Break Point 0041D07B - E8 302F0000 - call 0041FFB0 at 968.76 sec

Remove Break Point 0041CED2 - FF D2 - call edx at 972.26 sec

Remove Break Point 0041CEDB - E8 90F9FFFF - call 0041C870 at 972.29 sec

 

Интересно, что когда я нажимаю отдельные кнопки, то отдельные call-ы срабатывают (т.е. я вижу в логах удаление брейкпоинтов).

 

После того как мы увидели, что сработал call, то мы можем исследовать условие, которое вызывает этот call. 

 

Например, когда я нажал и отпустил пробел, то сработали функции и с них были сняты бряки

Remove Break Point 0041CED2 - FF D2 - call edx at 972.26 sec

Remove Break Point 0041CEDB - E8 90F9FFFF - call 0041C870 at 972.29 sec

 

 

Мы можем исправлять условия на обратные или делать безусловные прыжки и смотреть, что происходит в игре. Так например исправим jne 0041CEE0 на jmp 0041CEE0 и посмотреть, что произойдет в игре. В моем случае нажатие на пробел перестало получаться. Наша же задача например сделать так чтобы враг не мог стрелять вызывая call, или он не мог двигаться, или еще что-то. Или же наша задача найти функции, которые вызываются по горячим клавишам, тогда вполне возможно их проще вызывать своим потоком (подбирать вещи, которых например не существует...). Все это теория, на практике у меня ничего нету показать.

Как получать начальный и конечный адрес?

У меня был пример

Я поставил брекпоинт на адрес патронов

Взял любую инструкцию на запись

Поставил условный бряк на инструкции, чтобы она прервалась на адресе патронов

Сделал выстрел и прервался

В дизассемблере выделил нижнюю инструкцию и поставил трейслог с не захождением в call на 10 тыс инструкций с условием что на EIP == адрес нижней инструкции, нужно остановить лог

Отпустил процесс по F9 и пошло логирование из глубины кода вверх, остановилось

Я получил ветвь кода из вложенных call-ов

Захожу в дизасемблер на каждый участок и активирую опцию "выделить функцию" (точно не помню как она называется)

Затем я её копирую в блокнот через буфер обмена(CTRL+C) и в нем беру верхний адрес и нижний. В моем примере это 0x0041CE30 и 0x0041D73A

Затем запускаю Луа консоль и пишу код выше.

В игре делаю огромное количество действий кроме выстрелов и вижу как сниамются бряки

Затем жду какое-то время чтобы таймер визуально был больше в логах

Затем я наконец стреляю и вижу с каких инстуркций удалились бряки. Вот они и связаны с выстрелами.

 

Пока все

-- boolean isPluginMode 				- работает плагин-- boolean isModeRemoveHitBreakPoints	- устанавливает режим, при котором срабатавыающие брейкпоинты тут же снимаютсяisPluginMode = trueisModeRemoveHitBreakPoints = true-- Функция устанавливает брейкпоинты на call-ы -- num beginAddress начальный адрес-- num endAddress конечный адресfunction SetBreakPointsToCalls(beginAddress, endAddress)    currentAddress = beginAddress	disassembler = getDefaultDisassembler()    while currentAddress < endAddress do		line = disassembler.disassemble(currentAddress)        local data = disassembler.getLastDisassembleData()        if(data["isCall"]) then			print('Set break point '..line)			debug_setBreakpoint(data["address"], 1, bptExecute)        end        currentAddress = currentAddress + getInstructionSize(address)    endendfunction debugger_onBreakpoint()	if(isPluginMode) then		if(isModeRemoveHitBreakPoints) then			if(targetIs64Bit()) then 				debug_removeBreakpoint(RIP)				print(string.format("Remove Break Point %s at %.2f sec", disassemble(RIP), os.clock()))			else 				debug_removeBreakpoint(EIP)				print(string.format("Remove Break Point %s at %.2f sec", disassemble(EIP), os.clock()))			end		end		return 1 -- не показывать дизассемблер	end	return 0end-- Пример--SetBreakPointsToCalls(0x0041CE30, 0x0041D73A)
0041CEA8 - 8B 1A                 - mov ebx,[edx]0041CEAA - 8A 4E 9F              - mov cl,[esi-61]0041CEAD - 88 46 9F              - mov [esi-61],al0041CEB0 - C6 06 00              - mov byte ptr [esi],000041CEB3 - 84 C0                 - test al,al0041CEB5 - 0F84 C1000000         - je 0041CF7C0041CEBB - 84 C9                 - test cl,cl0041CEBD - 75 21                 - jne 0041CEE0 // Перепрыгивает инструкцию 0041CED20041CEBF - 8B 0D B452F700        - mov ecx,[00F752B4] : [03758390]0041CEC5 - 8B 01                 - mov eax,[ecx]0041CEC7 - 8B 90 A8000000        - mov edx,[eax+000000A8]0041CECD - 53                    - push ebx0041CECE - C6 45 A3 01           - mov byte ptr [ebp-5D],010041CED2 - FF D2                 - call edx0041CED4 - 8B 4D B4              - mov ecx,[ebp-4C]0041CED7 - 53                    - push ebx0041CED8 - C6 06 01              - mov byte ptr [esi],010041CEDB - E8 90F9FFFF           - call 0041C8700041CEE0 - A1 7864B200           - mov eax,[00B26478] : [00B26570]0041CEE5 - 8B 88 A8030000        - mov ecx,[eax+000003A8]0041CEEB - 89 4D 88              - mov [ebp-78],ecx
-- Пример--SetBreakPointsToCalls(0x0041CE30, 0x0041D73A)
  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.