BOOL WriteProcessMemory()函数释疑!!(50分)

  • 主题发起人 主题发起人 muzi9298
  • 开始时间 开始时间
M

muzi9298

Unregistered / Unconfirmed
GUEST, unregistred user!
在写关于内存操作的时候,关于
WriteProcessMemory(
HANDLE hProcess, // handle to process whose memory is written to
LPVOID lpBaseAddress, // address to start writing to
LPVOID lpBuffer, // pointer to buffer to write data to
DWORD nSize, // number of bytes to write
LPDWORD lpNumberOfBytesWritten // actual number of bytes written
)函数中的第3个参数是指什么。
我在论坛看到一个用vc写的将一个线程插入到另外一个进程里去,就用到了这个函数,他
的第3个参数是指向一个自定义的线程(回调的),小弟vc极差,看不懂,请各位高手指点。
最好是delphi的原码;
 
function WriteProcessMemory(hProcess: THandle;
lpBaseAddress: Pointer;
lpBuffer: Pointer;
nSize: DWORD;
var lpNumberOfBytesWritten: DWORD): Boolean;
stdcall;
一般来说VC的LP开头定义的类型如果不知道可以用Pointer来供替,
LPDWORD D = > "var D: DWORD" or "D: PDWORD";
LPVOID buffer => "var Buffer" or "Buffer: Pointer"
你那个不是写内存,是函数地址的话,应该转成lpBuffer: Pointer;而不是var lpBuffer;
 
var
hRemoteThread,hkernel32,dwRemoteProcessId,hRemoteProcess:integer;
cb,pcb:dword;
pfnStartAddr,pszLibFileName,pszLibFileRemote:pchar;
begin
cb:=100;
//获得目标程序进程号
GetWindowThreadProcessId(hParent,@dwRemoteProcessId);
//获得目标进程句柄
hRemoteProcess:=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwRemoteProcessId);
//计算DLL路径名需要的内存空间
getmem(pszLibFileName,cb);
strcopy(pszLibFileName,pchar(ExtractFilePath(ParamStr(0))+'/dll01.dll'));
//在远程进程的内存地址空间分配DLL文件名缓冲区
pszLibFileRemote:=VirtualAllocEx(hRemoteProcess,NIL,cb,MEM_COMMIT,PAGE_READWRITE);
// 将DLL的路径名复制到远程进程的内存空间
WriteProcessMemory(hRemoteProcess,pszLibFileRemote,pszLibFileName,cb,pcb);
Freemem(pszLibFileName);
//计算LoadLibraryW的入口地址
hkernel32:=GetModuleHandle('Kernel32.dll');
pfnStartAddr:=GetProcAddress(hkernel32,'LoadLibraryA');
//启动远程线程LoadLibraryW,通过远程线程调用DLL文件
hRemoteThread:=CreateRemoteThread(hRemoteProcess,NIL,0,pfnStartAddr,pszLibFileRemote,0,pcb);
//等待线程结束
WaitForSingleObject(hRemoteThread,INFINITE);
TerminateThread(hRemoteThread,0);
end;
 
后退
顶部