为何调用GetModuleHandleA函数获取当前可执行文件句柄?
关于逆向练习中GetModuleHandleA(NULL)的疑问解答
嘿,刚好我也折腾过类似的逆向练习题,来给你掰扯明白这事儿:
1. GetModuleHandleA(NULL)到底返回啥?
你查的文档没毛病,当参数传NULL时,这个函数返回的是当前进程的主可执行文件(就是你正在逆向的这个程序本身)的模块句柄。而在Windows系统里,模块句柄本质上就是这个模块被加载到内存中的起始基地址。很多逆向题里会用这个操作来获取程序自身的基址,方便后续做内存读写、查找导出表这类操作。
2. 为啥要检查这个调用是否失败?
正常情况下,一个正常运行的程序调用GetModuleHandleA(NULL)几乎不可能失败——系统肯定能找到当前进程的主模块啊。那出题人加这个检查大概率是个逆向小陷阱:要么是用来伪装成反调试逻辑,要么就是故意用这个“永远不会触发”的失败分支来放一个弹窗,给逆向新手制造点小障碍。
3. 怎么移除那个讨厌的弹窗?
既然正常调用不会失败,那程序里的失败分支(弹弹窗的那段代码)其实是死代码。你要做的就是:
- 找到检查
GetModuleHandleA返回值的汇编逻辑(比如判断返回值是否为NULL的指令) - 把跳转指令改掉,让程序永远跳过弹窗分支;或者直接把弹窗代码用
nop填充,甚至删掉整个检查逻辑都行。
举个实际例子,假设汇编里是test eax, eax然后jz show_popup,你把jz改成jmp直接跳过弹窗分支,或者把test eax,eax改成mov eax, 1让判断永远为真,都能轻松搞定这个弹窗。
内容的提问来源于stack exchange,提问作者JDoe
相关产品推荐
相关产品推荐

