Garik66 Опубликовано 5 августа, 2018 Поделиться Опубликовано 5 августа, 2018 Скрипт: Спойлер { Game : unepic.exe Version: 1.0 Date : 08-05-18 Author : Garik66 Version CE: 6.5 Make by aamaker Lua plagin Version 2.4.0.G66.1 :) [EN] Technical support: http://forum.cheatengine.org/viewtopic.php?p=5645967 [RU] Техническая поддержка: https://forum.gamehacklab.ru/index.php?/topic/1415-plugin-aa-maker-создание-аа-скриптов } [ENABLE] aobscan(Test,8bxxxxxxxxxx33xxxxxx33xxxxxx3b) alloc(newmem,$1000,unepic.exe+2D455) label(code) registersymbol(code) label(return) registersymbol(Test) newmem: mov edx,[code+2] mov [edx],deaddead code: readmem(Test,6) jmp return Test: jmp newmem nop return: [DISABLE] Test: readmem(code,6) unregistersymbol(code) unregistersymbol(Test) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: unepic.exe+2D455 unepic.exe+2D447: CC - int 3 unepic.exe+2D448: CC - int 3 unepic.exe+2D449: CC - int 3 unepic.exe+2D44A: CC - int 3 unepic.exe+2D44B: CC - int 3 unepic.exe+2D44C: CC - int 3 unepic.exe+2D44D: CC - int 3 unepic.exe+2D44E: CC - int 3 unepic.exe+2D44F: CC - int 3 unepic.exe+2D450: A1 848C6800 - mov eax,[00688C84] // ---------- INJECTING HERE ----------- unepic.exe+2D455: 8B 15 888C6800 - mov edx,[00688C88] // ---------- DONE INJECTING ---------- unepic.exe+2D45B: 33 44 24 04 - xor eax,[esp+04] unepic.exe+2D45F: 33 54 24 08 - xor edx,[esp+08] unepic.exe+2D463: 3B C2 - cmp eax,edx unepic.exe+2D465: 74 0A - je 0042D471 unepic.exe+2D467: C7 81 180D0000 01000000 - mov [ecx+00000D18],00000001 unepic.exe+2D471: C2 0800 - ret 0008 unepic.exe+2D474: CC - int 3 unepic.exe+2D475: CC - int 3 unepic.exe+2D476: CC - int 3 unepic.exe+2D477: CC - int 3 } Видео: 1 3 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 5 августа, 2018 Поделиться Опубликовано 5 августа, 2018 Урок из разряда "как из сигнатуры, сделать проблемы для новичков" Такие сигнатуры ужасны из-за того, что уникальность сигнатуры зависит от её длинны, т.е на том же юнити, SigMaker'у достаточно 10-20 байт, чтобы сигнатура работала долгое время(7+ месяцев), способом который показан на видео её придется раза в 3-4 удлинять, такой способ будет годным, если будет какой-нибудь плагин, который бы в цикле создавал сигнатуру и проверял её уникальность по всему модулю игры, пока она 100% не будет уникальной. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 6 августа, 2018 Автор Поделиться Опубликовано 6 августа, 2018 5 часов назад, partoftheworlD сказал: Урок из разряда "как из сигнатуры, сделать проблемы для новичков" Спасибо за оценку. Я показал способ (сомневаюсь, что новички его знают). Моя Табличка для мода для Дьябло (The Hell) проработала 3 года ( по моему). работает и сейчас (разработчики перестали над ним работать). Сигнатуры там делал вручную. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 7 августа, 2018 Поделиться Опубликовано 7 августа, 2018 Видео-то не плохое, хорошее. Все подробно изложено и работает. Что можно улучшить до идеала. Попробовать кому-нибудь аналитику прикрутить с проверкой нашлась сигнатура или нет. Результат попробовать отправлять в сервис аналитики. Возможно Firebase или что-то похожее 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 28 марта, 2019 Поделиться Опубликовано 28 марта, 2019 объясни пожалуйтса как сделать в скрипте через readmem когда инструкция типа mov eax, [game.exe+1234] когда изменяеться версия игры то допустим инструкция меняеться на mov eax, [game.exe+5678] как написать в скрипте что бы он мог дальше работать когда меняеться game.exe+ ? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 28 марта, 2019 Поделиться Опубликовано 28 марта, 2019 1 час назад, Alex2411 сказал: как написать в скрипте что бы он Для сигнатуры просто делаешь маску, типа 8B ? ? ? ?, главное чтобы она была уникальной. Дальше высчитываешь смещение от начала сигнатуры, до [game.exe+1234] и получаешь 4 байта указывающие на [game.exe+1234] Вот для примера. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 29 марта, 2019 Автор Поделиться Опубликовано 29 марта, 2019 12 часов назад, Alex2411 сказал: как написать в скрипте Скрин: Спойлер Скрипт: Спойлер { Game : Tutorial-i386.exe Version: Date : 2019-03-29 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(INJECT,Tutorial-i386.exe,A1 E0 15 60 00 E8 CB) // should be unique alloc(newmem,$1000) label(code) registersymbol(code) label(return) label(Value) registersymbol(Value) registersymbol(INJECT) newmem: code: readmem(INJECT,5) //mov eax,[Tutorial-i386.exe+2015E0] jmp return Value: dd 0 INJECT: jmp newmem return: [DISABLE] INJECT: readmem(code,5) // db A1 E0 15 60 00 unregistersymbol(Value) unregistersymbol(code) unregistersymbol(INJECT) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+240DB "Tutorial-i386.exe"+240AF: 00 53 56 - add [ebx+56],dl "Tutorial-i386.exe"+240B2: 89 C6 - mov esi,eax "Tutorial-i386.exe"+240B4: E8 F7 63 FF FF - call Tutorial-i386.exe+1A4B0 "Tutorial-i386.exe"+240B9: 89 F1 - mov ecx,esi "Tutorial-i386.exe"+240BB: B8 0C 4B 5A 00 - mov eax,Tutorial-i386.exe+1A4B0C "Tutorial-i386.exe"+240C0: BA 01 00 00 00 - mov edx,00000001 "Tutorial-i386.exe"+240C5: BB 0C 4B 5A 00 - mov ebx,Tutorial-i386.exe+1A4B0C "Tutorial-i386.exe"+240CA: FF 93 C4 00 00 00 - call dword ptr [ebx+000000C4] "Tutorial-i386.exe"+240D0: A3 E0 15 60 00 - mov [Tutorial-i386.exe+2015E0],eax "Tutorial-i386.exe"+240D5: 8B 96 3C 02 00 00 - mov edx,[esi+0000023C] // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+240DB: A1 E0 15 60 00 - mov eax,[Tutorial-i386.exe+2015E0] // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+240E0: E8 CB EE 06 00 - call Tutorial-i386.exe+92FB0 "Tutorial-i386.exe"+240E5: 8B 96 E8 00 00 00 - mov edx,[esi+000000E8] "Tutorial-i386.exe"+240EB: A1 E0 15 60 00 - mov eax,[Tutorial-i386.exe+2015E0] "Tutorial-i386.exe"+240F0: E8 4B F1 06 00 - call Tutorial-i386.exe+93240 "Tutorial-i386.exe"+240F5: 8B 96 28 01 00 00 - mov edx,[esi+00000128] "Tutorial-i386.exe"+240FB: A1 E0 15 60 00 - mov eax,[Tutorial-i386.exe+2015E0] "Tutorial-i386.exe"+24100: E8 AB ED 06 00 - call Tutorial-i386.exe+92EB0 "Tutorial-i386.exe"+24105: 8B 96 30 02 00 00 - mov edx,[esi+00000230] "Tutorial-i386.exe"+2410B: A1 E0 15 60 00 - mov eax,[Tutorial-i386.exe+2015E0] "Tutorial-i386.exe"+24110: E8 1B EE 06 00 - call Tutorial-i386.exe+92F30 } Скрин2: Спойлер Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 29 марта, 2019 Поделиться Опубликовано 29 марта, 2019 спасибо за ответы , но мне нужно не много другое. наверно я плохо объяснил . извините код игры BattleBrothers.exe+E4EF2 - A1 54D26F00 - mov eax,[BattleBrothers.exe+2FD254] // тут адресс для фильтра BattleBrothers.exe+E4EF7 - F3 0F10 80 00010000 - movss xmm0,[eax+00000100] BattleBrothers.exe+E4EFF - F3 0F10 88 FC000000 - movss xmm1,[eax+000000FC] BattleBrothers.exe+E4F07 - F3 0F5C 46 0C - subss xmm0,[esi+0C] // тут инжект BattleBrothers.exe+E4F0C - F3 0F5C 4E 08 - subss xmm1,[esi+08] ижект скрипта я делаю на инструкцию BattleBrothers.exe+E4F07 . для фильтра в своем скрипте я беру адрес [BattleBrothers.exe+2FD254] из инструкци которая выше. получаеться так subss xmm0,[esi+0C] push ecx mov ecx,[BattleBrothers.exe+2FD254] // адрес фильтра сюда mov ecx,[ecx+100] cmp ecx,[esi+0C] pop ecx jne когда выходят патчи на игру смешение [+2FD254] меняеться и скрипт не работает . в последнем патче адерс поменялся на [BattleBrothers.exe+2FF254] . как сделать что бы скрипт продолжал работать когда смещение меняеться ? пробовал с начала прочитать смещение командой readmem в метку, а потом эту метку ставить в скипт , но что то делал не правильно и скрипт не работает и крашиться . не могу сообразить как сделать . Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 29 марта, 2019 Поделиться Опубликовано 29 марта, 2019 Если сложно пока в одном скрипте все реализовать, то используй глобальные переменные. Первый скрипт, берет [BattleBrothers.exe+2FD254], помещает в глобальную переменную. Второй скрипт использует эту глобальную переменную. ##########Script 1########## globalAlloc(Base, $4) mov eax,[BattleBrothers.exe+2FD254] mov [Base], eax ##########Script 2########## subss xmm0,[esi+0C] push ecx mov ecx,[Base] mov ecx,[ecx+100] cmp ecx,[esi+0C] pop ecx jne Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 29 марта, 2019 Поделиться Опубликовано 29 марта, 2019 39 минут назад, partoftheworlD сказал: Первый скрипт, берет [BattleBrothers.exe+2FD254], помещает в глобальную переменную. это я понимаю , но ведь тогда скрипт перестанет работать когда смещение [+2FD254] измениться ? вместо [BattleBrothers.exe+2FD254] будет [BattleBrothers.exe+2FF254] ? с помощи aob этот адрес не найти . по адресу [BattleBrothers.exe+2FD254] там не код , а разные числа которые использует игра они все время меняються . нужное смещение [+2FD254] или [+2FF254] или другое всегда есть в инструкции BattleBrothers.exe+E4EF2 - A1 54D26F00 - mov eax,[BattleBrothers.exe+2FD254] это смещение меняеться с новым патчем. что бы взять смещение из этой инструкции я пробовал командой readmem прочиать байты смещения 54D26F и подставить в свой скрипт , но запутался . как это правильно сделать ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 29 марта, 2019 Автор Поделиться Опубликовано 29 марта, 2019 47 минут назад, Alex2411 сказал: как это правильно сделать ? сложить 1 + 1. Короче. если затрудняешься кинь сюда два СЕ-ных АА- скрипта с Логами из инструкций 1. 1 час назад, Alex2411 сказал: BattleBrothers.exe+E4EF2 - A1 54D26F00 - mov eax,[BattleBrothers.exe+2FD254] 2. 1 час назад, Alex2411 сказал: BattleBrothers.exe+E4F07 - F3 0F5C 46 0C - subss xmm0,[esi+0C] // тут инжект Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 29 марта, 2019 Поделиться Опубликовано 29 марта, 2019 1 час назад, Alex2411 сказал: с помощи aob этот адрес не найти Почему? У тебя есть сигнатура с маской, маска решает проблему с меняющимися значениями, смещениями, переменными. 33 минуты назад, Garik66 сказал: Короче. если затрудняешься кинь сюда два ИМХО Не стоит, ему надо понять как сигнатуры работают, а это лишь дополнительные проблемы создаст. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 29 марта, 2019 Автор Поделиться Опубликовано 29 марта, 2019 1 час назад, Alex2411 сказал: как это правильно сделать ? Хотя можно и в одном скрипте попробовать. Мне ждать тебя некогда, короче попробуй так (писал на коленке): Спойлер [ENABLE] aobscanmodule(INJECT,BattleBrothers.exe,F3 0F 5C 46 0C) alloc(newmem,$1000) label(code) registersymbol(code) label(return) registersymbol(INJECT) newmem: subss xmm0,[esi+0C] push ecx mov ecx,[code+1] // адрес фильтра сюда mov ecx,[ecx+100] cmp ecx,[esi+0C] pop ecx jne //сюдым что нужно code: readmem(INJECT-15,5) jmp return INJECT: jmp newmem return: [DISABLE] INJECT: subss xmm0,[esi+0C] unregistersymbol(code) unregistersymbol(INJECT) dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 29 марта, 2019 Поделиться Опубликовано 29 марта, 2019 Мне тоже интересно решение. Что если так? Спойлер //Инжект как и задумыалось сделать на subss xmm0,[esi+0C] *********************************** subss xmm0,[esi+0C] push ecx mov ecx,eax // в eax уже адрес фильтра mov ecx,[ecx+100] cmp ecx,[esi+0C] pop ecx jne *********************************** 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 29 марта, 2019 Автор Поделиться Опубликовано 29 марта, 2019 1 минуту назад, Antonshka сказал: в eax уже адрес фильтра Черт....................... точно. Вот оно - когда глаза замылены, не видим очевидного. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 29 марта, 2019 Автор Поделиться Опубликовано 29 марта, 2019 14 минут назад, Antonshka сказал: в eax уже адрес фильтра ЗЫ; так и в movss xmm0,[eax+00000100] xmm0 лежало уже то, с чем сравнивает ТС. Т.е. сравнение можно было и совсем по другому организовать. Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 29 марта, 2019 Поделиться Опубликовано 29 марта, 2019 46 минут назад, partoftheworlD сказал: Почему? У тебя есть сигнатура с маской, маска решает проблему с меняющимися значениями, смещениями, переменными. она есть на саму инструкцию BattleBrothers.exe+E4EF2 - A1 54D26F00 - mov eax,[BattleBrothers.exe+2FD254] на ее адрес BattleBrothers.exe+E4EF2 , а на адрес который в этой инструкции BattleBrothers.exe+2FD254 нет . я понимаю что по маске можно найти даже если меняються смешения , но по адресу [BattleBrothers.exe+2FD254] лежат какие то числовые данные и случайные адреса , а не код . они каждый раз меняються целиком . или я не правильно понимаю как оно работает ? 50 минут назад, Garik66 сказал: попробуй так ага . вот что можно . идея понятна. кажетьс я начинаю понимать почему у меня не получалось . спасибо 22 минуты назад, Antonshka сказал: Что если так? в этой игре и других играх много мест где нужно брать смещение из другого места и там такой способ не пройдет ))))))) еще проблема в том что такая инструкция где нужно брать адрес не известно когда срабатывает по этому инжектом на нее адрес то же не получить . по этому я хотел понять универсаьный способ получить смещение считыванием байт без срабатывания этой инструкции . Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 29 марта, 2019 Поделиться Опубликовано 29 марта, 2019 1 час назад, Alex2411 сказал: а на адрес который в этой инструкции BattleBrothers.exe+2FD254 нет В чем проблема посчитать? В той статье на которую я давал ссылку, есть пример как рассчитать. Если получишь 4 байта (54D26F00) относительный виртуальный адрес, достаточно будет эти 4 байта сложить с началом модуля, чтобы получить адрес указывающий на структуру. И сигнатура будет работать до тех пор, пока не изменится код функции в которой находятся эти инструкции и до тех пор пока этого не случиться у тебя будет работать скрипт. UPD в x86 даже ничего рассчитывать не надо, байты являются абсолютным адресом, достаточно просто получить их. BattleBrothers.exe+E4EF2 - A1 54D26F00 - mov eax,[BattleBrothers.exe+2FD254] BattleBrothers.exe = 0x400000 0x4E4EF2 - A1 54D26F00 - mov eax,[0x6FD254] aob(instr, 'A1 ? ? ? ? ...') ##################################################### #mov eax, instr //instr = 0x4E4EF2 (A1 54D26F00)# #inc eax // eax = 0x4E4EF3 (54D26F00) # #mov eax, [eax] // eax = 0x6FD254 # #mov ecx, [eax+100] // # #cmp ecx, [esi+0C] // # #pop ecx // # ##################################################### Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 29 марта, 2019 Поделиться Опубликовано 29 марта, 2019 разобрался . как вседга оказалось все просто )))) моя ошибка была что я почему то пытался получить смещение и еще с плюсами не много напутал , а надо было просто взять из байт сразу адрес . теперь все работает Спойлер [ENABLE] aobscanmodule(_base,BattleBrothers.exe+E4EF2,a1xxxxxxxxf3xxxxxxxxxxxxxxf3xxxxxxxxxxxxxxf3xxxxxxxxf3) alloc(newmem,4) label(_filter) registersymbol(_filter) registersymbol(_base) newmem: _filter: readmem(_base+1,4) // тут [DISABLE] unregistersymbol(_filter) unregistersymbol(_base) dealloc(newmem) всем спасибо за помошь . век живи век учись ))) Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 29 марта, 2019 Поделиться Опубликовано 29 марта, 2019 10 минут назад, Alex2411 сказал: надо было просто взять из байт сразу адрес Это достаточно тонкий момент как оказалось, в x64 байты представляют из себя относительный виртуальный адрес от текущего EIP., а x86 это абсолютный адрес, хотя это надо будет перепроверить, возможно это частный случай. Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 29 марта, 2019 Поделиться Опубликовано 29 марта, 2019 42 минуты назад, partoftheworlD сказал: Это достаточно тонкий момент как оказалось, в x64 байты представляют из себя относительный виртуальный адрес от текущего EIP., а x86 это абсолютный адрес во как . а если игру 32 бит запускать на 64 бит системе что тогда будет с такими адресами из байт в скрипте ? будут скрипт правильно работать на 64 если работает на 32 ? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 29 марта, 2019 Поделиться Опубликовано 29 марта, 2019 15 минут назад, Alex2411 сказал: будут скрипт правильно работать на 64 если работает на 32 ? Угу, все правильно будет вне зависимости от разрядности системы. Специально перепроверил. x86 - абсолютный адрес(никакие вычисления не нужны) x64 - относительный адрес (нужны вычисления) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 29 марта, 2019 Автор Поделиться Опубликовано 29 марта, 2019 3 часа назад, Alex2411 сказал: ага . вот что можно . идея понятна. кажетьс я начинаю понимать почему у меня не получалось . спасибо Спойлер Не за что. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Pitronic Опубликовано 11 апреля, 2020 Поделиться Опубликовано 11 апреля, 2020 В 05.08.2018 в 21:38, Garik66 сказал: mov edx,[code+2] в каком месте определяется эточто именно code+2 Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 11 апреля, 2020 Поделиться Опубликовано 11 апреля, 2020 1 час назад, Pitronic сказал: в каком месте определяется эточто именно code+2 В месте просмотра отладчика ? 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения