【发布时间】:2013-08-21 22:48:52
【问题描述】:
我有一个简单的 DLL,我将其注入到记事本中,仅用于测试目的。 我的注射器代码是这样的:
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 Injected,但几秒钟后它崩溃说: 在 00FFE102 的模块 test.dll 中出现异常 EAccessViolation。 地址 00FFF102 的访问冲突。写入地址 00FFF102。 我使用的是 Delphi 2010,Windows 7 x64,管理员权限,没有 UAC,记事本和 dll 都是 x32...
【问题讨论】:
-
您没有为
LoadLibrary调用的“lpFileName”参数的空终止符分配空间。这对问题没有帮助,只是说.. -
@Sertac 原来是调用约定不匹配和 @ 操作符对隐藏问题的过程变量的另一种情况
标签: delphi dll dll-injection