2011-12-22 2 views
1

Я пишу программу в C и использую inline asm. В коде встроенного ассемблера есть несколько адресов, где я хочу их исправлять во время выполнения.C - Inline asm patching во время выполнения

Быстрый образец кода заключается в следующем:

void __declspec(naked) inline(void) 
{ 
     mov eax, 0xAABBCCDD 
     call 0xAABBCCDD 
} 

сказать, что я хочу, чтобы изменить значение 0xAABBCCDD из основной программы C. То, что я пытался сделать, это вызвать VirtualProtect an - это указатель на функцию, чтобы сделать ее записью, а затем вызвать memcpy, чтобы добавить соответствующие значения в код.

DWORD old; 
VirtualProtect(inline, len, PAGE_EXECUTE_READWRITE, &old); 

Однако VirtualProtect терпит неудачу, и GetLastError() возвращает 487, что означает доступ к неверному адресу. Кто-нибудь знает эту проблему? Thanks

+0

Почему вы хотите это сделать? Кажется, что должен быть лучший способ решить реальную проблему, из-за которой вы захотите это сделать. Также как вы решаете реальное значение 0xAABBCCDD? Вероятно, есть способы, по которым вы можете получить эту замену «бесплатно», в зависимости от того, откуда этот адрес. – Flexo

+0

(Также предполагаем, что это Win32/MSVC здесь из синтаксиса и системного вызова - вы можете указать, что явно с тегами и/или в вопросе). – Flexo

+0

Что именно вы пытаетесь сделать? Вы пытаетесь сделать крючок в целевом процессе, чтобы он переходил к вашей функции? Если это так, вы должны быть «VirtualProtect» в блоке памяти, который вы будете переписывать, чтобы сделать крючок, а не свою функцию, и вам также нужно будет выпрыгнуть из вашего кодека (либо 'call' +' ret', либо 'jmp' на конкретный адрес в конце вашей функции). – AusCBloke

ответ

1

Не работает ли это?

int X = 0xAABBCCDD; 

void __declspec(naked) inline(void) 
{ 
     mov eax, [X] 
     call [X] 
} 
+0

Да, но адрес не статичен. Я получу его во время выполнения. – user1112347

+0

Ну да, конечно, вы получите его во время выполнения. И затем вы выполните строку кода, которая говорит 'X = the_address_I_got_at_runtime;' перед вызовом вашей функции сборки. –

+0

Да, правильно. Но забыл упомянуть что-то важное. То, что я хочу сделать, - это исправить код и ввести его в другой процесс и запустить его оттуда. Не в моем процессе. Но дело в том, что я хочу ЗАПИСАТЬ значение во время выполнения в любом месте встроенного asm. Вот почему я пытаюсь отметить функцию как записываемую с помощью virtualprotect. Проблема в том, что VirtualAlloc не работает ... – user1112347

Смежные вопросы