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

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

Салют всем.

Решил я поломать Тропико 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
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

 

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

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

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

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

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

 

 

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

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

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

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

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

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

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