HOOK 一个API的时候,如何判断该API是否在某个DLL中被调用的呢?
例子:已知DLL的名字为: abc1.dll.
该DLL中调用了Createfile();
hook ZwCreateFile的时候,
如何判断
ZwCreateFile 是在该DLL中呢?

解决方案 »

  1.   

    GetProcAddress FunctionRetrieves the address of an exported function or variable from the specified dynamic-link library (DLL).
    可是,ZwCreateFile 可能没有被任何DLL调用的
      

  2.   

    FARPROC GetProcAddress(
      HMODULE hModule,    // handle to DLL module
      LPCSTR lpProcName   // function name
    );直接给hModule传递dll  给lpProcName传递函数名   如果返回的是NULL  在这个dll中就没有这个函数。
      

  3.   

    谢谢楼上的,
    只是
    这里存在两个问题:
    第一:对于:abc1.dll,使用loadlibraryex,和loadlibrary返回的数值可能是不同的。
    所以hModule是不确定的。
    第二:即使hModule可以控制为相同的,不同的exe加载abc1.dll的时候,返回数值也是不同的,所以还是没有有办法通过:FARPROC 判断一个函数当前是否在DLL中运行。
    问题再次描述如下:HOOK 系统API ZwCreateFile的时候:
    处理如下:ZwCreateFile(
       OUT PHANDLE FileHandle,
       IN ACCESS_MASK DesiredAccess,
       IN POBJECT_ATTRIBUTES ObjectAttributes,
       OUT PIO_STATUS_BLOCK IoStatusBlock,
       IN PLARGE_INTEGER AllocationSize OPTIONAL,
       IN ULONG FileAttributes,
       IN ULONG ShareAccess,
       IN ULONG CreateDisposition,
       IN ULONG CreateOptions,
       IN PVOID EaBuffer OPTIONAL,
       IN ULONG EaLength
       )
    {...
    ...

    //问题就在这里,
    //如何知道当前代码运行在 abc1.dll 之中,不论是X.EXE,Y.EXE还是ppp.exe....,
    //只要该.exe加载了abc1.dll,此处都能判断出来。
    ...
    ...}
      

  4.   

    貌似只有翻堆栈了,而且abc1.dll很可能不直接调用ZwCreateFile,而是调用CreateFile之类的,然后ZwCreateFile被CreateFile调用
      

  5.   

    to magic7004:
    abc1.dll 是自己写的,一定调用ZwCreateFile。
     
    to 5,6,7楼:判断地址所述的模块似乎有些复杂