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

При инъекции АА-скрипта падает игра


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

Всем привет! У меня возник такой вопрос и ситуация. Я сейчас пытаюсь взламывать игру Dead Rising 3, на данный момент взламываю здоровье персонажа. Адрес я нашёл, все необходимые операции перед внедрением кода сделал (что пишет/читает, какие и сколько адресов читают из инструкции, анализ данных структур). Но наткнулся то я на такую ситуацию, в инструкции моей которая работает с моим адресом здоровья, используется не обычный регистр, а именно rax. Так вот я бы хотел как можно подробней узнать как работать с подобными инструкциями (внедрять код)? Инструкция: movd xmm1,[rax+10]. Моя попытка внедрить код в игру приводит к вылету из игры и ошибке. Мой код:

Да, и попутно спрошу... Как вычислить правильное кол-во памяти выделяемое под свой скрипт/код?

NullAlex: заголовок темы должен отражать суть проблемы, а заголовки вида "помогите" - мало о чем могут сказать. Устное предупреждение. Заголовок темы исправил.

[ENABLE]aobscan(address0, 66 0F 6E 48 10 0F 5B)alloc(newMem, 100)label(returnHere)registersymbol(address0)newMem:push eaxmov eax,[rax+14]mov [rax+10],eaxpop eaxmovd xmm1,[rax+10]jmp returnHereaddress0:jmp newMemreturnHere:[DISABLE]address0:movd xmm1,[rax+10]dealloc(newMem)unregistersymbol(address0) 
Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 71
  • Создана
  • Последний ответ

Топ авторов темы

Все те регистры, которые начинаются на "R" - 64-х битные. А ошибка скорее всего потому, что ты записываешь значение в 32-х битный регистр (eax).

Попробуй с одним из следующих:

rcx, rsx, rsi

И 100 байт - опять же, может быть мало. 2048 байт попробуй выделить.

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

Все те регистры, которые начинаются на "R" - 64-х битные. А ошибка скорее всего потому, что ты записываешь значение в 32-х битный регистр (eax).

Попробуй с одним из следующих:

rcx, rsx, rsi

И 100 байт - опять же, может быть мало. 2048 байт попробуй выделить.

Да, всё верно 64))) Сори за название и за тему. Просто не сразу получилось инфу найти по этому вопросу в инете, не правильный запрос делал. Спасибо за совет. Я к стате попробовал сразу поставить регистр rdx, как только нашёл инфу наконец в инете, но он тоже вылетает, сейчас попробую предложенные тобой регистры.

Вообщем попробовал предложенные тобой варианты, получилась такая ситуация. rcx и rsi вылетают так же, но уже без ошибки как было с eax)) А вот rsx CE вообще не определяет как регистр, выдаёт ошибку компиляции (не возможно скомпилировать инструкцию) при попытке сохранить изменения в коде, да и цвет у этого регистра не оранжевый как должен быть, а чёрный)))

Да к стате, а влияет ли то в каком режиме запущен CE 32/64 бита? У меня запуск происходит стандартно через CheatEngine.exe, а в папке есть ещё 2 файла запуска с префиксом i386 и x86_64.

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

По-сути, ярлык, который создается при установке СЕ - запускает СЕ в доступном режиме (если 32-х битная ОС - запускается в 32-х битном режиме, если ОС х64, то в 64-х битном).

По поводу вылета - может быть еще такой вариант, что с твоей инструкцией работает не одно значение, а несколько, отсюда и вылет. Также может быть то, что в игре какой-то хитровыделанный античит стоит - я не в курсе.

Посмотри, сколько адресов пробегают по этой инструкции, для начала - там видно будет.

P.S.

По rsx - опечатка, rbx хотел написать :)

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

По-сути, ярлык, который создается при установке СЕ - запускает СЕ в доступном режиме (если 32-х битная ОС - запускается в 32-х битном режиме, если ОС х64, то в 64-х битном).

По поводу вылета - может быть еще такой вариант, что с твоей инструкцией работает не одно значение, а несколько, отсюда и вылет. Также может быть то, что в игре какой-то хитровыделанный античит стоит - я не в курсе.

Посмотри, сколько адресов пробегают по этой инструкции, для начала - там видно будет.

P.S.

По rsx - опечатка, rbx хотел написать :)

