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

В чём моя ошибка в скрипте в СЕ


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

Всем доброго времени суток! Профессионалы читинга помогите понять в чём ошибка. В общем в очень хорошей игре называется "Gun" пытаюсь сделать бессмертными лошадей (жалко, что такие милые животные страдают). В общем исходя из знаний, которые под черпнул от уважаемых: Keng, Coder, MasterGH получилось во многих играх сделать читы в частности и в этой: - бессмертие, без перезарядки, беск. спринт лошади, а вот здоровье оной не выходит. Привожу оба варианта скрипта:

 

1 -ый вариант:

Скрытый текст

[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem:
fstp dword ptr [esi+c4] -  этом смещении тоже значение фл. 350)
fld dword ptr [esi+28]  - (значение полного здоровья лошади = (float)350, адрес рабочий ДМА)
originalcode:
fstp dword ptr [esi+28]
pop esi
ret 0004
exit:
jmp returnhere
"Gun.exe"+1447EE:
jmp newmem
nop
nop
returnhere:
[DISABLE]
"Gun.exe"+1447EE:
fstp dword ptr [esi+28]
pop esi
ret 0004
dealloc(newmem)

 

 

2 - ой вариант:

Скрытый текст

[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)

newmem:
push edx - (регистр edx не используется игрой)
mov edx,(float)350
mov dword ptr [esi+28],edx
pop edx

originalcode:
fstp dword ptr [esi+28]
pop esi
ret 0004

exit:
jmp returnhere
"Gun.exe"+1447EE:
jmp newmem
nop
nop
returnhere:

[DISABLE]
"Gun.exe"+1447EE:
fstp dword ptr [esi+28]
pop esi
ret 0004
dealloc(newmem)

 

Интересует именно бессмертие коня, если можете помогите понять в чём ошибаюсь.

А игра просто замечательная.

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

Не знаю проверил ли ты или нет, с какими адресами работает твоя инструкция.

Если не с одним адресом, то нужно делать фильтр.

Если инструкция работает только с НР твоей лошадки, то объясню как нужно написать твой скрипт.

инструкция

fstp dword ptr [esi+28]

нам указывает, что в регистре FPU st(0) лежит текущее значение НР, т.е чтобы лошадка   стало бессмертной тебе нужно заменить значение в этом регистре на максимальноe, как быстрее это сделать, смотри скрипт:

Скрытый текст

