注入DLL到进程的问题
现在DLL是一个线程运行在A进程里面,还是它本身就是一个进程?
回答:
DLL本身只是该进程里面的ModuleList(模块列表)一段Code内存空间,是否会有线程,要看你的Code里面是否create thread, 如果有。
在ThreadList(线程列表)可以找到你的线程。
比如说:模块列表:
Executable modules
基址 大小 入口 名称 (系统) 文件版本 路径
00B40000 00079000 00B4312B WeChat 2.4.5.1 C:\Program Files (x86)\Tencent\WeChat\WeChat.exe
6D5E0000 027F9000 6EF4EB93 qbcore 3.43.691.400 C:\Program Files (x86)\Tencent\WeChat\qbcore.dll
6FDE0000 004BA000 WeChatRe 1.0.0.0 C:\Program Files (x86)\Tencent\WeChat\WeChatResource.dll
702A0000 005A3000 7030DAFF libFFmpe C:\Program Files (x86)\Tencent\WeChat\libFFmpeg.dll
70850000 01205000 7130EC9C WeChatWi 2.6.2.31 C:\Program Files (x86)\Tencent\WeChat\WeChatWin.dll
72130000 00051000 7215988C WINSPOOL (系统) 6.1.7600.16385 ( C:\Windows\system32\WINSPOOL.DRV
722B0000 00070000 722B1F65 ntshrui (系统) 6.1.7600.16385 ( C:\Windows\system32\ntshrui.dll
你自己的Dll只能在Ring3级别,内存段的一段空间内。除非是驱动可以在8XXXXXXX以上的地址。
如果在dll编写函数操作A进程的内存地址,WriteProcessMemory()中第一个句柄参数应该用谁的句柄或线程?
回答:第一个参数是模块基地址dwModuleBaseAddr,这里可以是主模块基地址,也可以是自己Dll的基地址。
如果要执行,必须先VirtualQuery 查询Protect = PAGE_EXECUTE_READWRITE , 可写状态。
比如你可以这样写: 这里的pAddress: Pointer可以是ring3,也就是7XXXXXXX以下的可写地址。
function SetToWrite(pAddress: Pointer): Boolean;
var
mInfo: MEMORY_BASIC_INFORMATION;
dwOldProtect: DWORD;
begin
VirtualQuery(pAddress, mInfo, SizeOf(mInfo));
if mInfo.Protect = PAGE_EXECUTE_READWRITE then
Result := True
else
begin
if VirtualProtect(mInfo.BaseAddress,
mInfo.RegionSize,
PAGE_EXECUTE_READWRITE,
@dwOldProtect) = True then
Result := True
else
Result := False;
end;
end;