Ну в геймхакинге я хоть и навичок, но про это знаю и сразу об этом подумал, конечно же я всё проверил и работает с инструкцией только 1 адрес))

Пока не меря на данном этапе игры.

P.S.: Ясно))

Да, к стате а ты не в курсе как определять вообще есть в игре защита или нет?

Попробовал занопить инструкцию, игра на удивление вообще никак не отреагировала на это))

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

приводит к вылету из игры и ошибке

Во первых ты во своём коде используешь eax и соответственно меняешь rax, а соответственно меняешь адрес куда пишешь, игра обижается на такое злодеяние и вылетает. :-D

Korol2010, попробуй так:

[ENABLE]aobscan(address0, 66 0F 6E 48 10 0F 5B)alloc(newMem, 100)label(returnHere)registersymbol(address0) newMem:push rbxmov ebx, dword ptr [rax+14]mov dword ptr [rax+10],ebxpop rbxmovd xmm1,[rax+10]jmp returnHere address0:jmp newMemreturnHere: [DISABLE]address0:movd xmm1,[rax+10]unregistersymbol(address0) dealloc(newMem)  
Изменено пользователем Garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Гарик, одна поправка

mov ebx, dword ptr [rax+14]

Когда читаешь значение из памяти в регистр, размерность (dword ptr) указывать не нужно. Он считает значение по размеру регистра.

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

Garik66, а что изменилось, собственно? Я может не понимаю потому, что сонный, но по-моему ничего не изменилось)

И, кстати, сохранение и восстановление регистра rbx там лишнее у тебя.

UPD:

Все, понял) Garik66 прав, да :)

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

Гарик, одна поправка

 

Xipho, там скорее всего можно обойтись вообще без dword ptr, но я отметил это специально для Korol2010, для того чтобы подчеркнуть, что так как игра 64-битная, нужно сохранять не часть регистра (как он писал Push eax), а весь 64-битный регистр (Push rax), потому что это тоже может приводить к вылетам в таких играх, а потом уже использовать в коде или eax. или ax (то что Гаймхакеру нужно). 

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

У меня вот такой скрипт получился, который вылетает: 

Так же пробовал ещё 2 варианта, которые тоже вылетают:


Xipho, там скорее всего можно обойтись вообще без dword ptr, но я отметил это специально для Korol2010, для того чтобы подчеркнуть, что так как игра 64-битная, нужно сохранять не часть регистра (как он писал Push eax), а весь 64-битный регистр (Push rax), потому что это тоже может приводить к вылетам в таких играх, а потом уже использовать в коде или eax. или ax (то что Гаймхакеру нужно). 

С регистрами мы, Гарик, ещё с НульАлексом ночью разобрались))) Так что на счёт этого можно уже не говорить, осталось только выяснить какой код писать и как его внедрять чтоб он работал и игра не крашилась)) Да, и ещё вопрос про то, как определять правильное количество памяти выделяемое под свой код, ещё остался тоже остался.


К стате попробую сейчас твой вариант протестить. Такое я ещё не пробовал.


Попробовал, тоже вылетает))

[ENABLE]aobscan(address0, 66 0F 6E 48 10 0F 5B)alloc(newMem, 2048)label(returnHere)registersymbol(address0)newMem:push rbxmov rbx,[rax+14]mov [rax+10],rbxpop rbxmovd xmm1,[rax+10]jmp returnHereaddress0:jmp newMemreturnHere:[DISABLE]address0:movd xmm1,[rax+10]dealloc(newMem)unregistersymbol(address0) 
[ENABLE]aobscan(address0, 66 0F 6E 48 10 0F 5B)alloc(newMem, 2048)label(returnHere)registersymbol(address0)newMem:mov [rax+10],#400movd xmm1,[rax+10]jmp returnHereaddress0:jmp newMemreturnHere:[DISABLE]address0:movd xmm1,[rax+10]dealloc(newMem)unregistersymbol(address0) 
[ENABLE]aobscan(address0, 66 0F 6E 48 10 0F 5B)alloc(newMem, 2048)label(returnHere)registersymbol(address0)newMem:movd xmm1,[rax+14]jmp returnHereaddress0:jmp newMemreturnHere:[DISABLE]address0:movd xmm1,[rax+10]dealloc(newMem)unregistersymbol(address0) 
Ссылка на комментарий
Поделиться на другие сайты