[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
 
newmem:
fstp dword ptr [esi+28] // выгрузим из st(0) ненужное нам значение st(0)
fld dword ptr [esi+2c] // и загрузим нужное значение. Вот и всё. 
 
originalcode:
fstp dword ptr [esi+28]
pop esi
ret 0004
jmp returnhere

"Gun.exe"+1447EE:
jmp newmem
nop
nop
returnhere:
 
[DISABLE]
"Gun.exe"+1447EE:
fstp dword ptr [esi+28]
pop esi
ret 0004
dealloc(newmem)

 

Если окажется, что в найденном тобою смещении "[esi+c4] - (в этом смещении тоже значение фл. 350)" значение не постоянно и меняется, то можно переписать скрипт так:

Скрытый текст

[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(HP_horse)
 
newmem:
fstp dword ptr [esi+28]   // выгрузим из st(0) ненужное нам значение st(0)
fld dword ptr [HP_horse] // и загрузим нужное значение. Вот и всё. 
 
originalcode:
fstp dword ptr [esi+28]
pop esi
ret 0004 
jmp returnhere

HP_horse:
dd (float)350

"Gun.exe"+1447EE:
jmp newmem
nop
nop
returnhere:
 
[DISABLE]
"Gun.exe"+1447EE:
fstp dword ptr [esi+28]
pop esi
ret 0004
dealloc(newmem)

 

 

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

Да конечно проверял, работает не с одним адресом,, вернее с адресами (насколько я понял) коней и когда в мисси с адресами персов, которых надо спасти, или защитить, но не врагов. Но это я думаю не страшно, возможно и шкалу времени на спасение перса подвешивают. Просто смещение там тоже было + 28. Спасибо Garik66, завтра попробую. Сейчас просто нет времени, надо на работу... .

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

8 часов назад, SerVick сказал:

Да конечно проверял, работает не с одним адресом,, вернее с адресами (насколько я понял) коней и когда в мисси с адресами персов, которых надо спасти, или защитить, но не врагов. Но это я думаю не страшно, возможно и шкалу времени на спасение перса подвешивают. Просто смещение там тоже было + 28. Спасибо Garik66, завтра попробую. Сейчас просто нет времени, надо на работу... .

Как это не страшно.. А миссия будет убить на пример животных ??? ты будешь стрелять по ним бесконечно - даже не поняв то, что дело всё в кривой опции. 

Вот так бы хотя бы сделать тебе надо.. На других инструкция пролетает здоровье. Фильтр на максимальном здоровье идет - от других животных. Лошадей в игре убивать вроде как не надо.  

Скрытый текст

[ENABLE]

aobscanmodule(Heallll,Gun.exe,D8 6E * D8 15 * * * * D9 56 * DF E0 F6 C4 * 7A * DD D8 D9 05 * * * * D9 5E * 5E)
alloc(newmem,$1000)

label(code)
label(return)

newmem:
   cmp [esi+2C],(float)350
   jne code
   mov dword ptr [esi+28],(float)1000

code:
  fsubr dword ptr [esi+28]
  fcom dword ptr [Gun.exe+2A7D40]
  jmp return

Heallll:
  jmp newmem
  nop
  nop
  nop
  nop
return:
registersymbol(Heallll)

[DISABLE]

Heallll:
  db D8 6E 28 D8 15 40 7D 6A 00

unregistersymbol(Heallll)
dealloc(newmem)

 

 

 

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

Спасибо LIRW и Garik66 за помощь. предложенный вариант (fstp dword ptr  [esi+28]) срабатывает, но он "глючный". Получается такой глюк: 1) шкала жизни показывает 0, 2) если слезть с коня, то остаётся только седло, а на другого коня не появляется команды (в седло), соответственно думаю будут ещё какие -то глюки. Ребята вот я конечно не спец в ассемблере, но почитал что  "ret" отнимает указанное число байт, Но до конца понять не смог что происходит в этом месте. В общем в моём понимании после "pop" прыгает на смещение +24, если моё предположение правильно, то в оригинальном скрипте достаточно изменить "ret" на аналог "ret" , только что бы он прибавлял. Или я заблудился... . Эта инструкция работает с другими адресами, но получается с одним адресом. Т.е. дружественные персы, или транспорт. НПС - животные на других адресах. Т.е. фильтр здесь не понадобится. Буду пробовать предложенные варианты. Вечером отпишусь.

18 час назад, LIRW сказал:

Как это не страшно.. А миссия будет убить на пример животных ??? ты будешь стрелять по ним бесконечно - даже не поняв то, что дело всё в кривой опции. 

Вот так бы хотя бы сделать тебе надо.. На других инструкция пролетает здоровье. Фильтр на максимальном здоровье идет - от других животных. Лошадей в игре убивать вроде как не надо.  

  Показать содержимое


[ENABLE]

aobscanmodule(Heallll,Gun.exe,D8 6E * D8 15 * * * * D9 56 * DF E0 F6 C4 * 7A * DD D8 D9 05 * * * * D9 5E * 5E)
alloc(newmem,$1000)

label(code)
label(return)

newmem:
   cmp [esi+2C],(float)350
   jne code
   mov dword ptr [esi+28],(float)1000

code:
  fsubr dword ptr [esi+28]
  fcom dword ptr [Gun.exe+2A7D40]
  jmp return

Heallll:
  jmp newmem
  nop
  nop
  nop
  nop
return:
registersymbol(Heallll)

[DISABLE]

Heallll:
  db D8 6E 28 D8 15 40 7D 6A 00

unregistersymbol(Heallll)
dealloc(newmem)

 

 

 

 

 

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

5 часов назад, SerVick сказал:

fstp dword ptr  [esi+28]) срабатывает, но он "глючный"

Глючный из-за операнда ret, если бы его не было, то скрипт сработал бы нормально. Я удалял из st(0) значение в  [esi+28], чтобы не вводить дополнительную переменную. Так что нужно ввести ещё переменную.

Попробуй ещё один скрипт:

Скрытый текст

