-
Постов
155 -
Зарегистрирован
-
Посещение
-
Победитель дней
12
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные SergBrNord
-
-
Всем салют.
Ломая игру, у меня получился скрипт следующего вида:
Спойлер{ Game : JnG2.exe Version: 1.02 Date : 2021-01-23 Author : SergBrNord } [ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat aobscan(BOMB,D9 98 30 01 00 00 D9 43) // should be unique alloc(newmem,$1000) label(code) label(return) newmem: jmp return code: fstp dword ptr [eax+00000130] jmp return BOMB: jmp newmem nop return: registersymbol(BOMB) [DISABLE] //code from here till the end of the code will be used to disable the cheat BOMB: db D9 98 30 01 00 00 unregistersymbol(BOMB) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: Rake2D.Script.ItemBomb::Update+565 Rake2D.Script.ItemBomb::Update+53F: 75 07 - jne Rake2D.Script.ItemBomb::Update+548 Rake2D.Script.ItemBomb::Update+541: B8 01 00 00 00 - mov eax,00000001 Rake2D.Script.ItemBomb::Update+546: EB 05 - jmp Rake2D.Script.ItemBomb::Update+54D Rake2D.Script.ItemBomb::Update+548: B8 02 00 00 00 - mov eax,00000002 Rake2D.Script.ItemBomb::Update+54D: 39 45 F0 - cmp [ebp-10],eax Rake2D.Script.ItemBomb::Update+550: 0F 8C 3E FB FF FF - jl Rake2D.Script.ItemBomb::Update+94 Rake2D.Script.ItemBomb::Update+556: 8B CB - mov ecx,ebx Rake2D.Script.ItemBomb::Update+558: E8 4B DD 5D FF - call Rake2D.Script.ItemBehaviorScript::get_MyHero Rake2D.Script.ItemBomb::Update+55D: D9 E8 - fld1 Rake2D.Script.ItemBomb::Update+55F: D8 A8 30 01 00 00 - fsubr dword ptr [eax+00000130] // ---------- INJECTING HERE ---------- Rake2D.Script.ItemBomb::Update+565: D9 98 30 01 00 00 - fstp dword ptr [eax+00000130] // ---------- DONE INJECTING ---------- Rake2D.Script.ItemBomb::Update+56B: D9 43 30 - fld dword ptr [ebx+30] Rake2D.Script.ItemBomb::Update+56E: D9 EE - fldz Rake2D.Script.ItemBomb::Update+570: DF F1 - fcomip st(0),st(1) Rake2D.Script.ItemBomb::Update+572: DD D8 - fstp st(0) Rake2D.Script.ItemBomb::Update+574: 7A 0B - jp Rake2D.Script.ItemBomb::Update+581 Rake2D.Script.ItemBomb::Update+576: 73 09 - jae Rake2D.Script.ItemBomb::Update+581 Rake2D.Script.ItemBomb::Update+578: D9 45 08 - fld dword ptr [ebp+08] Rake2D.Script.ItemBomb::Update+57B: D8 6B 30 - fsubr dword ptr [ebx+30] Rake2D.Script.ItemBomb::Update+57E: D9 5B 30 - fstp dword ptr [ebx+30] Rake2D.Script.ItemBomb::Update+581: D9 43 30 - fld dword ptr [ebx+30] }
Ничего экстраординарного. Но мне стало интересно, можно ли привести скрипт к более изящному виду, чем прыжки. На это мне был дан ответ, что можно использовать инструкцию nop.
После некоторых попыток я пришёл к следующему виду скрипта:
Спойлер{ Game : JnG2.exe Version: 1.02 Date : 2021-01-23 Author : SergBrNord } [ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat aobscan(BOMB,D9 98 30 01 00 00 D9 43) // should be unique BOMB: db 90 90 90 90 90 90 registersymbol(BOMB) [DISABLE] //code from here till the end of the code will be used to disable the cheat BOMB: db D9 98 30 01 00 00 unregistersymbol(BOMB) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: Rake2D.Script.ItemBomb::Update+565 Rake2D.Script.ItemBomb::Update+53F: 75 07 - jne Rake2D.Script.ItemBomb::Update+548 Rake2D.Script.ItemBomb::Update+541: B8 01 00 00 00 - mov eax,00000001 Rake2D.Script.ItemBomb::Update+546: EB 05 - jmp Rake2D.Script.ItemBomb::Update+54D Rake2D.Script.ItemBomb::Update+548: B8 02 00 00 00 - mov eax,00000002 Rake2D.Script.ItemBomb::Update+54D: 39 45 F0 - cmp [ebp-10],eax Rake2D.Script.ItemBomb::Update+550: 0F 8C 3E FB FF FF - jl Rake2D.Script.ItemBomb::Update+94 Rake2D.Script.ItemBomb::Update+556: 8B CB - mov ecx,ebx Rake2D.Script.ItemBomb::Update+558: E8 4B DD 5D FF - call Rake2D.Script.ItemBehaviorScript::get_MyHero Rake2D.Script.ItemBomb::Update+55D: D9 E8 - fld1 Rake2D.Script.ItemBomb::Update+55F: D8 A8 30 01 00 00 - fsubr dword ptr [eax+00000130] // ---------- INJECTING HERE ---------- Rake2D.Script.ItemBomb::Update+565: D9 98 30 01 00 00 - fstp dword ptr [eax+00000130] // ---------- DONE INJECTING ---------- Rake2D.Script.ItemBomb::Update+56B: D9 43 30 - fld dword ptr [ebx+30] Rake2D.Script.ItemBomb::Update+56E: D9 EE - fldz Rake2D.Script.ItemBomb::Update+570: DF F1 - fcomip st(0),st(1) Rake2D.Script.ItemBomb::Update+572: DD D8 - fstp st(0) Rake2D.Script.ItemBomb::Update+574: 7A 0B - jp Rake2D.Script.ItemBomb::Update+581 Rake2D.Script.ItemBomb::Update+576: 73 09 - jae Rake2D.Script.ItemBomb::Update+581 Rake2D.Script.ItemBomb::Update+578: D9 45 08 - fld dword ptr [ebp+08] Rake2D.Script.ItemBomb::Update+57B: D8 6B 30 - fsubr dword ptr [ebx+30] Rake2D.Script.ItemBomb::Update+57E: D9 5B 30 - fstp dword ptr [ebx+30] Rake2D.Script.ItemBomb::Update+581: D9 43 30 - fld dword ptr [ebx+30] }
Можно ли сделать подобное при помощи инструкции nop какими либо ещё способами (идущие подряд 6 инструкций nop я уже пробовал ?)?
P.S.
Нормально ли работает инструкция nop 6? Я искренне считал, что это краткая форма записи подряд идущих инструкций nop. На практике в коде игры вылазит что-то вроде:
//BOMB - 66 0F1F 44 00 00 - nop word ptr [eax+eax+00]
-
Ответ.
Отдача хранится в одной структуре с оружием (кто бы мог подумать).
Надо быть всё-таки внимательнее, ведь вначале поисков отдачи я этот участок структуры смотрел.
2B4 - патроны в магазине; 31С - отдача. Причём ниже есть похожие значения.
От значения 31С можно выйти на инструкцию, которая работает и со врагами (у них точность пожиже будет).
Спойлер -
В 30.11.2019 в 15:14, LIRW сказал:
Это не только для таких игр.. Вот вруби как пример и попробуй пострелять... Эта функция камеру на проч вырубит в обще.. Там гляди функцию...
Ну смотри, я при помощи CE построил диаграмму. До того перехода, на который ты мне указал производится обнуление всего подряд.
СпойлерЭто похоже на обнуление x, y, z камеры:
DP.exe+5544CD - xorps xmm0,xmm0 DP.exe+5544D0 - movss [esi+0C],xmm0 DP.exe+5544D5 - movss [esi+10],xmm0 DP.exe+5544DA - movss [esi+14],xmm0
Эти опкоды поразительно похожи на те, что я указывал в первом сообщении; здесь также происходит обнуление:
DP.exe+5544DF - xor eax,eax DP.exe+5544E1 - xor ecx,ecx DP.exe+5544E3 - mov [esi+24],eax DP.exe+5544E6 - xor edx,edx DP.exe+5544E8 - mov [esi+28],ecx DP.exe+5544EB - mov [esi+2C],edx
Дальше идёт проверка на 0 eax (мы его обнуляем чуть выше)
DP.exe+5544EE - xor ebx,ebx DP.exe+5544F0 - cmp [edi+00000188],eax DP.exe+5544F6 - je DP.exe+554545
В том скрипте, что ты написал, происходит безусловный переход на DP.exe+554545 и камера застывает на месте. Но в чём проблема, я не вижу что бы в опкодах ниже DP.exe+554545 что-то массово подгружалось в структуры.
-
В 28.11.2019 в 22:29, imaginary сказал:
Ищешь повороты камеры, смотришь что туда записывает и там выше находишь отдачу
Я так понимаю, это для игр с видом от 1 лица?
-
Салют всем. Продолжаем мучать игру под названием "Deadpool".
Захотелось мне научится находить-отключать отдачу и Лирв поделился адресом, откуда можно посмотреть на всё это дело.
Эту тему тоже пишу по предварительному согласованию с Лирвом =)
// ---------- INJECTING HERE ---------- "DP.exe"+65F301: F3 0F 11 41 30 - movss [ecx+30],xmm0 // ---------- DONE INJECTING ----------
Сделав останов, я посмотрел структуру по адресу, находящемуся в ecx, и нашёл вот такую структуру:
СпойлерНабросал на скорую руку скрипт, который пишет туда нули - не помогло; записал с [ecx+24] по [ecx+30] нули - не помогло; нашёл все инструкции, пишущие по тем адресам, заменил nop - не помогло. Что я делаю не так?
P.S.
Если не трудно, подскажите приемлемый способ нахождения отдачи, т.к. метод со спидхаком на 0,2 и отсевом удручает своей эффективностью.
-
В 17.11.2019 в 17:44, LIRW сказал:
Я на неё выходил как и всё.. отладчиком.. Адрес над просто правильный найти и всё... Так что @Garik66 у него просто даже адрес не правильный.. От того и делает в обще на другой инструкции.. которая с очками не чего общего не имеет. А тут всего то 2 отсева надо.
У меня CE упорно определяет это значение до выноса в таблицу как строковый тип. Я искал как вещественный тип и в мои отсевы нужный адрес не попадал.
-
21 минуту назад, Garik66 сказал:
Хотя все ещё проще F3 0F 11 81 08 05 00 00 есть и сигна в скрипте.
Так что секреты мастерства Женьки просты.
Насколько я понял, когда не нашлось целочисленное значение, он сразу начал поиск по всем значениям. У него нашлась строковая переменная, которая на самом деле является числом с точкой, но CE при поиске её так почему-то не определяет. Я же сразу перешёл к поиску чисел с точкой и пролетел.
-
Только что, Garik66 сказал:
Вот этот адрес в игре на какую инструкцию выводит "DP.exe"+427F2A
DP.exe+427F2A - movss xmm0,[esp+08]
-
14 часов назад, Garik66 сказал:
Попробуй так:
{ Game : DP.exe Version: 1.0 Date : 2019-11-16 Author : SergBrNord Correction: Garik66 } [ENABLE] aobscanmodule(DPOINTS,DP.exe,DD 5F 04 5F 5E 8B) // should be unique alloc(newmem,$1000) label(code) label(return) label(flag) label(value) registersymbol(DPOINTS) newmem: cmp [edi+90], #6 //Main filter jne code cmp [flag],0 //Check flag jne code fstp qword ptr [esi+04] fld qword ptr [value] //Write DP value mov [flag],1 //Set flag code: fstp qword ptr [edi+04] pop edi pop esi jmp return flag: dd 0 value: dq (double)3000000 DPOINTS: jmp newmem return: [DISABLE] DPOINTS: db DD 5F 04 5F 5E unregistersymbol(DPOINTS) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "DP.exe"+A1AE17 "DP.exe"+A1AE04: 89 77 04 - mov [edi+04],esi "DP.exe"+A1AE07: FF 46 08 - inc [esi+08] "DP.exe"+A1AE0A: 5B - pop ebx "DP.exe"+A1AE0B: 5F - pop edi "DP.exe"+A1AE0C: 5E - pop esi "DP.exe"+A1AE0D: 8B E5 - mov esp,ebp "DP.exe"+A1AE0F: 5D - pop ebp "DP.exe"+A1AE10: C2 04 00 - ret 0004 "DP.exe"+A1AE13: DD 46 04 - fld qword ptr [esi+04] "DP.exe"+A1AE16: 5B - pop ebx // ---------- INJECTING HERE ---------- "DP.exe"+A1AE17: DD 5F 04 - fstp qword ptr [edi+04] "DP.exe"+A1AE1A: 5F - pop edi "DP.exe"+A1AE1B: 5E - pop esi // ---------- DONE INJECTING ---------- "DP.exe"+A1AE1C: 8B E5 - mov esp,ebp "DP.exe"+A1AE1E: 5D - pop ebp "DP.exe"+A1AE1F: C2 04 00 - ret 0004 "DP.exe"+A1AE22: 8B 56 04 - mov edx,[esi+04] "DP.exe"+A1AE25: 5B - pop ebx "DP.exe"+A1AE26: 89 57 04 - mov [edi+04],edx "DP.exe"+A1AE29: 5F - pop edi "DP.exe"+A1AE2A: 5E - pop esi "DP.exe"+A1AE2B: 8B E5 - mov esp,ebp "DP.exe"+A1AE2D: 5D - pop ebp }
Попробовал. Вылетает всё также непонятно где, до точки останова. Но это уже не особо важно, буду использовать вариант Лирва. Только сначала надо узнать секреты мастерства ?
-
4 часа назад, LIRW сказал:
А очки разве там не по такой сигнатуре.... ?
CC CC CC CC CC F3 0F * * * * * * * * F3 0F 11 81 08 05 00 00 + 15 байт.. не hex
movss [ecx+0508h],xmm0
Это я к тому, что там же не какие фильтра то и не нужны... Я просто эту игру когда то смотрел.. таблицы уж нет.. А исход остался.
Если не секрет, то как ты вышел на эту сигнатуру? Я искал очки банальным отсеиванием по значению, подбирая в комнате значки на 250 очков.
13 часов назад, Garik66 сказал:Конечно вылетает, посмотри на эту строчку:
mov [edi+04],value //Write DP value
value - это адрес
[value] - вот это DP value
И ты же знаешь, что из памяти в память писать напрямую нельзя, либо через регистры, либо через стек.
Оно-то так, но при попытке сохранить скрипт начинается ругань именно на таким образом написанную строку. Что странно, как по мне.
-
Салют всем.
После некоторого перерыва на квесты решил кое-что поломать.
Возникла проблема с добавлением определённого количества очков, на которые можно совершать покупки.
Вот код. Код вылетает, причём ещё до попытки записи значения, которое почему-то равно нулю, хотя в коде не так.
Спойлер{ Game : DP.exe Version: 1.0 Date : 2019-11-16 Author : SergBrNord } [ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat aobscanmodule(DPOINTS,DP.exe,DD 5F 04 5F 5E 8B) // should be unique alloc(newmem,$1000) label(code) label(return) newmem: cmp [edi+90], #6 //Main filter jne code cmp [flag], 0 //Check flag jne code fstp st(0) mov [edi+04], value //Write DP value fld qword ptr [edi+04] mov byte ptr [flag], 1 //Set flag code: fstp qword ptr [edi+04] pop edi pop esi jmp return flag: db 00 value: dq (double)3000000 DPOINTS: jmp newmem return: registersymbol(DPOINTS) [DISABLE] //code from here till the end of the code will be used to disable the cheat DPOINTS: db DD 5F 04 5F 5E unregistersymbol(DPOINTS) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "DP.exe"+A1AE17 "DP.exe"+A1AE04: 89 77 04 - mov [edi+04],esi "DP.exe"+A1AE07: FF 46 08 - inc [esi+08] "DP.exe"+A1AE0A: 5B - pop ebx "DP.exe"+A1AE0B: 5F - pop edi "DP.exe"+A1AE0C: 5E - pop esi "DP.exe"+A1AE0D: 8B E5 - mov esp,ebp "DP.exe"+A1AE0F: 5D - pop ebp "DP.exe"+A1AE10: C2 04 00 - ret 0004 "DP.exe"+A1AE13: DD 46 04 - fld qword ptr [esi+04] "DP.exe"+A1AE16: 5B - pop ebx // ---------- INJECTING HERE ---------- "DP.exe"+A1AE17: DD 5F 04 - fstp qword ptr [edi+04] "DP.exe"+A1AE1A: 5F - pop edi "DP.exe"+A1AE1B: 5E - pop esi // ---------- DONE INJECTING ---------- "DP.exe"+A1AE1C: 8B E5 - mov esp,ebp "DP.exe"+A1AE1E: 5D - pop ebp "DP.exe"+A1AE1F: C2 04 00 - ret 0004 "DP.exe"+A1AE22: 8B 56 04 - mov edx,[esi+04] "DP.exe"+A1AE25: 5B - pop ebx "DP.exe"+A1AE26: 89 57 04 - mov [edi+04],edx "DP.exe"+A1AE29: 5F - pop edi "DP.exe"+A1AE2A: 5E - pop esi "DP.exe"+A1AE2B: 8B E5 - mov esp,ebp "DP.exe"+A1AE2D: 5D - pop ebp }
А вот как это дело выглядит в отладчике.
СпойлерP.S.
Не понимаю, почему в моменте проверки флага отладчик секции комментариев пишет, что флаг уже вроде как равен 1, хотя это не так.
P.P.S.
Пошёл спать, благодарен за помощь ?
-
Вот что получилось в итоге:
https://cloud.mail.ru/public/Epw3/zyuepyAiq
В таблице есть только бесплатное строительство =(
На значение счётчика времени (чтобы его сбрасывать) так и не вышел, хоть очень и хотел.
-
В 31.03.2019 в 17:06, Garik66 сказал:
сравниваешь младшую часть числа при таком сравнении
Вот про слона-то я и забыл. Спасибо.
В 31.03.2019 в 18:53, Alex2411 сказал:в смысле скорость игры ? вот для gog версия 1.5.3 . если метку _time поставить 100 то за минуту проходит около 100 лет в игре ))
В прямом. Хочу периодически сбрасывать таймер на предыдущее значение, чтобы неспеша развиваться. В общем, попробую - отпишусь.
-
18 часов назад, Garik66 сказал:
сам пишешь
а сравниваешь с 1.
Конечно не будет работать.Почему? С JL всё прекрасно работает. С JG — нет.
-
Салют всем.
Решил я поломать Тропико 1. И первым под удар попала стоимость строительства.
Написан такой скриптик.
Спойлерaobscanmodule(FREECONSTRUCTION,Tropico.EXE,DC 86 22 01 00 00 DD) // should be unique alloc(newmem,$1000) label(code) label(return) newmem: fstp qword ptr [value] cmp [value], 1 jg jump fld qword ptr [null] jmp code jump: fld qword ptr [value] code: fadd qword ptr [esi+00000122] jmp return value: dq 00 null: dq 00 FREECONSTRUCTION: jmp newmem nop return: registersymbol(FREECONSTRUCTION) [DISABLE] //code from here till the end of the code will be used to disable the cheat FREECONSTRUCTION: db DC 86 22 01 00 00 unregistersymbol(FREECONSTRUCTION) dealloc(newmem)
Суть идеи такова.
Загружаем в переменную значение из точечного стека, сравниваем с единицей. Если значение меньше единицы — просто пишем в точечный стек нуль и прыгаем к телу кода, если больше — загружаем в стек значение из переменной.
Проблема в том, что jg почему-то не работает. Объясните кто, а?
Также, если у кого-то будет желание попробуйте найти инструкцию, отвечающую за ход времени.
P.S.
Отвечу завтра, спать хочу неимоверно...
-
-
5 часов назад, Garik66 сказал:
Так я давно делал целую тему по шифрованным значениям, куда собрал видео на русском от нашего форума.
Гарик, я видел ту тему и видео смотрел. Но почему-то не взлетело.
5 часов назад, LIRW сказал:Он наверное месяц уже не как не найдет данные.. Я думаю он бы нашел, если бы понял как это работает. Вот видео урок посмотрит, я думаю поймет.
Не месяц, а дня 4.. не только тебе можно на всяких бабок отвлекаться. Я на комочек шерсти подсел?
- 1
-
16 часов назад, partoftheworlD сказал:
С Xor это не будет работать
Проверил и этот вариант, тоже находить отказывается. Надо Лирва пытать, как он выходил на шифрованное значение.
-
25 минут назад, partoftheworlD сказал:
Неизвестное - изменилось/не изменилось, а для проверки ставить бряк на доступ, чтобы найти инструкцию шифрования, а от неё выйти на значение.
Попробую, с изменилось/не изменилось не пробовал. Отсеивал по увеличилось/уменьшилось
-
Всем здрасти!
Есть такая древняя и кривоватая игрушка "Kane & Lynch: Dead Men". И есть там значение патронов. Благодаря таблице Лирва, я узнал, что значение шифруется BEEBBEEB.
Но интересует меня процесс нахождения значения. Смотрел видео, пытался делать как там, но на моменте заморозки значений — ничего не менялось.
Может кто-нибудь описать процесс для конкретно этой игры?
-
Всем доброго времени суток.
У меня возникла неожиданная проблема. Starcraft ни в коем разе не позволяет подключить к себе отладчик.
При попытке подключения либо происходит отказ в связи с ошибкой доступа, либо процесс завершается, либо зависает намертво.
Испробовано:
- Подключение отладчика к процессу до начало поиска;
- Смена отладчиков CE;
- Подключение sedebugprivilege;
- Подключение x64dbg с отладочной привилегией.
Есть у кого-нибудь ещё идеи?
P.S.
Версия 1.22.2.5147
-
Только что зашёл, вроде видео с обоих каналов доступны.
-
Наконец-то закончил возню с фильтром (с 5 раза смог)
Выкладываю скрипты для Rome: Total War + Barbarian Invasion
- 3
-
Результат моих
предварительныхизысканий(не доделан из заготовки фильтр):Спойлер{ Game : RomeTW-BI.exe Version: 1.6.1 Date : 2018-02-19 Author : SergBrNord, Garik66; BIG THX TO Recifense } [ENABLE] aobscanmodule(GETmID,RomeTW-BI.exe,8B 80 04 05 00 00 89 45 F0 FF) // should be unique aobscanmodule(MVPOINTS_1,RomeTW-BI.exe,D8 65 08 8B 45 8C) // should be unique aobscanmodule(MVPOINTS_2,RomeTW-BI.exe,D9 98 7C 02 00 00 0F) // should be unique aobscanmodule(MVPOINTS_3,RomeTW-BI.exe,D8 65 08 8B 45 FC D9 98 7C) // should be unique alloc(newmem,$1000) alloc(dump, 4096, RomeTW-BI.exe) label(code_1) label(code_2) label(code_3) label(code_3) label(script_1) label(script_2) label(script_3) label(script_4) label(return_1) label(return_2) label(script_3) label(script_4) registersymbol(GETmID) registersymbol(MVPOINTS_1) registersymbol(MVPOINTS_2) registersymbol(MVPOINTS_3) newmem: script_1: mov [PlayerID],eax code_1: mov eax,[eax+00000504] jmp return_1 script_2: cmp eax, [PlayerID] jne code_2 mov [ebp+08], 0 code_2: fsub dword ptr [ebp+08] mov eax,[ebp-74] jmp return_2 script_3: cmp eax, [PlayerID] jne code_3 mov [eax+0000027C], (float)80 fstp st(0) fld dword ptr [eax+0000027C] code_3: fstp dword ptr [eax+0000027C] jmp return_3 script_4: cmp eax, [PlayerID] jne code_4 mov [ebp+08], 0 code_4: fsub dword ptr [ebp+08] mov eax,[ebp-04] jmp return_4 PlayerID: dd dump GETmID: jmp script_1 nop return_1: MVPOINTS_1: jmp script_2 nop return_2: MVPOINTS_2: jmp script_3 nop return_3: MVPOINTS_3: jmp script_4 nop return_4: [DISABLE] GETmID: db 8B 80 04 05 00 00 MVPOINTS_1: db D8 65 08 8B 45 8C MVPOINTS_2: db D9 98 7C 02 00 00 MVPOINTS_3: db D8 65 08 8B 45 FC unregistersymbol(GETmID) unregistersymbol(MVPOINTS_1) unregistersymbol(MVPOINTS_2) unregistersymbol(MVPOINTS_3) dealloc(newmem) dealloc(dump) { // ORIGINAL CODE - INJECTION POINT: "RomeTW-BI.exe"+898105 "RomeTW-BI.exe"+8980DE: 89 4D EC - mov [ebp-14],ecx "RomeTW-BI.exe"+8980E1: A1 58 18 92 02 - mov eax,[RomeTW-BI.exe+2521858] "RomeTW-BI.exe"+8980E6: 05 E4 02 00 00 - add eax,000002E4 "RomeTW-BI.exe"+8980EB: 89 45 F8 - mov [ebp-08],eax "RomeTW-BI.exe"+8980EE: 8D 45 FC - lea eax,[ebp-04] "RomeTW-BI.exe"+8980F1: 50 - push eax "RomeTW-BI.exe"+8980F2: 8B 0D FC C0 8D 01 - mov ecx,[RomeTW-BI.exe+14DC0FC] "RomeTW-BI.exe"+8980F8: E8 96 43 ED FF - call RomeTW-BI.exe+76C493 "RomeTW-BI.exe"+8980FD: 8D 4D FC - lea ecx,[ebp-04] "RomeTW-BI.exe"+898100: E8 0A 28 EC FF - call RomeTW-BI.exe+75A90F // ---------- INJECTING HERE ---------- "RomeTW-BI.exe"+898105: 8B 80 04 05 00 00 - mov eax,[eax+00000504] // ---------- DONE INJECTING ---------- "RomeTW-BI.exe"+89810B: 89 45 F0 - mov [ebp-10],eax "RomeTW-BI.exe"+89810E: FF 75 F0 - push [ebp-10] "RomeTW-BI.exe"+898111: 8B 45 EC - mov eax,[ebp-14] "RomeTW-BI.exe"+898114: 8B 48 60 - mov ecx,[eax+60] "RomeTW-BI.exe"+898117: 8B 45 EC - mov eax,[ebp-14] "RomeTW-BI.exe"+89811A: 8B 40 60 - mov eax,[eax+60] "RomeTW-BI.exe"+89811D: 8B 00 - mov eax,[eax] "RomeTW-BI.exe"+89811F: FF 90 70 01 00 00 - call dword ptr [eax+00000170] "RomeTW-BI.exe"+898125: 8B 45 F8 - mov eax,[ebp-08] "RomeTW-BI.exe"+898128: 8B 4D EC - mov ecx,[ebp-14] } { // ORIGINAL CODE - INJECTION POINT: "RomeTW-BI.exe"+181782 "RomeTW-BI.exe"+18175B: 8B EC - mov ebp,esp "RomeTW-BI.exe"+18175D: 81 EC 80 00 00 00 - sub esp,00000080 "RomeTW-BI.exe"+181763: 89 4D 8C - mov [ebp-74],ecx "RomeTW-BI.exe"+181766: 8B 45 8C - mov eax,[ebp-74] "RomeTW-BI.exe"+181769: 0F B6 80 C1 00 00 00 - movzx eax,byte ptr [eax+000000C1] "RomeTW-BI.exe"+181770: 85 C0 - test eax,eax "RomeTW-BI.exe"+181772: 74 05 - je RomeTW-BI.exe+181779 "RomeTW-BI.exe"+181774: E9 5A 02 00 00 - jmp RomeTW-BI.exe+1819D3 "RomeTW-BI.exe"+181779: 8B 45 8C - mov eax,[ebp-74] "RomeTW-BI.exe"+18177C: D9 80 C4 00 00 00 - fld dword ptr [eax+000000C4] // ---------- INJECTING HERE ---------- "RomeTW-BI.exe"+181782: D8 65 08 - fsub dword ptr [ebp+08] "RomeTW-BI.exe"+181785: 8B 45 8C - mov eax,[ebp-74] // ---------- DONE INJECTING ---------- "RomeTW-BI.exe"+181788: D9 98 C4 00 00 00 - fstp dword ptr [eax+000000C4] "RomeTW-BI.exe"+18178E: 8B 45 8C - mov eax,[ebp-74] "RomeTW-BI.exe"+181791: D9 80 C4 00 00 00 - fld dword ptr [eax+000000C4] "RomeTW-BI.exe"+181797: D8 1D 9C 49 FE 00 - fcomp dword ptr [RomeTW-BI.exe+BE499C] "RomeTW-BI.exe"+18179D: DF E0 - fnstsw ax "RomeTW-BI.exe"+18179F: 9E - sahf "RomeTW-BI.exe"+1817A0: 73 0B - jae RomeTW-BI.exe+1817AD "RomeTW-BI.exe"+1817A2: 8B 45 8C - mov eax,[ebp-74] "RomeTW-BI.exe"+1817A5: D9 EE - fldz "RomeTW-BI.exe"+1817A7: D9 98 C4 00 00 00 - fstp dword ptr [eax+000000C4] } { // ORIGINAL CODE - INJECTION POINT: "RomeTW-BI.exe"+1817DD "RomeTW-BI.exe"+1817B9: 83 7D F4 00 - cmp dword ptr [ebp-0C],00 "RomeTW-BI.exe"+1817BD: 74 24 - je RomeTW-BI.exe+1817E3 "RomeTW-BI.exe"+1817BF: 8B 45 8C - mov eax,[ebp-74] "RomeTW-BI.exe"+1817C2: 8B 80 EC 00 00 00 - mov eax,[eax+000000EC] "RomeTW-BI.exe"+1817C8: 89 45 F0 - mov [ebp-10],eax "RomeTW-BI.exe"+1817CB: 8B 45 8C - mov eax,[ebp-74] "RomeTW-BI.exe"+1817CE: D9 80 C4 00 00 00 - fld dword ptr [eax+000000C4] "RomeTW-BI.exe"+1817D4: D9 5D EC - fstp dword ptr [ebp-14] "RomeTW-BI.exe"+1817D7: 8B 45 F0 - mov eax,[ebp-10] "RomeTW-BI.exe"+1817DA: D9 45 EC - fld dword ptr [ebp-14] // ---------- INJECTING HERE ---------- "RomeTW-BI.exe"+1817DD: D9 98 7C 02 00 00 - fstp dword ptr [eax+0000027C] // ---------- DONE INJECTING ---------- "RomeTW-BI.exe"+1817E3: 0F B6 45 0C - movzx eax,byte ptr [ebp+0C] "RomeTW-BI.exe"+1817E7: 85 C0 - test eax,eax "RomeTW-BI.exe"+1817E9: 0F 84 DC 01 00 00 - je RomeTW-BI.exe+1819CB "RomeTW-BI.exe"+1817EF: 8B 45 8C - mov eax,[ebp-74] "RomeTW-BI.exe"+1817F2: 8B 80 E4 00 00 00 - mov eax,[eax+000000E4] "RomeTW-BI.exe"+1817F8: 89 45 E8 - mov [ebp-18],eax "RomeTW-BI.exe"+1817FB: 83 7D E8 00 - cmp dword ptr [ebp-18],00 "RomeTW-BI.exe"+1817FF: 0F 84 C6 01 00 00 - je RomeTW-BI.exe+1819CB "RomeTW-BI.exe"+181805: 8B 45 8C - mov eax,[ebp-74] "RomeTW-BI.exe"+181808: 8B 80 E4 00 00 00 - mov eax,[eax+000000E4] } { // ORIGINAL CODE - INJECTION POINT: "RomeTW-BI.exe"+3C13C2 "RomeTW-BI.exe"+3C13A0: 55 - push ebp "RomeTW-BI.exe"+3C13A1: 8B EC - mov ebp,esp "RomeTW-BI.exe"+3C13A3: 51 - push ecx "RomeTW-BI.exe"+3C13A4: 89 4D FC - mov [ebp-04],ecx "RomeTW-BI.exe"+3C13A7: 8B 45 FC - mov eax,[ebp-04] "RomeTW-BI.exe"+3C13AA: D9 80 7C 02 00 00 - fld dword ptr [eax+0000027C] "RomeTW-BI.exe"+3C13B0: D8 65 08 - fsub dword ptr [ebp+08] "RomeTW-BI.exe"+3C13B3: D8 1D 6C 8C FF 00 - fcomp dword ptr [RomeTW-BI.exe+BF8C6C] "RomeTW-BI.exe"+3C13B9: 8B 45 FC - mov eax,[ebp-04] "RomeTW-BI.exe"+3C13BC: D9 80 7C 02 00 00 - fld dword ptr [eax+0000027C] // ---------- INJECTING HERE ---------- "RomeTW-BI.exe"+3C13C2: D8 65 08 - fsub dword ptr [ebp+08] "RomeTW-BI.exe"+3C13C5: 8B 45 FC - mov eax,[ebp-04] // ---------- DONE INJECTING ---------- "RomeTW-BI.exe"+3C13C8: D9 98 7C 02 00 00 - fstp dword ptr [eax+0000027C] "RomeTW-BI.exe"+3C13CE: 8B 45 FC - mov eax,[ebp-04] "RomeTW-BI.exe"+3C13D1: D9 80 7C 02 00 00 - fld dword ptr [eax+0000027C] "RomeTW-BI.exe"+3C13D7: D8 1D 9C 49 FE 00 - fcomp dword ptr [RomeTW-BI.exe+BE499C] "RomeTW-BI.exe"+3C13DD: DF E0 - fnstsw ax "RomeTW-BI.exe"+3C13DF: 9E - sahf "RomeTW-BI.exe"+3C13E0: 73 0B - jae RomeTW-BI.exe+3C13ED "RomeTW-BI.exe"+3C13E2: 8B 45 FC - mov eax,[ebp-04] "RomeTW-BI.exe"+3C13E5: D9 EE - fldz "RomeTW-BI.exe"+3C13E7: D9 98 7C 02 00 00 - fstp dword ptr [eax+0000027C] }
Как оказалось, для получения корректной работы скрипта для члена фракции, необходимо одновременно работать с инструкциями для специальных юнитов и армий (хоть скрипты для последних прекрасно работают по отдельности)
Вот версия, составленная по идеям Гаррика, но крашащая игру: =)
Спойлер{ Game : RomeTW-BI.exe Version: 1.6.1 Date : 2018-02-18 Author : SergBrNord & Garik66 } [ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat aobscanmodule(Gariktest,RomeTW-BI.exe,8B 80 04 05 00 00 89 45 F0 FF) // should be unique aobscanmodule(INJECT,RomeTW-BI.exe,D9 81 C4 00 00 00 D9) // should be unique aobscanmodule(INJECT2,RomeTW-BI.exe,00 D9 80 7C 02 00 00 D9 5D F0 8B 45 0C D9 45 F0 D9 18 EB A9 C9) // should be unique alloc(newmem,$1000) alloc(dump, 4096, RomeTW-BI.exe) label(cheat1) label(cheat2) label(cheat3) label(code) label(code2) label(code3) label(return) label(return2) label(return3) registersymbol(Gariktest) registersymbol(INJECT) registersymbol(INJECT2) newmem: cheat1: mov [PlayerID],eax code: mov eax,[eax+00000504] jmp return cheat2: cmp eax, [PlayerID] jne code2 push dword ptr [eax+150] pop dword ptr [ecx+C4] code2: fld dword ptr [ecx+000000C4] jmp return2 cheat3: cmp eax, [PlayerID] jne code3 nop nop jmp RomeTW-BI.exe+ACEDF leave jmp return3 code3: fstp dword ptr [eax] jmp RomeTW-BI.exe+ACEDF leave jmp return3 PlayerID: dd dump Gariktest: jmp cheat1 nop return: INJECT: jmp cheat2 nop return2: INJECT2+10: jmp cheat3 return3: [DISABLE] //code from here till the end of the code will be used to disable the cheat Gariktest: db 8B 80 04 05 00 00 INJECT: db D9 81 C4 00 00 00 INJECT2+10: db D9 18 EB A9 C9 unregistersymbol(Gariktest) unregistersymbol(INJECT) unregistersymbol(INJECT2) dealloc(newmem) dealloc(dump) { // ORIGINAL CODE - INJECTION POINT: "RomeTW-BI.exe"+898105 "RomeTW-BI.exe"+8980DE: 89 4D EC - mov [ebp-14],ecx "RomeTW-BI.exe"+8980E1: A1 58 18 92 02 - mov eax,[RomeTW-BI.exe+2521858] "RomeTW-BI.exe"+8980E6: 05 E4 02 00 00 - add eax,000002E4 "RomeTW-BI.exe"+8980EB: 89 45 F8 - mov [ebp-08],eax "RomeTW-BI.exe"+8980EE: 8D 45 FC - lea eax,[ebp-04] "RomeTW-BI.exe"+8980F1: 50 - push eax "RomeTW-BI.exe"+8980F2: 8B 0D FC C0 8D 01 - mov ecx,[RomeTW-BI.exe+14DC0FC] "RomeTW-BI.exe"+8980F8: E8 96 43 ED FF - call RomeTW-BI.exe+76C493 "RomeTW-BI.exe"+8980FD: 8D 4D FC - lea ecx,[ebp-04] "RomeTW-BI.exe"+898100: E8 0A 28 EC FF - call RomeTW-BI.exe+75A90F // ---------- INJECTING HERE ---------- "RomeTW-BI.exe"+898105: 8B 80 04 05 00 00 - mov eax,[eax+00000504] // ---------- DONE INJECTING ---------- "RomeTW-BI.exe"+89810B: 89 45 F0 - mov [ebp-10],eax "RomeTW-BI.exe"+89810E: FF 75 F0 - push [ebp-10] "RomeTW-BI.exe"+898111: 8B 45 EC - mov eax,[ebp-14] "RomeTW-BI.exe"+898114: 8B 48 60 - mov ecx,[eax+60] "RomeTW-BI.exe"+898117: 8B 45 EC - mov eax,[ebp-14] "RomeTW-BI.exe"+89811A: 8B 40 60 - mov eax,[eax+60] "RomeTW-BI.exe"+89811D: 8B 00 - mov eax,[eax] "RomeTW-BI.exe"+89811F: FF 90 70 01 00 00 - call dword ptr [eax+00000170] "RomeTW-BI.exe"+898125: 8B 45 F8 - mov eax,[ebp-08] "RomeTW-BI.exe"+898128: 8B 4D EC - mov ecx,[ebp-14] } { // ORIGINAL CODE - INJECTION POINT: "RomeTW-BI.exe"+18CE5D "RomeTW-BI.exe"+18CE2C: 0F B6 C0 - movzx eax,al "RomeTW-BI.exe"+18CE2F: 85 C0 - test eax,eax "RomeTW-BI.exe"+18CE31: 74 1E - je RomeTW-BI.exe+18CE51 "RomeTW-BI.exe"+18CE33: 8B 85 78 FF FF FF - mov eax,[ebp-00000088] "RomeTW-BI.exe"+18CE39: D9 80 44 01 00 00 - fld dword ptr [eax+00000144] "RomeTW-BI.exe"+18CE3F: D8 0D 98 4B FE 00 - fmul dword ptr [RomeTW-BI.exe+BE4B98] "RomeTW-BI.exe"+18CE45: 8B 85 78 FF FF FF - mov eax,[ebp-00000088] "RomeTW-BI.exe"+18CE4B: D9 98 44 01 00 00 - fstp dword ptr [eax+00000144] "RomeTW-BI.exe"+18CE51: 8B 85 78 FF FF FF - mov eax,[ebp-00000088] "RomeTW-BI.exe"+18CE57: 8B 8D 78 FF FF FF - mov ecx,[ebp-00000088] // ---------- INJECTING HERE ---------- "RomeTW-BI.exe"+18CE5D: D9 81 C4 00 00 00 - fld dword ptr [ecx+000000C4] // ---------- DONE INJECTING ---------- "RomeTW-BI.exe"+18CE63: D9 98 4C 01 00 00 - fstp dword ptr [eax+0000014C] "RomeTW-BI.exe"+18CE69: 8B 85 78 FF FF FF - mov eax,[ebp-00000088] "RomeTW-BI.exe"+18CE6F: 8B 80 E4 00 00 00 - mov eax,[eax+000000E4] "RomeTW-BI.exe"+18CE75: 89 45 FC - mov [ebp-04],eax "RomeTW-BI.exe"+18CE78: 83 7D FC 00 - cmp dword ptr [ebp-04],00 "RomeTW-BI.exe"+18CE7C: 0F 84 DB 00 00 00 - je RomeTW-BI.exe+18CF5D "RomeTW-BI.exe"+18CE82: A1 B4 17 92 02 - mov eax,[RomeTW-BI.exe+25217B4] "RomeTW-BI.exe"+18CE87: 89 45 C0 - mov [ebp-40],eax "RomeTW-BI.exe"+18CE8A: 8B 85 78 FF FF FF - mov eax,[ebp-00000088] "RomeTW-BI.exe"+18CE90: 05 4C 01 00 00 - add eax,0000014C } { // ORIGINAL CODE - INJECTION POINT: "RomeTW-BI.exe"+ACF32 "RomeTW-BI.exe"+ACF13: DF E0 - fnstsw ax "RomeTW-BI.exe"+ACF15: 9E - sahf "RomeTW-BI.exe"+ACF16: 73 1C - jae RomeTW-BI.exe+ACF34 "RomeTW-BI.exe"+ACF18: FF 75 FC - push [ebp-04] "RomeTW-BI.exe"+ACF1B: 8B 4D 08 - mov ecx,[ebp+08] "RomeTW-BI.exe"+ACF1E: E8 60 53 27 00 - call RomeTW-BI.exe+322283 "RomeTW-BI.exe"+ACF23: D9 80 7C 02 00 00 - fld dword ptr [eax+0000027C] "RomeTW-BI.exe"+ACF29: D9 5D F0 - fstp dword ptr [ebp-10] "RomeTW-BI.exe"+ACF2C: 8B 45 0C - mov eax,[ebp+0C] "RomeTW-BI.exe"+ACF2F: D9 45 F0 - fld dword ptr [ebp-10] // ---------- INJECTING HERE ---------- "RomeTW-BI.exe"+ACF32: D9 18 - fstp dword ptr [eax] "RomeTW-BI.exe"+ACF34: EB A9 - jmp RomeTW-BI.exe+ACEDF "RomeTW-BI.exe"+ACF36: C9 - leave // ---------- DONE INJECTING ---------- "RomeTW-BI.exe"+ACF37: C2 08 00 - ret 0008 "RomeTW-BI.exe"+ACF3A: 55 - push ebp "RomeTW-BI.exe"+ACF3B: 8B EC - mov ebp,esp "RomeTW-BI.exe"+ACF3D: 83 EC 18 - sub esp,18 "RomeTW-BI.exe"+ACF40: 89 4D EC - mov [ebp-14],ecx "RomeTW-BI.exe"+ACF43: 83 65 E8 00 - and dword ptr [ebp-18],00 "RomeTW-BI.exe"+ACF47: 83 65 FC 00 - and dword ptr [ebp-04],00 "RomeTW-BI.exe"+ACF4B: EB 07 - jmp RomeTW-BI.exe+ACF54 "RomeTW-BI.exe"+ACF4D: 8B 45 FC - mov eax,[ebp-04] "RomeTW-BI.exe"+ACF50: 40 - inc eax }
AOB Injection и nop
in Вопросы по созданию читов в одиночных играх
Опубликовано
Прошу прощения за поздний ответ.
Всё верно, просто стало интересно, какие ещё варианты могут быть. Происходит в этой функции игры следующее: есть какое-то количество бомб, при использовании которых это количество уменьшается на единицу.