Использование memcpy для изменения jnz в jmp - PullRequest
1 голос
/ 18 марта 2010

Много не использовал memcpy, но вот мой код, который не работает.

memcpy((PVOID)(enginebase+0x74C9D),(void *)0xEB,2);

(enginebase + 0x74C9D) - местоположение указателя на адрес байтов, которые я хочу исправить.

(void *) 0xEB - это код операции для вида jmp, который я хочу.

Единственная проблема в том, что это приводит к сбою в тот момент, когда линия пытается запустить, я не знаю, что я делаю не так, любой провокатор?

Ответы [ 2 ]

1 голос
/ 18 марта 2010

Аргумент (void*)0xEB говорит о необходимости копирования памяти с адреса 0xEB; по-видимому, вы хотите что-то похожее на

unsigned char x = 0xEB;
memcpy((void*)(enginebase+0x74c9d), (void*)&x, 2);

для правильного копирования значения 0xEB в место назначения. Кстати, 2 правильное значение для копирования одного байта в память программы? Похоже, это должно быть 1, так как вы копируете 1 байт. Я также предполагаю, что вы не можете просто сделать

((char*)enginebase)[0x74c9d] = 0xEB; 

по какой-то причине? (У меня нет опыта преднамеренно перезаписывать память программ)

0 голосов
/ 18 марта 2010

memcpy () ожидают два указателя для исходного и целевого буферов. Ваш второй аргумент - не указатель, а сами данные (это, как вы описали, код операции jnz ). Если я правильно понимаю, что вы пытаетесь сделать, вы должны установить массив с кодом операции в качестве контекста и предоставить memcpy () указатель на этот массив.

Программа аварийно завершает работу, поскольку вы пытаетесь сослаться на ячейку памяти из выделенного вам пространства (адрес 0xEB).

...