[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(HP_horse)
label(deletion)
 
newmem:
fstp dword ptr [deletion] // выгрузим из st(0) ненужное нам значение st(0)
fld dword ptr [HP_horse]  // и загрузим нужное значение. Вот и всё. 
 
originalcode:
fstp dword ptr [esi+28]
pop esi
ret 0004 
jmp returnhere

HP_horse:
dd (float)350
deletion:
dd 00

"Gun.exe"+1447EE:
jmp newmem
nop
nop
returnhere:
 
[DISABLE]
"Gun.exe"+1447EE:
fstp dword ptr [esi+28]
pop esi
ret 0004
dealloc(newmem)

 

LIRW проверил не работает как нужно.

По-видимому связанно с выбранной тобою инструкцией.

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

Ну как это на других не работает. Вот задание на пример - убить бозонов там в игре. Вот посмотри как инструкции не работают с ними. Я ещо давно как то в этой игре ковырялся и особо то не подумал об этом... А потом вот квест у меня был - лошадью задавить надо было копытами этих животных. Я давил их наверное с пол часа - пока не дошло, что они тоже бессмертны... Но брал другую конечно инструкцию. А что самое интересное, у меня не исчезает не чего и работает всё как надо. Вот последний скрипт который дал - всё работает как надо. В лошадь стреляешь и в неё записывается около 1000 здоровья. Другие животные уходят в никуда. Так как для каждого животного свои максимальные адреса здоровья. Вот у этого бозона - по моему 200 (если память не изменяет) могу ошибаться, так как в день по сколько игр смотрю и не упомнишь где что было. Единственное в трейнере деньги не сделал.. Я их как то делал, но они у некоторых не работали. А делал через указатель, так как на этом адресе висит инструкций с 30 - не известно каких. Там в принципе деньги то нужны только один раз. Любой их может какой не будь артманей взломать. Да и зачем эти деньги в игре ??? они только для улучшения оружия, но не для покупки его.. На пример увеличенный магазин или прибавка к скорострельности. Патроны там и так в трейнере бесконечные, скорострельность зависит уже от тебя - можно повесить скрипт на мышь и будешь стрелять как с автомата..

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

В 14.02.2016в23:14, SerVick сказал:

если можете помогите понять в чём ошибаюсь.

чтобы заработал мой первый скрипт из сообщения 

Нужно чтобы ты сделал АА скрипт из инструкции повыше этой fstp dword ptr [esi+28], чтобы в инъекцию не попадала инструкция ret 0004 и выложил сюда.

Поправлю скрипт и будет работать как нужно.

Все глюки произошли именно из-за ret 0004.

Скрытый текст
  • если команда ret имеет операнд, то увеличить содержимое esp/sp на величину операнда число; при этом учитывается атрибут режима адресации — use16 или use32:
    • если use16, то sp=(sp+число), то есть указатель стека сдвигается на число байт, равное значению число;
    • если use32, то sp=(sp+2*число), то есть указатель стека сдвигается на число слов, равное значению число.

 

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

Парни огромное спасибо!!! За помощь и время уделённое мне. Извиняюсь, что ввёл вас в заблуждение... , действительно инструкции работают с другими "неписями" т.е смещение +28 текущее здоровье и врагов и т.д. В общем без фильтра не обойтись. Проверил на одной из предложенных инструкций: 

fsubr dword ptr [esi+28]. Т.е. [esi+28] = текущее здоровье, [esi+2с] = макс. здоровье. Вот, только не пойму почему в этом коде тоже враги стали бессмертными вместе с лошадью?


 

Скрытый текст

fstp dword ptr [deletion]
fld dword ptr [HP_horse]


originalcode:
fstp dword ptr [esi+28]
pop esi
ret 0004


jmp returnhere

HP_horse:
dd (float)350
deletion:
dd 00


"Gun.exe"+1447EE:
jmp newmem
nop
nop
returnhere:

 

 

Думаю как не крути, а без фильтра не обойтись. Буду напрягать извилины как в подобных кодах фильтр вставить... . 

Garik66 и LIRW огромное спасибо за помощь!!! Garik66, если не трудно напиши не большие комментарии, к коду. А  именно почему в квадратных скобках слова, а не регистр и что такое dd . Просто хочется не просто списать, а понять что происходит в коде... .

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

SerVick Не дождался от тебя скрипта. Скачал игру.

Вот рабочий скрипт, только нужно сделать нормальный фильтр (не по максимальным значениям жизни а по ID):

Скрытый текст

{ Game   : Gun.exe
  Version: 
  Date   : 2016-02-16
  Author : Garik66

  This script does blah blah blah
}

[ENABLE]

aobscanmodule(Horse,Gun.exe,D9 05 40 7D 6A 00 D9 5E 28 5E) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:

code:
  fld dword ptr [Gun.exe+2A7D40]
  fstp dword ptr [esi+28]    // выгрузим из st(0) ненужное нам значение st(0)
  fld dword ptr [esi+2c]     // и загрузим нужное значение. Вот и всё. 
  jmp return

Horse:
  jmp code
  nop
return:
registersymbol(Horse)

[DISABLE]

Horse:
  db D9 05 40 7D 6A 00

unregistersymbol(Horse)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Gun.exe"+1447E8

"Gun.exe"+1447CA: 75 25              -  jne Gun.exe+1447F1
"Gun.exe"+1447CC: D9 44 24 08        -  fld dword ptr [esp+08]
"Gun.exe"+1447D0: D8 4E 34           -  fmul dword ptr [esi+34]
"Gun.exe"+1447D3: D8 6E 28           -  fsubr dword ptr [esi+28]
"Gun.exe"+1447D6: D8 15 40 7D 6A 00  -  fcom dword ptr [Gun.exe+2A7D40]
"Gun.exe"+1447DC: D9 56 28           -  fst dword ptr [esi+28]
"Gun.exe"+1447DF: DF E0              -  fnstsw ax
"Gun.exe"+1447E1: F6 C4 05           -  test ah,05
"Gun.exe"+1447E4: 7A 08              -  jp Gun.exe+1447EE
"Gun.exe"+1447E6: DD D8              -  fstp st(0)
// ---------- INJECTING HERE ----------
"Gun.exe"+1447E8: D9 05 40 7D 6A 00  -  fld dword ptr [Gun.exe+2A7D40]
// ---------- DONE INJECTING  ----------
"Gun.exe"+1447EE: D9 5E 28           -  fstp dword ptr [esi+28]
"Gun.exe"+1447F1: 5E                 -  pop esi
"Gun.exe"+1447F2: C2 04 00           -  ret 0004
"Gun.exe"+1447F5: CC                 -  int 3 
"Gun.exe"+1447F6: CC                 -  int 3 
"Gun.exe"+1447F7: CC                 -  int 3 
"Gun.exe"+1447F8: CC                 -  int 3 
"Gun.exe"+1447F9: CC                 -  int 3 
"Gun.exe"+1447FA: CC                 -  int 3 
"Gun.exe"+1447FB: CC                 -  int 3 
}

 

