Я пишу программу в 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
Почему вы хотите это сделать? Кажется, что должен быть лучший способ решить реальную проблему, из-за которой вы захотите это сделать. Также как вы решаете реальное значение 0xAABBCCDD? Вероятно, есть способы, по которым вы можете получить эту замену «бесплатно», в зависимости от того, откуда этот адрес. – Flexo
(Также предполагаем, что это Win32/MSVC здесь из синтаксиса и системного вызова - вы можете указать, что явно с тегами и/или в вопросе). – Flexo
Что именно вы пытаетесь сделать? Вы пытаетесь сделать крючок в целевом процессе, чтобы он переходил к вашей функции? Если это так, вы должны быть «VirtualProtect» в блоке памяти, который вы будете переписывать, чтобы сделать крючок, а не свою функцию, и вам также нужно будет выпрыгнуть из вашего кодека (либо 'call' +' ret', либо 'jmp' на конкретный адрес в конце вашей функции). – AusCBloke