最近才发现这个问题,百思不得其解,我这有代码,有兴趣的可以下载看看为什么会这样.
地址:http://myproject.91x.net/HookAPI.jpg ,其实这不是一个图片,我改了扩展名,你用FlashGet之类的工具下载下来,将扩展名改成rar,用WinRar打开就行了。
谢谢各位了!

解决方案 »

  1.   

    此档案文件格式未知或已经损坏http://www.xfocus.net/articles/200503/783.html
      

  2.   

    Get the source code,I am learning!
      

  3.   

    to linuxpgy (永远) :
      又见面了,我早知道有这个问题。用替换IAT的方法是做不到的。
    我最后用了提花动态库函数入口指令做到了。发给demo给你。
    你的邮箱是[email protected]吧。
      

  4.   

    谢谢啊,以前我只在2k Server下测试,所以这个问题一直没有发现。
    但是用替换IAT的办法还是能做到的,只是拦截了更底层的函数。同时拦截
    ZwCreateProcess和ZwCreateProcessEx这两个函数就好了。
    (2k Pro使用ZwCreateProcess函数,xp用ZwCreateProcessEx)。拦截CreateProcessA(W)的代码换成如下:
    //for windows 2k Professional(ZwCreateProcess)
    typedef  LPWSTR PUNICODE_STRING;
    typedef struct _OBJECT_ATTRIBUTES {
    ULONG Length;
    HANDLE RootDirectory;
    PUNICODE_STRING ObjectName;
    ULONG Attributes;
    PSECURITY_DESCRIPTOR SecurityDescriptor;
    PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
    } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
    //******** APIHOOK Code for ZwCreateProcess *************////Prototypes for the hooked functions:ZwCreateProcess
    typedef LONG (WINAPI *PFNZwCreateProcess)
    (OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN HANDLE InheritFromProcessHandle,IN BOOLEAN InheritHandles,IN HANDLE SectionHandle OPTIONAL,IN HANDLE DebugPort OPTIONAL,IN HANDLE ExceptionPort OPTIONAL);LONG WINAPI MyZwCreateProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN HANDLE InheritFromProcessHandle,IN BOOLEAN InheritHandles,IN HANDLE SectionHandle OPTIONAL,IN HANDLE DebugPort OPTIONAL,IN HANDLE ExceptionPort OPTIONAL);
    //Hook the ZwCreateProcess function
    CAPIHook g_ZwCreateProcess("ntdll.dll","ZwCreateProcess",
       (PROC)MyZwCreateProcess,TRUE);
    //this is the ZwCreateProcess replacement function:MyZwCreateProcess
    LONG WINAPI MyZwCreateProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN HANDLE InheritFromProcessHandle,IN BOOLEAN InheritHandles,IN HANDLE SectionHandle OPTIONAL,IN HANDLE DebugPort OPTIONAL,IN HANDLE ExceptionPort OPTIONAL)
    {
    //call the original ZwCreateProcess funtion
    LONG nResult=((PFNZwCreateProcess)(PROC)g_ZwCreateProcess)
    (ProcessHandle,DesiredAccess,ObjectAttributes,InheritFromProcessHandle,InheritHandles,SectionHandle,DebugPort,ExceptionPort);
    MessageBox(NULL ,"^_^,hooked!","Caption",0); return nResult;
    }
    //*******End of ZwCreateProcess APIHOOK Code*******////for window XP
    //******** APIHOOK Code for ZwCreateProcessEx *************////Prototypes for the hooked functions:ZwCreateProcessEx
    typedef LONG (WINAPI *PFNZwCreateProcessEx)
    (OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ParentProcess,IN BOOLEAN InheritObjectTable,IN HANDLE SectionHandle OPTIONAL,IN HANDLE DebugPort OPTIONAL,IN HANDLE ExceptionPort OPTIONAL,IN HANDLE Unknown );LONG WINAPI MyZwCreateProcessEx(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    IN HANDLE ParentProcess,IN BOOLEAN InheritObjectTable,IN HANDLE SectionHandle OPTIONAL,
    IN HANDLE DebugPort OPTIONAL,IN HANDLE ExceptionPort OPTIONAL,IN HANDLE Unknown );
    //Hook the ZwCreateProcessEx function
    CAPIHook g_ZwCreateProcessEx("ntdll.dll","ZwCreateProcessEx",
    (PROC)MyZwCreateProcessEx,TRUE);
    //this is the ZwCreateProcessEx replacement function:MyZwCreateProcessEx
    LONG WINAPI MyZwCreateProcessEx(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ParentProcess,IN BOOLEAN InheritObjectTable,IN HANDLE SectionHandle OPTIONAL,IN HANDLE DebugPort OPTIONAL,IN HANDLE ExceptionPort OPTIONAL,IN HANDLE Unknown )
    {
    //call the original ZwCreateProcessEx funtion
    LONG nResult=((PFNZwCreateProcessEx)(PROC)g_ZwCreateProcessEx)
    (ProcessHandle,DesiredAccess,ObjectAttributes,ParentProcess,
    InheritObjectTable,SectionHandle,DebugPort,ExceptionPort,Unknown);

    MessageBox(NULL ,"^_^,hooked  22222!","Caption",0); return nResult;
    }
    //*******End of ZwCreateProcessEx APIHOOK Code*******//
      

  5.   

    hook ZwCreateProcess是可以,
    从哪里得到创建进程的名称呢?
      

  6.   

    是啊,甚至连进程的ID都很难取得,行路难,你有好方法取得创建进程的ID吗(hook ZwCreateProcess方法)?
      

  7.   

    有一些函数我通过 IAT 的方式也没有在 2000 Professional 下拦截到,因为没有太多时间深入研究,因此也通过其他方法绕过了,呵呵
      

  8.   

    现在想了想,有些函数无法拦截有可能是因为某些函数通过 LoadLibrary/GetProcAddress 来完成的,这样在导入表中应该就不存在了
    既然能够通过截获 ZwCreateProcess 的话也有可能是该进程没有通过普通的 CreateProcess 来创建
      

  9.   

    创建进程的方法不是唯一的,也许是通过 ShellExecute 或 ShellExecuteEx 函数来执行的
    我刚刚在串口通讯中希望截获 CreateFileA/CreateFileW 对串口的打开,但后来发现它使用的是 OpenFileA
    同样的,某些通讯函数会使用 winsock1.1 或 winsock2.2 的函数,因此某些时候不能通过截获 send/recv来完成,而需要截获 WSASend / WSARecv
    通过 IAT 并不能在应用程序中截获所有调用
      

  10.   

    拦截ZwCreateProcess后只能得到进程的句柄,如何能通过进程的句柄获得进程的ID呢?
    知道的告知一声,谢谢!
      

  11.   

    问题大概就是这样了,至于为什么使用IAT的方法无法拦截CreateProcess而拦截ZwCreateProcess可以,我不想去深究了,因为这得去问微软。谢谢大家对我的指导和帮助,祝大家身体健康,生活愉快!