Фильтр же найдёшь?

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

 

15 час назад, SerVick сказал:

Garik66, если не трудно напиши не большие комментарии, к коду. А  именно почему в квадратных скобках слова, а не регистр и что такое dd . Просто хочется не просто списать, а понять что происходит в коде... .

Ты про скрипт, что в этом сообщении

 

Так про него мне Женька (LIRW) сказал что он не рабочий. Зачем его тогда комментировать. Вон лучше возьми скрипт из предыдущего сообщения - он рабочий и как он работает я уже объяснял выше (во втором посте топика).

 

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

Скрипт на денюжки, попросил Женя написать для проверки.

Скрытый текст

{ Game   : Gun.exe
  Version: 
  Date   : 2016-02-17
  Author : Garik66

  This script does blah blah blah
}

[ENABLE]
{$LUA}
PlaySound(findTableFile([[Activate]]))
{$ASM}
aobscanmodule(Money,Gun.exe,02 88 4E 01 8B 50 0C 89 56 08) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
label(flag)
registersymbol(flag)
registersymbol(Money)

newmem:
  cmp [flag],1
  jne code
  cmp [eax+70],5
  jne code
  mov [flag],0
  add [eax+0C],#1000

code:
  mov edx,[eax+0C]
  mov [esi+08],edx
  jmp return

flag:
dd 0

Money+04:
  jmp newmem
  nop
return:

[DISABLE]
{$LUA}
PlaySound(findTableFile([[Deactivate]]))
{$ASM}
Money+04:
  db 8B 50 0C 89 56 08

unregistersymbol(flag)
unregistersymbol(Money)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Gun.exe"+20E6B

