SerVick Опубликовано 14 февраля, 2016 Поделиться Опубликовано 14 февраля, 2016 Всем доброго времени суток! Профессионалы читинга помогите понять в чём ошибка. В общем в очень хорошей игре называется "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) Интересует именно бессмертие коня, если можете помогите понять в чём ошибаюсь. А игра просто замечательная. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 14 февраля, 2016 Поделиться Опубликовано 14 февраля, 2016 (изменено) Не знаю проверил ли ты или нет, с какими адресами работает твоя инструкция. Если не с одним адресом, то нужно делать фильтр. Если инструкция работает только с НР твоей лошадки, то объясню как нужно написать твой скрипт. инструкция 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) Изменено 16 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
SerVick Опубликовано 15 февраля, 2016 Автор Поделиться Опубликовано 15 февраля, 2016 Да конечно проверял, работает не с одним адресом,, вернее с адресами (насколько я понял) коней и когда в мисси с адресами персов, которых надо спасти, или защитить, но не врагов. Но это я думаю не страшно, возможно и шкалу времени на спасение перса подвешивают. Просто смещение там тоже было + 28. Спасибо Garik66, завтра попробую. Сейчас просто нет времени, надо на работу... . Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 15 февраля, 2016 Поделиться Опубликовано 15 февраля, 2016 В 15.02.2016 в 01:50, 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) Ссылка на комментарий Поделиться на другие сайты Поделиться
SerVick Опубликовано 16 февраля, 2016 Автор Поделиться Опубликовано 16 февраля, 2016 Спасибо LIRW и Garik66 за помощь. предложенный вариант (fstp dword ptr [esi+28]) срабатывает, но он "глючный". Получается такой глюк: 1) шкала жизни показывает 0, 2) если слезть с коня, то остаётся только седло, а на другого коня не появляется команды (в седло), соответственно думаю будут ещё какие -то глюки. Ребята вот я конечно не спец в ассемблере, но почитал что "ret" отнимает указанное число байт, Но до конца понять не смог что происходит в этом месте. В общем в моём понимании после "pop" прыгает на смещение +24, если моё предположение правильно, то в оригинальном скрипте достаточно изменить "ret" на аналог "ret" , только что бы он прибавлял. Или я заблудился... . Эта инструкция работает с другими адресами, но получается с одним адресом. Т.е. дружественные персы, или транспорт. НПС - животные на других адресах. Т.е. фильтр здесь не понадобится. Буду пробовать предложенные варианты. Вечером отпишусь. В 15.02.2016 в 09:32, 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) Показать Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 февраля, 2016 Поделиться Опубликовано 16 февраля, 2016 (изменено) В 16.02.2016 в 03:40, 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) SerVick LIRW проверил не работает как нужно. По-видимому связанно с выбранной тобою инструкцией. Изменено 16 февраля, 2016 пользователем Garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 16 февраля, 2016 Поделиться Опубликовано 16 февраля, 2016 Ну как это на других не работает. Вот задание на пример - убить бозонов там в игре. Вот посмотри как инструкции не работают с ними. Я ещо давно как то в этой игре ковырялся и особо то не подумал об этом... А потом вот квест у меня был - лошадью задавить надо было копытами этих животных. Я давил их наверное с пол часа - пока не дошло, что они тоже бессмертны... Но брал другую конечно инструкцию. А что самое интересное, у меня не исчезает не чего и работает всё как надо. Вот последний скрипт который дал - всё работает как надо. В лошадь стреляешь и в неё записывается около 1000 здоровья. Другие животные уходят в никуда. Так как для каждого животного свои максимальные адреса здоровья. Вот у этого бозона - по моему 200 (если память не изменяет) могу ошибаться, так как в день по сколько игр смотрю и не упомнишь где что было. Единственное в трейнере деньги не сделал.. Я их как то делал, но они у некоторых не работали. А делал через указатель, так как на этом адресе висит инструкций с 30 - не известно каких. Там в принципе деньги то нужны только один раз. Любой их может какой не будь артманей взломать. Да и зачем эти деньги в игре ??? они только для улучшения оружия, но не для покупки его.. На пример увеличенный магазин или прибавка к скорострельности. Патроны там и так в трейнере бесконечные, скорострельность зависит уже от тебя - можно повесить скрипт на мышь и будешь стрелять как с автомата.. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 февраля, 2016 Поделиться Опубликовано 16 февраля, 2016 (изменено) В 14.02.2016 в 20:14, SerVick сказал: если можете помогите понять в чём ошибаюсь. Показать SerVic чтобы заработал мой первый скрипт из сообщения Нужно чтобы ты сделал АА скрипт из инструкции повыше этой fstp dword ptr [esi+28], чтобы в инъекцию не попадала инструкция ret 0004 и выложил сюда. Поправлю скрипт и будет работать как нужно. Все глюки произошли именно из-за ret 0004. Показать контент если команда ret имеет операнд, то увеличить содержимое esp/sp на величину операнда число; при этом учитывается атрибут режима адресации — use16 или use32: если use16, то sp=(sp+число), то есть указатель стека сдвигается на число байт, равное значению число; если use32, то sp=(sp+2*число), то есть указатель стека сдвигается на число слов, равное значению число. Изменено 16 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
SerVick Опубликовано 16 февраля, 2016 Автор Поделиться Опубликовано 16 февраля, 2016 Парни огромное спасибо!!! За помощь и время уделённое мне. Извиняюсь, что ввёл вас в заблуждение... , действительно инструкции работают с другими "неписями" т.е смещение +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 . Просто хочется не просто списать, а понять что происходит в коде... . Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 февраля, 2016 Поделиться Опубликовано 16 февраля, 2016 (изменено) 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 } Фильтр же найдёшь? Изменено 16 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 17 февраля, 2016 Поделиться Опубликовано 17 февраля, 2016 В 16.02.2016 в 18:23, SerVick сказал: Garik66, если не трудно напиши не большие комментарии, к коду. А именно почему в квадратных скобках слова, а не регистр и что такое dd . Просто хочется не просто списать, а понять что происходит в коде... . Показать Ты про скрипт, что в этом сообщении Так про него мне Женька (LIRW) сказал что он не рабочий. Зачем его тогда комментировать. Вон лучше возьми скрипт из предыдущего сообщения - он рабочий и как он работает я уже объяснял выше (во втором посте топика). Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 17 февраля, 2016 Поделиться Опубликовано 17 февраля, 2016 Скрипт на денюжки, попросил Женя написать для проверки. Показать контент { 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
SerVick Опубликовано 17 февраля, 2016 Автор Поделиться Опубликовано 17 февраля, 2016 В 16.02.2016 в 06: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 спасибо! Скрипт работает как надо, только к нему ещё буду мудрить фильтр. Без него все бессмертными становятся. Ссылка на комментарий Поделиться на другие сайты Поделиться
SerVick Опубликовано 17 февраля, 2016 Автор Поделиться Опубликовано 17 февраля, 2016 Garick66 и LIRW огромное вам спасибо!!! Очень помогли, правда я ещё ни когда не искал по ID, но думаю - это уже не проблема... . Материал по этой теме есть, почитаю. Главное сейчас благодаря вам многое стало понятней. Конечно пробелов много. Но как говорят терпение и труд... . Ещё раз огромное спасибо!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 18 февраля, 2016 Поделиться Опубликовано 18 февраля, 2016 (изменено) В 17.02.2016 в 16:36, SerVick сказал: Скрипт работает как надо Показать Ну раз скрипт работает как надо , то отвечу на: В 16.02.2016 в 18: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) Изменено 18 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения