MasterGH Опубликовано 23 мая, 2015 Поделиться Опубликовано 23 мая, 2015 Скрипт нужен для поиска call-ов, которые срабатывают или не срабатывают при действиях в игре. Call-ы, которые не срабатывают остаются в окне брейкпоинтов, которое можно найти из меню окна дизассемблера. Call-ы, которые сработали остаются в логах с меткой времени. Т.е. можно увидеть какие были удалены сопоставляя с тем, что делаем в игре. Set break point 0041CE45 - E8 3CB20033 - call 33428086Set break point 0041CE6C - E8 7F8C5400 - call 00965AF0Set break point 0041CEA0 - E8 EBA35400 - call 00967290Set break point 0041CED2 - FF D2 - call edxSet break point 0041CEDB - E8 90F9FFFF - call 0041C870Set break point 0041CEEE - E8 7D350000 - call 00420470Set break point 0041CF04 - E8 77350000 - call 00420480Set break point 0041CF19 - E8 722D0000 - call 0041FC90Set break point 0041CF4C - FF D0 - call eaxSet break point 0041CF84 - E8 37F9FFFF - call 0041C8C0Set break point 0041CFBD - E8 AE340000 - call 00420470Set break point 0041CFD3 - E8 A8340000 - call 00420480Set break point 0041CFEB - E8 802F0000 - call 0041FF70Set break point 0041D004 - E8 67340000 - call 00420470Set break point 0041D015 - E8 66340000 - call 00420480Set break point 0041D02D - E8 FE2E0000 - call 0041FF30Set break point 0041D04C - E8 1F340000 - call 00420470Set break point 0041D063 - E8 18340000 - call 00420480Set break point 0041D07B - E8 302F0000 - call 0041FFB0Set break point 0041D09C - E8 5FFDFFFF - call 0041CE00Set break point 0041D0AC - FF D2 - call edxSet break point 0041D0CD - FF D2 - call edxSet break point 0041D10C - E8 EFFCFFFF - call 0041CE00Set break point 0041D120 - FF D0 - call eaxSet break point 0041D13E - FF D0 - call eaxSet break point 0041D17F - E8 7CFCFFFF - call 0041CE00Set break point 0041D193 - FF D0 - call eaxSet break point 0041D1B1 - FF D0 - call eaxSet break point 0041D1F2 - E8 09FCFFFF - call 0041CE00Set break point 0041D206 - FF D0 - call eaxSet break point 0041D224 - FF D0 - call eaxSet break point 0041D265 - E8 96FBFFFF - call 0041CE00Set break point 0041D279 - FF D0 - call eaxSet break point 0041D294 - FF D0 - call eaxSet break point 0041D2D5 - E8 26FBFFFF - call 0041CE00Set break point 0041D2E9 - FF D0 - call eaxSet break point 0041D304 - FF D0 - call eaxSet break point 0041D39C - E8 BF665500 - call 00973A60Set break point 0041D3AA - FF D0 - call eaxSet break point 0041D3B7 - E8 A4665500 - call 00973A60Set break point 0041D3C5 - FF D2 - call edxSet break point 0041D3D7 - E8 F49E5400 - call 009672D0Set break point 0041D3F5 - E8 56A6FEFF - call 00407A50Set break point 0041D3FC - E8 6FB90000 - call 00428D70Set break point 0041D40B - E8 C09E5400 - call 009672D0Set break point 0041D415 - E8 EB116A11 - call 11ABE605Set break point 0041D41A - E8 B19E5400 - call 009672D0Set break point 0041D424 - E8 EB02D9EE - call EF1AD714Set break point 0041D448 - E8 03A6FEFF - call 00407A50Set break point 0041D44F - E8 1CB90000 - call 00428D70Set break point 0041D45E - E8 6D9E5400 - call 009672D0Set break point 0041D468 - E8 EB116A12 - call 12ABE658Set break point 0041D46D - E8 5E9E5400 - call 009672D0Set break point 0041D477 - E8 EB02D9EE - call EF1AD767Set break point 0041D49D - E8 4E865400 - call 00965AF0Set break point 0041D4A4 - E8 87875400 - call 00965C30Set break point 0041D4B5 - E8 969C4900 - call 008B7150Set break point 0041D4D8 - E8 13865400 - call 00965AF0Set break point 0041D4DF - E8 4C875400 - call 00965C30Set break point 0041D4F2 - E8 599C4900 - call 008B7150Set break point 0041D511 - E8 DA855400 - call 00965AF0Set break point 0041D518 - E8 13875400 - call 00965C30Set break point 0041D529 - E8 229C4900 - call 008B7150Set break point 0041D548 - E8 A3855400 - call 00965AF0Set break point 0041D54F - E8 DC865400 - call 00965C30Set break point 0041D562 - E8 E99B4900 - call 008B7150Set break point 0041D589 - FF D0 - call eaxSet break point 0041D5B1 - FF D0 - call eaxSet break point 0041D5C1 - E8 0F000000 - call 0041D5D5Set break point 0041D5CD - E8 6E07FFFF - call 0040DD40Set break point 0041D5DD - E8 1E0D0100 - call 0042E300Set break point 0041D5E4 - E8 97100100 - call 0042E680Set break point 0041D5F8 - E8 720C8B55 - call 55CCE26FSet break point 0041D5FF - E8 10625500 - call 00973814Set break point 0041D61B - E8 0F000000 - call 0041D62FSet break point 0041D627 - E8 1407FFFF - call 0040DD40Set break point 0041D637 - E8 C40C0100 - call 0042E300Set break point 0041D63E - E8 BD140100 - call 0042EB00Set break point 0041D645 - E8 0F82D300 - call 01155859Set break point 0041D685 - FF D2 - call edxSet break point 0041D693 - E8 0F000000 - call 0041D6A7Set break point 0041D69F - E8 9C06FFFF - call 0040DD40Set break point 0041D6AF - E8 4C0C0100 - call 0042E300Set break point 0041D6B6 - E8 C50F0100 - call 0042E680Set break point 0041D6C7 - E8 720C8B4D - call 4DCCE33ESet break point 0041D6CE - E8 41615500 - call 00973814Set break point 0041D6F2 - E8 4906FFFF - call 0040DD40Set break point 0041D702 - E8 F90B0100 - call 0042E300Set break point 0041D709 - E8 E20F0100 - call 0042E6F0Set break point 0041D717 - E8 F8605500 - call 00973814Set break point 0041D732 - E8 0F625500 - call 00973946Remove Break Point 0041CE6C - E8 7F8C5400 - call 00965AF0 at 962.07 secRemove Break Point 0041CEA0 - E8 EBA35400 - call 00967290 at 964.88 secRemove Break Point 0041CEEE - E8 7D350000 - call 00420470 at 964.92 secRemove Break Point 0041CF04 - E8 77350000 - call 00420480 at 964.95 secRemove Break Point 0041CF19 - E8 722D0000 - call 0041FC90 at 964.99 secRemove Break Point 0041CF4C - FF D0 - call eax at 965.02 secRemove Break Point 0041D09C - E8 5FFDFFFF - call 0041CE00 at 965.06 secRemove Break Point 0041D0AC - FF D2 - call edx at 965.09 secRemove Break Point 0041D10C - E8 EFFCFFFF - call 0041CE00 at 965.13 secRemove Break Point 0041D120 - FF D0 - call eax at 965.16 secRemove Break Point 0041D17F - E8 7CFCFFFF - call 0041CE00 at 965.19 secRemove Break Point 0041D193 - FF D0 - call eax at 965.22 secRemove Break Point 0041D1F2 - E8 09FCFFFF - call 0041CE00 at 965.26 secRemove Break Point 0041D206 - FF D0 - call eax at 965.29 secRemove Break Point 0041D265 - E8 96FBFFFF - call 0041CE00 at 965.32 secRemove Break Point 0041D279 - FF D0 - call eax at 965.35 secRemove Break Point 0041D2D5 - E8 26FBFFFF - call 0041CE00 at 965.38 secRemove Break Point 0041D2E9 - FF D0 - call eax at 965.41 secRemove Break Point 0041D39C - E8 BF665500 - call 00973A60 at 965.45 secRemove Break Point 0041D3AA - FF D0 - call eax at 965.48 secRemove Break Point 0041D3B7 - E8 A4665500 - call 00973A60 at 965.51 secRemove Break Point 0041D3C5 - FF D2 - call edx at 965.54 secRemove Break Point 0041D3D7 - E8 F49E5400 - call 009672D0 at 965.58 secRemove Break Point 0041D3F5 - E8 56A6FEFF - call 00407A50 at 965.61 secRemove Break Point 0041D3FC - E8 6FB90000 - call 00428D70 at 965.63 secRemove Break Point 0041D41A - E8 B19E5400 - call 009672D0 at 965.66 secRemove Break Point 0041D448 - E8 03A6FEFF - call 00407A50 at 965.69 secRemove Break Point 0041D44F - E8 1CB90000 - call 00428D70 at 965.72 secRemove Break Point 0041D46D - E8 5E9E5400 - call 009672D0 at 965.75 secRemove Break Point 0041D49D - E8 4E865400 - call 00965AF0 at 965.78 secRemove Break Point 0041D4A4 - E8 87875400 - call 00965C30 at 965.81 secRemove Break Point 0041D4B5 - E8 969C4900 - call 008B7150 at 965.83 secRemove Break Point 0041D4D8 - E8 13865400 - call 00965AF0 at 965.86 secRemove Break Point 0041D4DF - E8 4C875400 - call 00965C30 at 965.89 secRemove Break Point 0041D4F2 - E8 599C4900 - call 008B7150 at 965.91 secRemove Break Point 0041D511 - E8 DA855400 - call 00965AF0 at 965.94 secRemove Break Point 0041D518 - E8 13875400 - call 00965C30 at 965.97 secRemove Break Point 0041D529 - E8 229C4900 - call 008B7150 at 965.99 secRemove Break Point 0041D548 - E8 A3855400 - call 00965AF0 at 966.02 secRemove Break Point 0041D54F - E8 DC865400 - call 00965C30 at 966.04 secRemove Break Point 0041D562 - E8 E99B4900 - call 008B7150 at 966.07 secRemove Break Point 0041D589 - FF D0 - call eax at 966.10 secRemove Break Point 0041D732 - E8 0F625500 - call 00973946 at 966.12 secRemove Break Point 0041CF84 - E8 37F9FFFF - call 0041C8C0 at 967.17 secRemove Break Point 0041CFBD - E8 AE340000 - call 00420470 at 967.20 secRemove Break Point 0041CFD3 - E8 A8340000 - call 00420480 at 967.23 secRemove Break Point 0041CFEB - E8 802F0000 - call 0041FF70 at 967.25 secRemove Break Point 0041D004 - E8 67340000 - call 00420470 at 967.28 secRemove Break Point 0041D015 - E8 66340000 - call 00420480 at 967.30 secRemove Break Point 0041D02D - E8 FE2E0000 - call 0041FF30 at 967.33 secRemove Break Point 0041D04C - E8 1F340000 - call 00420470 at 968.70 secRemove Break Point 0041D063 - E8 18340000 - call 00420480 at 968.73 secRemove Break Point 0041D07B - E8 302F0000 - call 0041FFB0 at 968.76 secRemove Break Point 0041CED2 - FF D2 - call edx at 972.26 secRemove 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 secRemove 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 24 мая, 2015 Поделиться Опубликовано 24 мая, 2015 (изменено) Надо попробовать в Майями так сделать - там как раз через call жизни нупятся.. Изменено 24 мая, 2015 пользователем LIRW Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 24 мая, 2015 Автор Поделиться Опубликовано 24 мая, 2015 Маями поковыриваю в том числе и этим скриптом. Как будет результат, то напишу в соответствующую тему. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения