进程中再启动一个程序的问题。 ( 积分: 100 )

  • 主题发起人 主题发起人 52253831
  • 开始时间 开始时间
5

52253831

Unregistered / Unconfirmed
GUEST, unregistred user!
看了WINDOWS核心编程后。试着用注入写了段APIHOOK的代码还行。但有个问题我老搞不明白。进程本身创建的线程注入不了。为什么呢?<br>代码如下:<br>program&nbsp;InjectModule;<br>uses<br>&nbsp;&nbsp;Windows,<br>&nbsp;&nbsp;ProcessModule&nbsp;in&nbsp;'ProcessModule.pas';<br>//注入部份<br>procedure&nbsp;InjetModule&nbsp;&nbsp;(ProcessID:longword;&nbsp;EntryPoint:&nbsp;pointer);stdcall;<br>var<br>&nbsp;&nbsp;Tid,ProcessHandle,InjectSize,hThread:LongWord;<br>&nbsp;&nbsp;Code,pRemote:pointer;<br>begin<br>&nbsp;&nbsp;Code&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;pointer(GetModuleHandle(nil));&nbsp;//获得自己模块地址<br>&nbsp;&nbsp;InjectSize&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;PImageOptionalHeader(pointer(integer(Code)+PImageDosHeader(Code)._lfanew+SizeOf(dword)+SizeOf(TImageFileHeader))).SizeOfImage;<br>&nbsp;&nbsp;ProcessHandle&nbsp;:=&nbsp;OpenProcess(PROCESS_ALL_ACCESS,&nbsp;False,&nbsp;ProcessID);<br>&nbsp;&nbsp;pRemote&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;VirtualAllocEx(ProcessHandle,Code,InjectSize,MEM_COMMIT&nbsp;or&nbsp;MEM_RESERVE,&nbsp;PAGE_EXECUTE_READWRITE);&nbsp;&nbsp;&nbsp;//or&nbsp;MEM_RESERVE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteProcessMemory(ProcessHandle,&nbsp;pRemote,&nbsp;Code,&nbsp;InjectSize,&nbsp;Tid);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateRemoteThread(ProcessHandle,&nbsp;nil,&nbsp;0,&nbsp;EntryPoint,&nbsp;0,&nbsp;0,&nbsp;Tid);<br>&nbsp;&nbsp;CloseHandle(ProcessHandle);<br>end;<br><br>Procedure&nbsp;mFun;<br>begin<br>&nbsp;&nbsp;WriteLog('Inject&nbsp;to:'+GetProcessName(GetCurrentProcessId())+'&nbsp;is&nbsp;Ok');<br>end;<br>begin<br>&nbsp;WinExec('notepad',SW_NORMAL);<br>&nbsp;InjetModule(GetProcessID('notepad.exe'),@mFun);<br>end.<br>这段代码注入NOTEPAD会出错。为何?<br><br>[red]但如果启动了NOTEPAD后再运行下面代码却可以注入成功(假如NOTEPAD运行后的PID是12345)。[/red]<br>program&nbsp;InjectModule;<br>uses<br>&nbsp;&nbsp;Windows,<br>&nbsp;&nbsp;ProcessModule&nbsp;in&nbsp;'ProcessModule.pas';<br><br>Procedure&nbsp;mFun;<br>begin<br>&nbsp;&nbsp;WriteLog('Inject&nbsp;to:'+GetProcessName(GetCurrentProcessId())+'&nbsp;is&nbsp;Ok');<br>end;<br>begin<br>&nbsp;&nbsp;&nbsp;InjetModule(12345,@mFun);&nbsp;&nbsp;//这里假设NOTEPAD运行后的PID是12345,通过任务管理器查看到的。<br>end.<br>=================================================================================================<br>同时我HOOK了CreateProcess后,在CreateProcessWCallBack里却无法再次注入那个新建的程序。<br><br>代码如下。<br>function&nbsp;&nbsp;CreateProcessWCallBack(lpApplicationName:&nbsp;PWideChar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;lpCommandLine:&nbsp;PWideChar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;lpProcessAttributes,&nbsp;lpThreadAttributes:&nbsp;PSecurityAttributes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;bInheritHandles:&nbsp;BOOL<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;dwCreationFlags:&nbsp;DWORD<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;lpEnvironment:&nbsp;Pointer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;lpCurrentDirectory:&nbsp;PWideChar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;const&nbsp;lpStartupInfo:&nbsp;TStartupInfoW<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;var&nbsp;lpProcessInformation:&nbsp;TProcessInformation):&nbsp;BOOL;&nbsp;stdcall;<br>begin<br>&nbsp;&nbsp;CreateProcessWNext(lpApplicationName<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,lpCommandLine<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,lpProcessAttributes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,lpThreadAttributes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,bInheritHandles<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,dwCreationFlags<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,lpEnvironment<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,lpCurrentDirectory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,lpStartupInfo<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,lpProcessInformation);<br><br>&nbsp;&nbsp;InjetModule(lpProcessInformation。dwProcessId,@mFun);&nbsp;&nbsp;//[red]这里注入后上面新启动的程序就出错了退出了。但这个注入模块是可正常注入的啊。[/red]<br>end;<br><br><br><br><br>procedure&nbsp;Hook;stdcall;<br>begin<br>&nbsp;&nbsp;WriteLog('InjectLib:['+GetProcessName(GetCurrentProcessId())&nbsp;+&nbsp;']&nbsp;Over&nbsp;,&nbsp;Start&nbsp;HookApi.');<br>&nbsp;&nbsp;HookApi('kernel32.dll',&nbsp;'CreateProcessW'&nbsp;,&nbsp;@CreateProcessWCallBack,&nbsp;@CreateProcessWNext);<br>end;
 
哦还是没解决啊。
 
var<br>&nbsp;&nbsp;tmd:dword;<br>begin<br>&nbsp;WinExec('notepad',SW_NORMAL);<br><br>&nbsp;tmd:=gettickcount()+3207;<br>&nbsp;while&nbsp;(tmd&gt;gettickcount())&nbsp;do<br>&nbsp;&nbsp;&nbsp;application.processmessage;<br><br>&nbsp;InjetModule(GetProcessID('notepad.exe'),@mFun);<br>end.
 
后退
顶部