У меня есть простая DLL, которую я вставляю внутри блокнота только для тестирования. Мой код для инжектора, как это:DLL Injection and Access Violation
uses
Windows;
var
BytesWritten: cardinal;
PID, Process, Thread, ThreadId, hKernel: dword;
pLoadLibrary, Paramaters: pointer;
DLL: AnsiString;
begin
DLL := 'C:\test.dll'; // Must be full path name.
PID := 3160;
Process := OpenProcess(PROCESS_ALL_ACCESS,
False,
PID);
Paramaters := VirtualAllocEx(Process,
nil,
Length(DLL),
MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
WriteProcessMemory(Process,
Paramaters,
PAnsiChar(DLL),
Length(DLL),
BytesWritten);
hKernel := GetModuleHandle('KERNEL32.DLL');
pLoadLibrary := GetProcAddress(hKernel,
'LoadLibraryA');
Thread := CreateRemoteThread(Process,
nil,
0,
pLoadLibrary,
Paramaters,
0,
ThreadId);
WaitForSingleObject(Thread, INFINITE);
VirtualFreeEx(Process,
Paramaters,
0,
MEM_RELEASE);
CloseHandle(Thread);
CloseHandle(Process);
end.
Мой DLL код прост, как это:
uses
SysUtils,
Classes,
Windows;
{$R *.res}
procedure EntryPoint(Reason: dword); stdcall;
begin
if Reason = DLL_PROCESS_ATTACH then
begin
MessageBox(0, 'DLL Injected', 'DLL Injected', 0);
end;
end;
begin
DLLProc:= @EntryPoint;
EntryPoint(DLL_PROCESS_ATTACH);
end.
Когда я впрыснуть DLL в процессе блокнота, я получаю MessageBox говорю DLL Введенный, но через несколько секунд это сообщение об ошибке: Исключение EAccessViolation в модуле test.dll на 00FFE102. Нарушение прав доступа по адресу 00FFF102. Запись адреса 00FFF102. Я использую Delphi 2010, Windows 7 x64, права администратора, без UAC, блокнот и dll оба x32 ...
Вы не выделяете пространство для нуль-терминатора параметра «lpFileName» вызова «LoadLibrary». Это не поможет решить проблему, просто скажу .. –
@Sertac Выключено, чтобы вызвать несоответствие конвенции, и еще один случай оператора @ по процедурным переменным, скрывающим проблему. –