function NewNtResumeThread(hThread:Cardinal;PreviousSuspendCount:PULONG):Cardinal;stdcall;
type
  TNewNtResumeThread=function (hThread:Cardinal;PreviousSuspendCount:PULONG):Cardinal;stdcall;
begin
if vspas then
  begin
  vspas:=False;
  htd:=InjectTo(String(curfile), Shared^.localdll+'main.dll');
  curfile:='';
  //WaitForSingleObject(htd,INFINITE );
  end;
  Hook[6].UnHook;
  Result:=TNewNtResumeThread(Hook[6].BaseAddr)(hThread,PreviousSuspendCount);
  Hook[6].Hook;
end;为了hook住控制台程序,在上面加入了WaitForSingleObject(htd,INFINITE );但加入这句后,不是控制台程序则运行时不能正常运行,运行时,在插入的线程结束后就自己退出了!也没有错误提示!
不加WaitForSingleObject则可以,但hook不住控制台程序或不含GUI的程序!
我想要的是能hook住所有的程序创建,现在就剩下这个问题搞不定!
请大家帮我写下,指下,问题出在哪?

解决方案 »

  1.   

    楼主加了WaitForSingleObject(htd,INFINITE );后到底有没有实现你想的功能啊,没看明白
      

  2.   

    加了只可以hook控制台程序,像记事本之类的就打不开了!
      

  3.   

    InjectTo 楼主是想注入DLL吧
      

  4.   

    加了WaitForSingleObject只可以hook控制台程序,像记事本之类的就打不开了!
    但如果一直在cmd里输入cmd cmd cmd 后面的就hook不到了,期待解答?
      

  5.   

    NtResumeThread 函数不是创建进程才调用, 你在哪里做的判断?
      

  6.   

    是啊!当新的进程创建时,在NtResumeThread的时候就想注入,现在到这个地方就出问题!
      

  7.   

    if vspas then
      vspas是在像createprocessw winexec等创建的时候让vspas:=True;
    这样就可以判断进程创建的时候!
      

  8.   

    你要注入的DLL怎么写的, 有没做避免重复注入的处理 
      

  9.   

    function NewNtResumeThread(hThread:Cardinal;PreviousSuspendCount:PULONG):Cardinal;stdcall;
    type
      TNewNtResumeThread=function (hThread:Cardinal;PreviousSuspendCount:PULONG):Cardinal;stdcall;
    begin
    if vspas then      
      begin
                                 //A
      vspas:=False;
      htd:=InjectTo(String(curfile), Shared^.localdll+'main.dll');    //B
      curfile:='';
      WaitForSingleObject(htd,INFINITE );
      end;    
                                 //C
      Hook[6].UnHook;
      Result:=TNewNtResumeThread(Hook[6].BaseAddr)(hThread,PreviousSuspendCount);
      Hook[6].Hook;
    end;
    我调试过!用来注入的进程会从上面function里的  A 开始  执行到B后面就会开始WaitForSingleObject
    这时被注入的程序会load 这个dll  执行时就直接从C开始了,并没有执行InjectTo,就结束!
    然后用来注入的进程再WaitForSingleObject htd改变时,就执行下面的B C  完了后,被打开的记事本闪了一下就结束了! 不知道什么问题!
      

  10.   

    vspas  这个条件不知道你怎么判断的,感觉不对
    你把自己都注入了, 要注入的反倒没注入? 
      

  11.   

      Hook[1].UnHook;
      Result:=TNewNtResumeThread(Hook[1].BaseAddr)(hThread,PreviousSuspendCount);
      Hook[1].Hook;
      

  12.   

    注入时,先获得目标pid(NtQueryThreadInformation),
    然后openprocess得到句柄,用pid枚举目标进程模块(EnumProcessModules),
    getmodulefilenameex获得模块路径,判断有没有自己的模块,
    如果有,就不是创建调用,否则就injectto还可以hook ntcreateprocess, ntcreateprocessex,
    调用原函数前vspas:=True;