• 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

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

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

  • 相关阅读:
    原生js实现 table表格列宽拖拽
    vue.js 利用SocketCluster实现动态添加数据及排序
    angular-websocket.js 使用
    判断当前页面是否是激活状态。
    remove ---会报错discard不会报错
    .pop ----remove 删除
    add添加
    #将相同值输出,取一个值
    集合
    __delattr__\__delitem__
  • 原文地址:https://www.cnblogs.com/suanguade/p/8705238.html
Copyright © 2020-2023  润新知