RockHammer Опубликовано 22 ноября, 2014 Поделиться Опубликовано 22 ноября, 2014 (изменено) Всем привет! Продолжаю взлом FC4. И т.к. на одной и той же версии игры может быть несколько разных таблеток - решил сделать свой трейнер более универсальным.А именно - припилить AOBScan. Все шло хорошо, перебил на новый лад: огенестрел, очки навыков, деньги... Но с особенными патронами случилась какая-то беда.Вот код:Но почему-то он не работает.Кстати, для сравнения - вот код, который работает через простую инъекцию:И он прекрасно работает.Вот то, что стоит между нашей инструкцией из мемори вьювера: Так в чем же проблема?[ENABLE]alloc(newmem,2048,FC64.dll+B87009) label(returnhere)label(ammo) //создаем метку ammoregistersymbol(ammo) aobscan(aob_ammo, 89 03 48 8B 5C 24 30 C6 47 39 01) //создаем функцию aobscan с нашим адресом и байтамиnewmem:mov [rbx],eaxmov [rbx],10 //записываю в регистр rbx значение 10.mov rbx,[rsp+30]//mov [rbx],eax --- оригинальный код, который присутствовал в метке Originalcode//mov rbx,[rsp+30] --- origcodeaob_ammo:ammo:jmp newmemnopreturnhere:[DISABLE]dealloc(newmem)unregistersymbol(ammo) //уничтожаем метку ammoammo:mov [rbx],eax // возвращаем оригинальный кодmov rbx,[rsp+30]//Alt: db 89 03 48 8B 5C 24 30[ENABLE]//code from here to '[DISABLE]' will be used to enable the cheatalloc(newmem,2048,"FC64.dll"+B87009) label(returnhere)label(originalcode)label(exit)newmem:originalcode:mov [rbx],eaxmov [rbx],10mov rbx,[rsp+30]exit:jmp returnhere"FC64.dll"+B87009:jmp newmemnopnopreturnhere:[DISABLE]"FC64.dll"+B87009:mov [rbx],eaxmov rbx,[rsp+30]dealloc(newmem) Изменено 22 ноября, 2014 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
Submarina Опубликовано 22 ноября, 2014 Поделиться Опубликовано 22 ноября, 2014 Вот попробуй, этот скрипт. у меня версия Far cry 4 1.4 alloc(newmem,2048,FC64.dll+B87009) ////////dll+B8D179label(returnhere)label(ammo)registersymbol(ammo)aobscan(aob_ammo, 89 03 48 8B 5C 24 30 C6)newmem:mov [rbx],#99mov rbx,[rsp+30]aob_ammo:ammo:jmp newmemnopnopreturnhere:[DISABLE]ammo:mov [rbx],eaxmov rbx,[rsp+30]dealloc(newmem)unregistersymbol(ammo) Рабочий на сто процентов Far Cry 4 v1.4//Используй тег [co de] (без пробела)//NullAlex Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 22 ноября, 2014 Автор Поделиться Опубликовано 22 ноября, 2014 Вот попробуй, этот скрипт. у меня версия Far cry 4 1.4alloc(newmem,2048,FC64.dll+B87009) ////////dll+B8D179label(returnhere)label(ammo)registersymbol(ammo)aobscan(aob_ammo, 89 03 48 8B 5C 24 30 C6)newmem:mov [rbx],#99mov rbx,[rsp+30]aob_ammo:ammo:jmp newmemnopnopreturnhere:[DISABLE]ammo:mov [rbx],eaxmov rbx,[rsp+30]dealloc(newmem)unregistersymbol(ammo)Рабочий на сто процентов Far Cry 4 v1.4 У меня точно такой же скрипт. У тебя только деструктор символа и выделенной памяти в конце, но не думаю что это на что-то влияет. По моему скрипту огнестрельные патроны работают, со специальными беда. Ссылка на комментарий Поделиться на другие сайты Поделиться
Submarina Опубликовано 22 ноября, 2014 Поделиться Опубликовано 22 ноября, 2014 Ты с начало попробуй, а потом говори.Но ели не хочешь опробовать мой скрипт, то смотри внимательно на свой первый скрипт, у тебя не хватает одного nop. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 22 ноября, 2014 Автор Поделиться Опубликовано 22 ноября, 2014 Ты с начало попробуй, а потом говори.Но ели не хочешь опробовать мой скрипт, то смотри внимательно на свой первый скрипт, у тебя не хватает одного nop. Я, кстати, так и не понял зачем нужны эти нупы. Кто объяснит? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 22 ноября, 2014 Поделиться Опубликовано 22 ноября, 2014 Для балансировки длины инструкции. Была инструкция, допустим, 7 байтов длиной, а ты прыжком ее забил. Стала инструкция 5 байт длиной, и образовались два лишних байта. А процессор выполняет инструкции последовательно. И тут ему два каких-то непонятных байта суют. Вот и вылет. А если вместо эти двух лишних байт поставить nop (No operation), процессор их выполнит ничего не делая (но оперейшн - нет операции) и дальше пошпарит по порядку как надо. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 22 ноября, 2014 Автор Поделиться Опубликовано 22 ноября, 2014 Для балансировки длины инструкции.Была инструкция, допустим, 7 байтов длиной, а ты прыжком ее забил.Стала инструкция 5 байт длиной, и образовались два лишних байта.А процессор выполняет инструкции последовательно.И тут ему два каких-то непонятных байта суют.Вот и вылет. А если вместо эти двух лишних байт поставить nop (No operation),процессор их выполнит ничего не делая (но оперейшн - нет операции)и дальше пошпарит по порядку как надо. Получается... Как вычислить, сколько байтов будет в твоей инструкции уже после инжекта? Ну чтобы определить, сколько нупов нужно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Submarina Опубликовано 23 ноября, 2014 Поделиться Опубликовано 23 ноября, 2014 (изменено) Привет, помагите, хочу высокую скорость ходьбы сделать, и высокий прыжок сделать, в FAR CRY 4 а не могу найти значение скорости ходьбы, и прыжка игрока,пробовал подцепить отладчик olly 1.10 и 2.01 но, они выдают ошибку. Изменено 23 ноября, 2014 пользователем Baracuda Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 23 ноября, 2014 Поделиться Опубликовано 23 ноября, 2014 Получается... Как вычислить, сколько байтов будет в твоей инструкции уже после инжекта? Ну чтобы определить, сколько нупов нужно. Прыжок на кодкейв (инжект) всегда составляет 5 байт (в общих случаях, частности не рассматриваю сейчас). Обычно СЕ автоматически высчитывает длину инструкции и количество нопов для балансировки. Но если делаешь вручную - сначала подсчитай байты инструкции, которую ты будешь затирать прыжком на кодкейв (инжект). Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 23 ноября, 2014 Автор Поделиться Опубликовано 23 ноября, 2014 Прыжок на кодкейв (инжект) всегда составляет 5 байт (в общих случаях, частности не рассматриваю сейчас).Обычно СЕ автоматически высчитывает длину инструкции и количество нопов для балансировки. Но если делаешь вручную - сначала подсчитай байты инструкции, которую ты будешь затирать прыжком на кодкейв (инжект). Т.е. если в оригинале, допустим, 3 байта - то как тогда быть? Один нуп оставлять? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 23 ноября, 2014 Поделиться Опубликовано 23 ноября, 2014 Нет. Если в оригинале три байта, значит, тебе надо брать две инструкции, так как прыжок займет пять байт. Логика такая. Прыжок всегда занимает 5 байт. Из длины инструкции вычитаешь 5 байт и получаешь количество нопов (не нУпов), которые нужно проставить Допустим, инструкция 8 байт, от 8 отнимаешь 5 - получаешь 3 нопа. Если инструкция 10 байт - отнимаешь 5, получаешь 5 нопов. Если инструкция меньше 5 байт, нужно взять две инструкции (одну ту, что нужно, вторую - следующую), или три инструкции. В общем, столько инструкций, сколько их составит не меньше пяти байт. То есть, если идут две инструкции по 3 байта, то их берешь две, и один ноп: (3 + 3) - 5 = 1 Может быть и такой случай, когда понадобится три инструкции. Например (3 + 1 + 1) - 5 = 0 (одна трехбайтная и две однобайтные инструкции, например) В общем, суть, думаю, ты понял. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 23 ноября, 2014 Автор Поделиться Опубликовано 23 ноября, 2014 (изменено) Нет. Если в оригинале три байта, значит, тебе надо брать две инструкции, так как прыжок займет пять байт.Логика такая. Прыжок всегда занимает 5 байт. Из длины инструкции вычитаешь 5 байт и получаешь количество нопов (не нУпов), которые нужно проставитьДопустим, инструкция 8 байт, от 8 отнимаешь 5 - получаешь 3 нопа. Если инструкция 10 байт - отнимаешь 5, получаешь 5 нопов.Если инструкция меньше 5 байт, нужно взять две инструкции (одну ту, что нужно, вторую - следующую), или три инструкции. В общем, столько инструкций, сколько их составит не меньше пяти байт.То есть, если идут две инструкции по 3 байта, то их берешь две, и один ноп: (3 + 3) - 5 = 1Может быть и такой случай, когда понадобится три инструкции. Например (3 + 1 + 1) - 5 = 0 (одна трехбайтная и две однобайтные инструкции, например)В общем, суть, думаю, ты понял.Суть я понял, но в начале инжекта есть выделение памяти, вот такое:alloc(newmem,2048,"FC64.dll"+D2F99C) Ну и вот пример:notepad.exe+354D - 48 8B D8 - mov rbx,raxnotepad.exe+3550 - 66 8B 00 - mov ax,[rax]Получается, я говорю АА, что работаю с notepad.exe+354D и перепиливаю его инструкцию под себя и дальше, в newmem указываю mov ax,[rax] , т.е. следующую инструкцию...А ничего, что эта следующая инструкция будет дальше по списку? Мы же с ней не работали... Т.е. игра не вылетит? Изменено 23 ноября, 2014 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 23 ноября, 2014 Поделиться Опубликовано 23 ноября, 2014 Все инструкции, которые ты затираешь прыжком, в инжекте ты обязан восстановить, иначе с большой долей вероятности получишь вылет из игры. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения