给你这个参考一下<br><br>//在指定的进程中插入一个DLL文件<br>function AttachToProcess(const HostFile, GuestFile : string;const PID
WORD=0)
WORD;<br>//HostFile为要绑定的宿主文件(Exe文件),GuestFile为要嵌入的客户文件(Dll文件)<br>//如AttachToProcess('D:/TESTDLL.DLL','Notepad.exe') ;<br>var<br> hRemoteProcess: THandle;<br> dwRemoteProcessId
WORD;<br> cb
WORD;<br> pszLibFileRemote: Pointer;<br> iReturnCode:Boolean;<br> TempVar
WORD;<br> pfnStartAddr:TFNThreadStartRoutine;<br> pszLibAFilename: PwideChar;<br>begin<br> Result:=0;<br> EnabledDebugPrivilege(True);<br> Getmem(pszLibAFilename,Length(GuestFile)*2+1);<br> StringToWideChar(GuestFile,pszLibAFilename,Length(GuestFile)*2+1);<br> if PID>0 then dwRemoteProcessID:=PID else FindAProcess(HostFile,False,dwRemoteProcessID);<br> //由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请<br> //足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。<br> //然后,我们可以建立LoadLibraryW函数这个线程来启动我们的DLL,LoadLibraryW<br> //函数是在kernel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL<br> //文件的绝对路径名pszLibAFilename,(也就是DLL的全路径文件名),但是由于<br> //DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空<br> //间:(否则远程线程是无法读到这个参数的)<br> hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD + //允许远程创建线程<br> PROCESS_VM_OPERATION+ //允许远程VM操作<br> PROCESS_VM_WRITE,//允许远程VM写<br> FALSE, dwRemoteProcessId);<br><br> //计算DLL路径名需要的内存空间<br> cb := (1 + lstrlenW(pszLibAFilename)) * sizeof(WCHAR);<br> //使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区<br> pszLibFileRemote := PWIDESTRING( VirtualAllocEx( hRemoteProcess, nil, cb, MEM_COMMIT, PAGE_READWRITE));<br> //使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间<br> TempVar:=0;<br> iReturnCode := WriteProcessMemory(hRemoteProcess,pszLibFileRemote, pszLibAFilename, cb, TempVar);<br> if iReturnCode then<br> begin<br> //计算LoadLibraryW的入口地址<br> pfnStartAddr := GetProcAddress(GetModuleHandle('Kernel32'), 'LoadLibraryW');<br> //OK,万事俱备,我们通过建立远程线程时的地址pfnStartAddr(实际上就是LoadLibraryW<br> //的入口地址)和传递的参数 pszLibFileRemote(实际上是我们复制过去的DLL的全路<br> //径文件名)在远程进程内启动我们的DLL:<br> //启动远程线程LoadLibraryW,通过远程线程调用用户的DLL文件<br> TempVar:=0;<br> Result := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, TempVar);<br> end;<br> Freemem(pszLibAFilename);<br>end;<br><br>//查找指定的进程,然后返回进程ID<br>procedure FindAProcess(const AFilename:string; const PathMatch:Boolean; var ProcessID: DWORD);<br>//AFilename为要查找(进程ID)的文件名(可以包行路径)<br>//PathMatch为查找的时候是否匹配路径<br>var<br> lppe:TProcessEntry32;<br> SsHandle:Thandle;<br> FoundAProc, FoundOK:boolean;<br>begin<br> SsHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);<br> FoundAProc := Process32First(Sshandle,lppe);<br> while FoundAProc do<br> begin<br> if PathMatch then<br> FoundOK:=AnsiStricomp(lppe.szExefile,PChar(AFilename))=0<br> else<br> FoundOK:=AnsiStricomp(PChar(ExtractFilename(lppe.szExefile)),PChar(ExtractFilename(AFilename)))=0;<br><br> if FoundOK then<br> begin<br> ProcessID:=lppe.th32ProcessID;<br> break;<br> end;<br> FoundAProc :=Process32Next(SsHandle,lppe);<br> end;<br>// if not FoundAProc then showmessage(SysErrorMessage(GetLastError));<br> CloseHandle(SsHandle);<br>end;<br><br>//激活或者停止指定的权限 [ Winnt Win2000 ]<br>function EnabledDebugPrivilege(const bEnabled: Boolean):Boolean;<br>var<br> hToken: THandle;<br> tp: TOKEN_PRIVILEGES;<br> a: DWORD;<br>const<br> SE_DEBUG_NAME = 'SeDebugPrivilege';<br>begin<br> Result:=False;<br> if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken)) then<br> begin<br> tp.PrivilegeCount :=1;<br> LookupPrivilegeValue(nil,SE_DEBUG_NAME ,tp.Privileges[0].Luid);<br> if bEnabled then<br> tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED<br> else<br> tp.Privileges[0].Attributes := 0;<br> a:=0;<br> AdjustTokenPrivileges(hToken,False,tp,SizeOf(tp),nil,a);<br> Result:= GetLastError = ERROR_SUCCESS;<br> CloseHandle(hToken);<br> end;<br>end;<br><br><br>