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

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

Салют всем.

Решил я поломать Тропико 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.

Отвечу завтра, спать хочу неимоверно...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
26 минут назад, SergBrNord сказал:

Проблема в том, что jg почему-то не работает. Объясните кто, а?

 

26 минут назад, SergBrNord сказал:

cmp [value], 1

сам пишешь 

 

27 минут назад, SergBrNord сказал:

из точечного стека

а сравниваешь с 1.
Конечно не будет работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
18 часов назад, Garik66 сказал:

 

сам пишешь 

 

а сравниваешь с 1.
Конечно не будет работать.

Почему? С JL всё прекрасно работает. С JG — нет.

Изменено пользователем SergBrNord

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, Garik66 сказал:

fstp qword ptr [value]

 

мне кажеться  тут  проще исползовать команду fistp , а не fstp . тогда  сравнеие с 1  будет обычное с  целым числом. не ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
14 минут назад, Alex2411 сказал:

 

мне кажеться  тут  проще исползовать команду fistp , а не fstp . тогда  сравнеие с 1  будет обычное с  целым числом. не ?

не проще

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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 точность значения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, Alex2411 сказал:

зачем ?  мне не понятно .

Поэкспериментируй (например в туториале) станет понятнее. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
34 минуты назад, Alex2411 сказал:

зачем ?

Да и прочитай первый пост ТС

23 часа назад, SergBrNord сказал:

Проблема в том, что jg почему-то не работает. Объясните кто, а?

Я попытался объяснить - почему:-D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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 потом  стреляет снова половинка патрона  и патроны  не кончаються . тогда  конечно  работаь  не будет .  можно мне кажеться  для сравнения вобще  не выталкивать  из стека .

ладно  я понял ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
9 минут назад, Alex2411 сказал:

хитрый  туториал  оказываеться умеет стрелять  половинками  патрона ))))))

Он не хитрый, а экономный :lol:

 

9 минут назад, Alex2411 сказал:

ладно  я понял ))

но вообще в FPU есть же свои приемы сравнения.

вот например сравнение с 0 в туториале на том же шаге 4

Спойлер

image.thumb.png.5e6f148080815c072af3ccf3e0c0c0c3.png

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 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]
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 31.03.2019 в 17:06, Garik66 сказал:

сравниваешь младшую часть числа при таком сравнении 

 

Вот про слона-то я и забыл. Спасибо.

 

В 31.03.2019 в 18:53, Alex2411 сказал:

в смысле  скорость игры ?  вот для gog версия  1.5.3 .  если метку  _time поставить  100 то за минуту  проходит  около 100 лет  в игре ))

 

В прямом. Хочу периодически сбрасывать таймер на предыдущее значение, чтобы неспеша развиваться. В общем, попробую - отпишусь.

Изменено пользователем SergBrNord

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 31.03.2019 в 21:48, Garik66 сказал:

И ещё один скрипт именно с использованием опкодов FPU

Ты тут только портишь eax занося в него флаги, может он там где-то используется дальше?
Можно сделать:

push eax
fstsw ax
sahf
pop eax

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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 (я так всегда делаю и в своих уроках называю такой регистр "свободным")

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, Garik66 сказал:

eax перезаписывается дальше по игровому коду

Вижу, да тут ты прав

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, imaginary сказал:

Вижу, да тут ты прав

 

:-D только тут?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот что получилось в итоге:

https://cloud.mail.ru/public/Epw3/zyuepyAiq

 

В таблице есть только бесплатное строительство =(

На значение счётчика времени (чтобы его сбрасывать) так и не вышел, хоть очень и хотел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, SergBrNord сказал:

На значение счётчика времени (чтобы его сбрасывать) так и не вышел, хоть очень и хотел.

 

 

это инстркции  обращаються к  счетчику времени

Tropico.EXE+88C3A,a1xxxxxxxx8bxx81xxxxxxxxxx3b
Tropico.EXE+F0506,66xxxx33xx8axxxxxx8bxxxxxxxxxxxxe8xxxxxxxxxx68

есть еще  и другие , но только эти не  останавливаються  когда время  на  паузе .
счетчик времени  число  AABBCCCC  . CCCC это  год   BB это  месяц  AA  час .  часов  вроде 28  в сутки ))

менять  время назад  осторожно . игра может  виснуть

  • Плюс 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×

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

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