zoukankan      html  css  js  c++  java
  • GetModuleHandleW 分析

    首先查询MSDN,可以清楚地看到

     

    位于kernel32 dll 里面。

    有目标就好办,找到这个dll,然后,开工,进入IDA。

     

    跳啊

    就到下面那块了。

     

    遗憾的是。。。显然不是这里阿,实际上下一块调用的地方是kernelbase里面

     

    这里才对,代码非常少。

    下面那块是在取进程主模块基址,

    就是这里

    mov     eax, large fs:18h     //      取TEB

    mov     eax, [eax+30h]         //      取PEB

    mov     eax, [eax+8]             //      取基址,

    这块不管了,其实看伪码也能看出来,如果参数传NULL的话,自然就是取当前进程主模块地址。

    进入主菜

    这个函数,

    这里我们要先记录一下,前面是怎么传参的,

    KernelBase.dll

    BasepGetModuleHandleExW

    开始了

    在函数里面,首先判断参数1最低位是否是1

    运气真好,如果是1,就不进来,那么我们的调用源可以不进了

    参数2,值为2,肯定&4失败,所以这里也不会进

    直接走else

    首先,前面的& 0x1000 这个位置应该是在判断当前进程的模块里面是否有DLL模块,

    这个位的具体含义没有找到官方版,但是从其他地方找到了它的含义,是

    RTL_USER_PROCESS_PARAMETERS_PRIVATE_DLL_PATH

    判断是否有DLL模块路径,

    如果有的话,进入下面的if,先构造DLL 的路径名字,

    构造结果是这样的

    src  = Kernel32.dll

    src1 = D:XXXKernel.DLL

    src2 = D:XXXTest.exe.LocalKernel.DLL

    如果构造正确的话,

    调用

    一步一步失败了的话,最后直接调用

    后续我来分析这个函数

    如果这里再失败了,那么就获取Last Status,然后走人。

    如果成功了的话,

    后面

    进入NTDLL里面的这个函数,看名字很像增加DLL的引用计数,后续我来分析这个函数

    其实这里吧,前面调用当前函数的时候 dwFlags = 2,那么也就是说,

    其实,在前面判断dwFlags & 2 的地方,就已经越过了增加引用计数的功能了。

    所以GetModuleHandleW函数,其实是不增加模块引用计数的。

    之后继续

    其实这里之后就没什么了,

    因为前面没有加锁,所以后面也不需要解锁。

    释放两块内存,之后转交一下HANDLE,就返回了,完整流程结束

    到这里为止,就只有两个函数没有分析了,

    1:kernelbase 的 GetModuleHandleForUnicodeString

    2:ntdll 的 LdrAddRefDll

    今晚先放这吧,改日继续。

    其实没啥玩艺,逻辑很简单

  • 相关阅读:
    POJ 2752 Seek the Name, Seek the Fame
    POJ 2406 Power Strings
    KMP 算法总结
    SGU 275 To xor or not to xor
    hihocoder 1196 高斯消元.二
    hihoCoder 1195 高斯消元.一
    UvaLive 5026 Building Roads
    HDU 2196 computer
    Notions of Flow Networks and Flows
    C/C++代码中的笔误
  • 原文地址:https://www.cnblogs.com/suanguade/p/8705238.html
Copyright © 2011-2022 走看看