SergBrNord Опубликовано 30 марта, 2019 Поделиться Опубликовано 30 марта, 2019 Салют всем. Решил я поломать Тропико 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. Отвечу завтра, спать хочу неимоверно... Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 30 марта, 2019 Поделиться Опубликовано 30 марта, 2019 26 минут назад, SergBrNord сказал: Проблема в том, что jg почему-то не работает. Объясните кто, а? 26 минут назад, SergBrNord сказал: cmp [value], 1 сам пишешь 27 минут назад, SergBrNord сказал: из точечного стека а сравниваешь с 1. Конечно не будет работать. Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 31 марта, 2019 Автор Поделиться Опубликовано 31 марта, 2019 (изменено) 18 часов назад, Garik66 сказал: сам пишешь а сравниваешь с 1. Конечно не будет работать. Почему? С JL всё прекрасно работает. С JG — нет. Изменено 31 марта, 2019 пользователем SergBrNord Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 31 марта, 2019 Поделиться Опубликовано 31 марта, 2019 2 часа назад, SergBrNord сказал: Почему? С JL всё прекрасно работает. С JG — нет. Ты не много не до понимаешь. Вот скрипт (примерно как твой) для шага №4 Туториала СЕ {патроны100 выстрел (double)} Условие в скрипте если патроном меньше 1 сделать их 100. Посмотри может станет понятно: Спойлер { Game : Tutorial-i386.exe Version: Date : 2019-03-31 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(INJECT,Tutorial-i386.exe,DD 9B 98 04 00 00) // should be unique alloc(newmem,$1000) label(code) label(return) newmem: fstp qword ptr [value] mov ecx,[Odin+4] cmp [value+4],ecx jg jump fld qword ptr [sto] jmp code jump: fld qword ptr [value] code: fstp qword ptr [ebx+00000498] jmp return value: dq 0 Odin: dq (double)1 sto: dq (double)100 INJECT: jmp newmem nop return: registersymbol(INJECT) [DISABLE] INJECT: db DD 9B 98 04 00 00 unregistersymbol(INJECT) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+249F3 "Tutorial-i386.exe"+249CB: E8 40 9F FE FF - call Tutorial-i386.exe+E910 "Tutorial-i386.exe"+249D0: 83 C0 01 - add eax,01 "Tutorial-i386.exe"+249D3: 75 05 - jne Tutorial-i386.exe+249DA "Tutorial-i386.exe"+249D5: B8 01 00 00 00 - mov eax,00000001 "Tutorial-i386.exe"+249DA: A1 A8 79 5A 00 - mov eax,[Tutorial-i386.exe+1A79A8] "Tutorial-i386.exe"+249DF: 89 45 F8 - mov [ebp-08],eax "Tutorial-i386.exe"+249E2: A1 AC 79 5A 00 - mov eax,[Tutorial-i386.exe+1A79AC] "Tutorial-i386.exe"+249E7: 89 45 FC - mov [ebp-04],eax "Tutorial-i386.exe"+249EA: DD 45 F8 - fld qword ptr [ebp-08] "Tutorial-i386.exe"+249ED: DC AB 98 04 00 00 - fsubr qword ptr [ebx+00000498] // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+249F3: DD 9B 98 04 00 00 - fstp qword ptr [ebx+00000498] // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+249F9: FF B3 9C 04 00 00 - push [ebx+0000049C] "Tutorial-i386.exe"+249FF: FF B3 98 04 00 00 - push [ebx+00000498] "Tutorial-i386.exe"+24A05: 8D 45 CC - lea eax,[ebp-34] "Tutorial-i386.exe"+24A08: 50 - push eax "Tutorial-i386.exe"+24A09: B9 04 00 00 00 - mov ecx,00000004 "Tutorial-i386.exe"+24A0E: BA 04 00 00 00 - mov edx,00000004 "Tutorial-i386.exe"+24A13: B8 00 00 00 00 - mov eax,00000000 "Tutorial-i386.exe"+24A18: E8 43 8E 01 00 - call Tutorial-i386.exe+3D860 "Tutorial-i386.exe"+24A1D: 8B 55 CC - mov edx,[ebp-34] "Tutorial-i386.exe"+24A20: 8B 83 70 04 00 00 - mov eax,[ebx+00000470] } ЗЫ: все таки добавлю, ты сравниваешь младшую часть числа при таком сравнении 21 час назад, SergBrNord сказал: cmp [value], 1 jg jump 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 31 марта, 2019 Поделиться Опубликовано 31 марта, 2019 Только что, Garik66 сказал: fstp qword ptr [value] мне кажеться тут проще исползовать команду fistp , а не fstp . тогда сравнеие с 1 будет обычное с целым числом. не ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 31 марта, 2019 Поделиться Опубликовано 31 марта, 2019 14 минут назад, Alex2411 сказал: мне кажеться тут проще исползовать команду fistp , а не fstp . тогда сравнеие с 1 будет обычное с целым числом. не ? не проще Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 31 марта, 2019 Поделиться Опубликовано 31 марта, 2019 1 час назад, Alex2411 сказал: тогда сравнеие с 1 будет обычное с целым числом. не ? да Но не проще, нужно будет также добавить еще одну переменную, смотри скрипт: Спойлер { Game : Tutorial-i386.exe Version: Date : 2019-03-31 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(INJECT,Tutorial-i386.exe,DD 9B 98 04 00 00) // should be unique alloc(newmem,$1000) label(code) label(value) // для сравнения - переводим в 4 байта label(value1) // текущая величина label(sto) // какую хотим label(return) registersymbol(INJECT) newmem: fst qword ptr [value1] fistp qword ptr [value] cmp [value],1 jg jump fld qword ptr [sto] jmp code jump: fld qword ptr [value1] code: fstp qword ptr [ebx+00000498] jmp return value: dq 0 value1: dq 0 sto: dq (double)100 INJECT: jmp newmem nop return: [DISABLE] INJECT: db DD 9B 98 04 00 00 unregistersymbol(INJECT) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+249F3 "Tutorial-i386.exe"+249CB: E8 40 9F FE FF - call Tutorial-i386.exe+E910 "Tutorial-i386.exe"+249D0: 83 C0 01 - add eax,01 "Tutorial-i386.exe"+249D3: 75 05 - jne Tutorial-i386.exe+249DA "Tutorial-i386.exe"+249D5: B8 01 00 00 00 - mov eax,00000001 "Tutorial-i386.exe"+249DA: A1 A8 79 5A 00 - mov eax,[Tutorial-i386.exe+1A79A8] "Tutorial-i386.exe"+249DF: 89 45 F8 - mov [ebp-08],eax "Tutorial-i386.exe"+249E2: A1 AC 79 5A 00 - mov eax,[Tutorial-i386.exe+1A79AC] "Tutorial-i386.exe"+249E7: 89 45 FC - mov [ebp-04],eax "Tutorial-i386.exe"+249EA: DD 45 F8 - fld qword ptr [ebp-08] "Tutorial-i386.exe"+249ED: DC AB 98 04 00 00 - fsubr qword ptr [ebx+00000498] // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+249F3: DD 9B 98 04 00 00 - fstp qword ptr [ebx+00000498] // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+249F9: FF B3 9C 04 00 00 - push [ebx+0000049C] "Tutorial-i386.exe"+249FF: FF B3 98 04 00 00 - push [ebx+00000498] "Tutorial-i386.exe"+24A05: 8D 45 CC - lea eax,[ebp-34] "Tutorial-i386.exe"+24A08: 50 - push eax "Tutorial-i386.exe"+24A09: B9 04 00 00 00 - mov ecx,00000004 "Tutorial-i386.exe"+24A0E: BA 04 00 00 00 - mov edx,00000004 "Tutorial-i386.exe"+24A13: B8 00 00 00 00 - mov eax,00000000 "Tutorial-i386.exe"+24A18: E8 43 8E 01 00 - call Tutorial-i386.exe+3D860 "Tutorial-i386.exe"+24A1D: 8B 55 CC - mov edx,[ebp-34] "Tutorial-i386.exe"+24A20: 8B 83 70 04 00 00 - mov eax,[ebx+00000470] } ЗЫ: fild qword ptr [value] CE не воспринимает, из-за этого приходится вводить вторую переменную value1 ЗЫ1: также сохраняется при использовании value1 точность значения. Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 31 марта, 2019 Поделиться Опубликовано 31 марта, 2019 Только что, Garik66 сказал: Но не проще, нужно будет также добавить еще одну переменную зачем ? мне не понятно . ты забирашь из стека дабл fstp qword ptr [value] и сравниваешь с дабл 1 mov ecx,[Odin+4] cmp [value+4],ecx зачем ? можно забрать из стека как целое и сразу сравнить с целое 1 fistp qword ptr [value] cmp [value],1 так мне кажеться проще. разве нет ? 22 часа назад, SergBrNord сказал: Также, если у кого-то будет желание попробуйте найти инструкцию, отвечающую за ход времени. в смысле скорость игры ? вот для gog версия 1.5.3 . если метку _time поставить 100 то за минуту проходит около 100 лет в игре )) Спойлер [ENABLE] aobscanmodule(INJECT,Tropico.exe,D9 04 85 00 CC 57 00) alloc(newmem,2048) label(_time) label(return) registersymbol(INJECT) registersymbol(_time) newmem: fld dword ptr [_time] jmp return _time: dd (float)1 INJECT: jmp newmem nop nop return: [DISABLE] INJECT: db D9 04 85 00 CC 57 00 unregistersymbol(INJECT) unregistersymbol(_time) dealloc(newmem) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 31 марта, 2019 Поделиться Опубликовано 31 марта, 2019 1 минуту назад, Alex2411 сказал: зачем ? мне не понятно . Поэкспериментируй (например в туториале) станет понятнее. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 31 марта, 2019 Поделиться Опубликовано 31 марта, 2019 34 минуты назад, Alex2411 сказал: зачем ? Да и прочитай первый пост ТС 23 часа назад, SergBrNord сказал: Проблема в том, что jg почему-то не работает. Объясните кто, а? Я попытался объяснить - почему Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 31 марта, 2019 Поделиться Опубликовано 31 марта, 2019 56 минут назад, Garik66 сказал: fild qword ptr [value] CE не воспринимает воспринимает . чит енжин 6.8.3 . не воспринимает fist qword 57 минут назад, Garik66 сказал: из-за этого приходится вводить вторую переменную value1 ее приходиться вводить потому что хитрый туториал оказываеться умеет стрелять половинками патрона )))))) 100 99,5 99 98,5 . поэтому когда переводиться в целое то 98,5 становиться 99 , а обратно пишеться 99 , а не 98,5 потом стреляет снова половинка патрона и патроны не кончаються . тогда конечно работаь не будет . можно мне кажеться для сравнения вобще не выталкивать из стека . ладно я понял )) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 31 марта, 2019 Поделиться Опубликовано 31 марта, 2019 9 минут назад, Alex2411 сказал: хитрый туториал оказываеться умеет стрелять половинками патрона )))))) Он не хитрый, а экономный 9 минут назад, Alex2411 сказал: ладно я понял )) но вообще в FPU есть же свои приемы сравнения. вот например сравнение с 0 в туториале на том же шаге 4 Спойлер Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 31 марта, 2019 Поделиться Опубликовано 31 марта, 2019 В 30.03.2019 в 19:30, SergBrNord сказал: Объясните кто, а? И ещё один скрипт именно с использованием опкодов FPU (все для того же 4 шага): Спойлер { Game : Tutorial-i386.exe Version: Date : 2019-03-31 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(INJECT,Tutorial-i386.exe,DD 9B 98 04 00 00) // should be unique alloc(newmem,$1000) label(code) label(return) newmem: fcom qword ptr [Odin] fstsw ax sahf ja code fstp qword ptr [Value] fld qword ptr [Sto] code: fstp qword ptr [ebx+00000498] jmp return Value: dq 0 Odin: dq (double)1 Sto: dq (double)100 INJECT: jmp newmem nop return: registersymbol(INJECT) [DISABLE] INJECT: db DD 9B 98 04 00 00 unregistersymbol(INJECT) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+249F3 "Tutorial-i386.exe"+249CB: E8 40 9F FE FF - call Tutorial-i386.exe+E910 "Tutorial-i386.exe"+249D0: 83 C0 01 - add eax,01 "Tutorial-i386.exe"+249D3: 75 05 - jne Tutorial-i386.exe+249DA "Tutorial-i386.exe"+249D5: B8 01 00 00 00 - mov eax,00000001 "Tutorial-i386.exe"+249DA: A1 A8 79 5A 00 - mov eax,[Tutorial-i386.exe+1A79A8] "Tutorial-i386.exe"+249DF: 89 45 F8 - mov [ebp-08],eax "Tutorial-i386.exe"+249E2: A1 AC 79 5A 00 - mov eax,[Tutorial-i386.exe+1A79AC] "Tutorial-i386.exe"+249E7: 89 45 FC - mov [ebp-04],eax "Tutorial-i386.exe"+249EA: DD 45 F8 - fld qword ptr [ebp-08] "Tutorial-i386.exe"+249ED: DC AB 98 04 00 00 - fsubr qword ptr [ebx+00000498] // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+249F3: DD 9B 98 04 00 00 - fstp qword ptr [ebx+00000498] // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+249F9: FF B3 9C 04 00 00 - push [ebx+0000049C] "Tutorial-i386.exe"+249FF: FF B3 98 04 00 00 - push [ebx+00000498] "Tutorial-i386.exe"+24A05: 8D 45 CC - lea eax,[ebp-34] "Tutorial-i386.exe"+24A08: 50 - push eax "Tutorial-i386.exe"+24A09: B9 04 00 00 00 - mov ecx,00000004 "Tutorial-i386.exe"+24A0E: BA 04 00 00 00 - mov edx,00000004 "Tutorial-i386.exe"+24A13: B8 00 00 00 00 - mov eax,00000000 "Tutorial-i386.exe"+24A18: E8 43 8E 01 00 - call Tutorial-i386.exe+3D860 "Tutorial-i386.exe"+24A1D: 8B 55 CC - mov edx,[ebp-34] "Tutorial-i386.exe"+24A20: 8B 83 70 04 00 00 - mov eax,[ebx+00000470] } Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 2 апреля, 2019 Автор Поделиться Опубликовано 2 апреля, 2019 (изменено) В 31.03.2019 в 17:06, Garik66 сказал: сравниваешь младшую часть числа при таком сравнении Вот про слона-то я и забыл. Спасибо. В 31.03.2019 в 18:53, Alex2411 сказал: в смысле скорость игры ? вот для gog версия 1.5.3 . если метку _time поставить 100 то за минуту проходит около 100 лет в игре )) В прямом. Хочу периодически сбрасывать таймер на предыдущее значение, чтобы неспеша развиваться. В общем, попробую - отпишусь. Изменено 2 апреля, 2019 пользователем SergBrNord Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 3 апреля, 2019 Поделиться Опубликовано 3 апреля, 2019 В 31.03.2019 в 21:48, Garik66 сказал: И ещё один скрипт именно с использованием опкодов FPU Ты тут только портишь eax занося в него флаги, может он там где-то используется дальше? Можно сделать: push eax fstsw ax sahf pop eax Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 3 апреля, 2019 Поделиться Опубликовано 3 апреля, 2019 2 минуты назад, imaginary сказал: Ты тут только портишь eax занося в него флаги, может он там где-то используется дальше? eax перезаписывается дальше по игровому коду, смотри ЛОГИ: Спойлер "Tutorial-i386.exe"+249F3: DD 9B 98 04 00 00 - fstp qword ptr [ebx+00000498] // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+249F9: FF B3 9C 04 00 00 - push [ebx+0000049C] "Tutorial-i386.exe"+249FF: FF B3 98 04 00 00 - push [ebx+00000498] "Tutorial-i386.exe"+24A05: 8D 45 CC - lea eax,[ebp-34] // вот здесь Поэтому и использовал этот регистр, чтобы не юзать push/pop (я так всегда делаю и в своих уроках называю такой регистр "свободным") Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 3 апреля, 2019 Поделиться Опубликовано 3 апреля, 2019 Только что, Garik66 сказал: eax перезаписывается дальше по игровому коду Вижу, да тут ты прав Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 3 апреля, 2019 Поделиться Опубликовано 3 апреля, 2019 1 минуту назад, imaginary сказал: Вижу, да тут ты прав только тут? Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 9 апреля, 2019 Автор Поделиться Опубликовано 9 апреля, 2019 Вот что получилось в итоге: https://cloud.mail.ru/public/Epw3/zyuepyAiq В таблице есть только бесплатное строительство =( На значение счётчика времени (чтобы его сбрасывать) так и не вышел, хоть очень и хотел. Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 9 апреля, 2019 Поделиться Опубликовано 9 апреля, 2019 2 часа назад, SergBrNord сказал: На значение счётчика времени (чтобы его сбрасывать) так и не вышел, хоть очень и хотел. это инстркции обращаються к счетчику времени Tropico.EXE+88C3A,a1xxxxxxxx8bxx81xxxxxxxxxx3b Tropico.EXE+F0506,66xxxx33xx8axxxxxx8bxxxxxxxxxxxxe8xxxxxxxxxx68 есть еще и другие , но только эти не останавливаються когда время на паузе . счетчик времени число AABBCCCC . CCCC это год BB это месяц AA час . часов вроде 28 в сутки )) менять время назад осторожно . игра может виснуть 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения