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

Asm - сохранение значения регистра/восстановление после взлома


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

Хочу узнать, существует ли какая-то команда, для сохранения значений регистра?

К примеру, вот код:

mov eax,xmm0mov [ebx],eax  <- эта инструкция важная и её нельзя повредитьmov eax,[ebx]

нужно сохранить то, что хранит в себе eax и после второй инструкции восстановить исходное значение в регистре eax.

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

Привет!

 

Можно и просто записать значение регистра в какой-нибудь адрес памяти, который можно указать заранее или создать через alloc. Инструкция - mov. А так, как верно сказал AngrySchoolBoy, сохранить можно и на стеке. Pushad же сохраняет на стеке регистры общего назначения. Если тебе нужно сохранить только один, то это не совсем рациональный подход.

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

Привет!

 

Можно и просто записать значение регистра в какой-нибудь адрес памяти, который можно указать заранее или создать через alloc. Инструкция - mov. А так, как верно сказал AngrySchoolBoy, сохранить можно и на стеке. Pushad же сохраняет на стеке регистры общего назначения. Если тебе нужно сохранить только один, то это не совсем рациональный подход.

Я не знаю, как это правильней реализовать. Алгоритм должен быть такой:

1. Сохранение оригинальных значений регистров

2. Взлом/модифицкация нужного регистра

3. Работа оригинальной инструкции (она не стирается, через неё проходит модифицированные данные)

4. Восстановление оригинальных данных в регистрах

~5. Удаление следов работы скрипта (необязательно, но было бы неплохо)

 

P.s. суть моего алгоритма (метода) такова, что оригинальная инструкция некуда не девается. Мы просто обманываем её, подсовывая ей другие данные.

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

pushad         Сохранение оригинальных значений регистровmov eax,xmm0   Взлом/модифицкация нужного регистраmov [ebx],eax  Работа оригинальной инструкции (она не стирается, через неё проходит модифицированные данные)mov eax,[ebx]popad          Восстановление оригинальных данных в регистрах

:-D ребята сверху все же разжевали и рассказали, действуй!

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

Привет RockHammer!

Как один из вариантов можешь попробовать так:

 

 

 

 

Потом прописываешь переменную ShowEAX в таблицу СЕ и он тебе вежливо покажет содержимое регистра EAX. Но если инструкция работает с несколькими значениями/адресами, то надо делать фильтр(ну если этих адресов очень много). А если их там 2-3, то переменная будет прыгать между этими значениями

[ENABLE]alloc(newmem,2048)label(returnhere)label(originalcode)label(exit)registersymbol(ShowEAX)label(ShowEAX)newmem:originalcode:mov eax,xmm0mov [ShowEAX],eax // вот тут ты и получаеш свой eax и выводишь его в переменную ShowEAXmov [ebx],eax // <- эта инструкция важная и её нельзя повредитьmov eax,[ebx]exit:jmp returnhereShowEAX:dd 0"prumer1.exe"+2B6AD: // тут твоя игра или что там у тебяjmp newmemnopreturnhere:[DISABLE]"prumer1.exe"+2B6AD: // тут восстановление при отключении скрипта(ну думаю тут и так все ясно)mov eax,xmm0mov [ebx],eaxmov eax,[ebx]dealloc(newmem)unregistersymbol(ShowEAX)
Изменено пользователем kadabra888
Ссылка на комментарий
Поделиться на другие сайты

Я не уверен, что ты именно хочешь

mov eax,xmm0

Т.к. eax это 32 разрядный регистр, а xmm0  это 128 разрядный регистр. Т.е. из xmm0 в eax может записаться не то чего ты хочешь, либо вообще это невозможно. Надо смотреть как ассемблируется или справочник.

 

Про сохранение регистра можно использоваться push/pop инструкции. Выше писали об этом 

push eax // сохраняем eax// что-то делаем с eaxpop eax // восстанавливаем
Ссылка на комментарий
Поделиться на другие сайты

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

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

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