"Gun.exe"+20E51: 80 CA 04              -  or dl,04
"Gun.exe"+20E54: 88 56 01              -  mov [esi+01],dl
"Gun.exe"+20E57: 8B 40 0C              -  mov eax,[eax+0C]
"Gun.exe"+20E5A: 89 46 08              -  mov [esi+08],eax
"Gun.exe"+20E5D: 5E                    -  pop esi
"Gun.exe"+20E5E: C3                    -  ret 
"Gun.exe"+20E5F: 8A 4E 01              -  mov cl,[esi+01]
"Gun.exe"+20E62: 80 E1 01              -  and cl,01
"Gun.exe"+20E65: 80 C9 02              -  or cl,02
"Gun.exe"+20E68: 88 4E 01              -  mov [esi+01],cl
// ---------- INJECTING HERE ----------
"Gun.exe"+20E6B: 8B 50 0C              -  mov edx,[eax+0C]
"Gun.exe"+20E6E: 89 56 08              -  mov [esi+08],edx
// ---------- DONE INJECTING  ----------
"Gun.exe"+20E71: 5E                    -  pop esi
"Gun.exe"+20E72: C3                    -  ret 
"Gun.exe"+20E73: 8A 4E 01              -  mov cl,[esi+01]
"Gun.exe"+20E76: 80 E1 01              -  and cl,01
"Gun.exe"+20E79: 80 C9 1A              -  or cl,1A
"Gun.exe"+20E7C: 88 4E 01              -  mov [esi+01],cl
"Gun.exe"+20E7F: 8B 50 0C              -  mov edx,[eax+0C]
"Gun.exe"+20E82: 89 56 08              -  mov [esi+08],edx
"Gun.exe"+20E85: 5E                    -  pop esi
"Gun.exe"+20E86: C3                    -  ret 
}

 

Для Gan табличка для денюжков.

1. Войти в меню торговли.

2. Numpad +  -  + 1000 монет.

Gun.CT

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

В 16.02.2016в09:48, Garik66 сказал:

Глючный из-за операнда ret, если бы его не было, то скрипт сработал бы нормально. Я удалял из st(0) значение в  [esi+28], чтобы не вводить дополнительную переменную. Так что нужно ввести ещё переменную.

Попробуй ещё один скрипт:

  Скрыть содержимое


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(HP_horse)
label(deletion)
 
newmem:
fstp dword ptr [deletion] // выгрузим из st(0) ненужное нам значение st(0)
fld dword ptr [HP_horse]  // и загрузим нужное значение. Вот и всё. 
 
originalcode:
fstp dword ptr [esi+28]
pop esi
ret 0004 
jmp returnhere

HP_horse:
dd (float)350
deletion:
dd 00

"Gun.exe"+1447EE:
jmp newmem
nop
nop
returnhere:
 
[DISABLE]
"Gun.exe"+1447EE:
fstp dword ptr [esi+28]
pop esi
ret 0004
dealloc(newmem)

 

SerVick

LIRW проверил не работает как нужно.

По-видимому связанно с выбранной тобою инструкцией.

Garik66 спасибо! Скрипт работает как надо, только к нему ещё буду мудрить фильтр. Без него все бессмертными становятся.

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

Garick66 и LIRW огромное вам спасибо!!! Очень помогли, правда я ещё ни когда не искал по ID, но думаю - это уже не проблема... . Материал по этой теме есть, почитаю. Главное сейчас благодаря вам многое стало понятней. Конечно пробелов много. Но как говорят терпение и труд... . Ещё раз огромное спасибо!!!

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

15 час назад, SerVick сказал:

Скрипт работает как надо

Ну раз скрипт работает как надо :), то отвечу на:

 

В 16.02.2016в21:23, SerVick сказал:

Garik66, если не трудно напиши не большие комментарии, к коду.

Что мы сделали, записав в скрипт:

label(HP_horse)
HP_horse:
dd (float)350

мы выделили в ранее выделенной памяти  

alloc(newmem,2048)

кусочек памяти, в нашем случае 4 байта, который мы можем использовать как нам нужно. В данном скрипте мы в этих 4 байтах храним максимальное НР лошадки.

Можно сформулировать не много по другому - мы создали указатель, т.е. HP_horse - это сам указатель, а по смещению 0 -лежит максимальное НР лошадки, т.е. [HP_horse+0] или просто  [HP_horse] = (float)350.

Название это кусочка мы даём сами для удобства (для нашего понимания) - HP_horse -  НР лошадки, deletion - удаление, т.е. в нашем примере эту память используем для удаления значения в st(0).

Ну ещё добавлю при такой записи:

label(HP_horse)
HP_horse:
dd (float)350

мы можем использовать HP_horse только внутри данного скрипта, т.е. локально.

Для того чтобы использовать HP_horse в других скриптах, в таблице СЕ, нужно добавить ещё две записи в скрипт:

label(HP_horse)
registersymbol(HP_horse)
--------
--------
HP_horse:
dd (float)350
--------
--------
unregistersymbol(HP_horse)  

или можем записать иначе:

globalalloc(HP_horse, 4)
-------
-------
dealloc(HP_horse)  

 

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

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

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

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