Попробовал, тоже вылетает))

Ты уверен, что фильтр не нужен?

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

 

Да, и ещё вопрос про то, как определять правильное количество памяти выделяемое под свой код, ещё остался тоже остался.

Вообще сильно не парься этим, все определяют на глазок.

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

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

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

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

Ты уверен, что фильтр не нужен?

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

 

Вообще сильно не парься этим, все определяют на глазок.

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

Ясно теперь про байты, спасибо. Фильтр не нужен я думаю, потому что я пробовал и зомби убивать, и оружие ломать и союзники у меня умирали, патроны я тратил у оружия. Всегда работал только 1 адрес с инструкцией.

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

Ясно. Спасибо за разъеснение, а то я всё понять никак не мог как же его правильно определять))

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

смотри, ты считываешь и записываешь 8 байт, когда у тебя значение, как ты выше писал, четырехбайтное.
 

newMem:push rbxmov rbx,[rax+14]mov [rax+10],rbxpop rbxmovd xmm1,[rax+10]jmp returnHere

Возможно, при этом зацепляешь соседнее нужное значение. Попробуй так:

 

newMem:push ebxmov ebx,[rax+14]mov [rax+10],ebxpop ebxmovd xmm1,[rax+10]jmp returnHere

То есть, вместо rbx используй ebx, чтобы считывалось/записывалось 4 байта. Если и это не поможет - тут уже не копаясь самостоятельно в игре ответить не смогу.

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

Да к стате, есть 1 "но", не знаю важно это или нет, в игре рабочих адреса 3 штуки все 4 байта, только полное здоровье на каждом из адресов считается разным кол-вом. На пример первый адрес - полное здоровье=400, второй - 100000 с чем то там, точно не помню, вроде 110000, третий больше 25 миллионов. Я взял 400, т.к. подумал раз у меня во 2 части игры тоже было 400 в начале игры (4 кубика жизней), то и в этой тоже возьму такое же значение за основу. Честно говоря я ещё не пробовал остальные 2 адреса, не знаю потому что важно это или без разницы, вот может вы мне сейчас и скажите))


 

смотри, ты считываешь и записываешь 8 байт, когда у тебя значение, как ты выше писал, четырехбайтное.
 

newMem:push rbxmov rbx,[rax+14]mov [rax+10],rbxpop rbxmovd xmm1,[rax+10]jmp returnHere

Возможно, при этом зацепляешь соседнее нужное значение. Попробуй так:

 

newMem:push ebxmov ebx,[rax+14]mov [rax+10],ebxpop ebxmovd xmm1,[rax+10]jmp returnHere

То есть, вместо rbx используй ebx, чтобы считывалось/записывалось 4 байта. Если и это не поможет - тут уже не копаясь самостоятельно в игре ответить не смогу.

 

Ок попробую, спасибо за совет.


Вылетает, и твой вариант(((

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

Ясно, значит попробую оставшиеся 2 адреса, а там уже отпишусь что получится.


Korol2010, сделай скрин региона памяти, чтобы туда попали и [rax+10] и [rax+14], хочу посмотреть, как твои значения выглядят в игре.

по смещению 14 распологается просто максимальное значение здоровья)) Это смещение я взял из структуры адреса. А скрины сделаю, не проблема)

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

Решил ещё разок проверить один ли адрес пишет в инструкцию, после того как прошёл пару миссий в игре, и вот же зараза, действительно, появились ещё несколько адресов, но правда тогда когда я пытался внедрять код работал только 1 адрес с инструкцией в этом и дело. Вообщем попробую тогда оставшиеся 2 адреса проанализировать, возможно 1 из них окажется рабочим. Потом отпишусь что получилось.


https://yadi.sk/i/le_rqiKohpSJn скрин


https://yadi.sk/i/HoSVIcEihpSVX инструкции

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

Korol2010, Ты меня не понял - скрин не инструкций, а региона памяти.

Ты имеешь в виду то что написано в нижнем окне отладчика?(HEX)

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

ааа ну ок, сек сейчас сделаю 

Ну что это?  :closeyes:

Korol2010, ты бы выделил свои значения в этом регионе, я что должен догадки строить. ;)

Ладно, по-видимому из этого ничего не получиться, забей.

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


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

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

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