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:\XXX\Kernel.DLL

src2 = D:\XXX\Test.exe.Local\Kernel.DLL

 

 

如果构造正确的话,

调用

 

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

 

后续我来分析这个函数

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

如果成功了的话,

 

后面

 

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

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

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

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

 

之后继续

 

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

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

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

 

 

 

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

1:kernelbase 的 GetModuleHandleForUnicodeString

2:ntdll 的 LdrAddRefDll

 

 

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

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

 

posted @   穷到底  阅读(991)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示