Написал программу, выполняющую перехват Апи функции MessageBoxExA методом сплайсинга:
Код внедряемой длл:
Код:
type
OldCode = packed record
One: dword;
two: word;
end;
far_jmp = packed record
PuhsOp: byte;
PushArg: pointer;
RetOp: byte;
end;
var
JmpMba: far_jmp;
OldMba: OldCode;
MbaAdr: pointer;
function NewMessageBox: Integer; stdcall;
var
Bytes: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes);
asm
mov eax, dword ptr MbaAdr
add eax, 5
jmp eax
end;
end;
Procedure SetHook();
var
hUser32: dword;
Bytes,OldProtect: dword;
begin
hUser32 := GetModuleHandle('user32.dll');
MbaAdr := GetProcAddress(hUser32, 'MessageBoxExA');
ReadProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes);
VirtualProtect(MbaAdr,6,PAGE_EXECUTE_READWRITE,OldProtect);
JmpMba.PuhsOp :=$68;
JmpMba.PushArg := @NewMessageBox;
JmpMba.RetOp := $C3;
WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @JmpMba, SizeOf(far_jmp), Bytes);
end;
//Последующий код роли не играет......
В идеале при перехвате происходит джамп на мою функцию NewMessageBox, затем восстанавливается затертый джампом участок памяти и джамп обратно.. и как следствие правильное выполнение функции MessageBoxExA. Фукция выполняется правильно, но после закрытия MessadgeBox'a программа, его вызвавшая, закрывается с ошибкой
Access violation at 0x00000000: Read of address 0x00000000.
Кто-нибудь может подсказать, в чем проблема? Вобзможно в этом коде
Код:
mov eax, dword ptr MbaAdr
add eax, 5
jmp eax