使用AheadLib生成DLL劫持代码

本文介绍了DLL劫持的概念,利用 AheadLib 工具伪造DLL以实现程序加载时调用自定义功能。通过填写目标DLL路径生成CPP代码,创建DLL项目并编译,设置为多字节字符集,关闭预编译选项。在DllMain中添加自定义功能。针对32位程序,需注意判断进程类型并获取正确的目录,以避免HOOK失败。
摘要由CSDN通过智能技术生成

程序加载DLL会有一个优先级顺序,其中,最先加载的是同一目录下的DLL,DLL劫持的原理是在程序的同目录下放一个自己写的DLL,让程序将我们伪造的DLL加载进去,然后在我们的DLL里调用真正DLL的函数。

借助 AheadLib 工具我们可以很方便的伪造DLL。比如,我们想劫持user32.dll,只需将user32.dll的路径填入,然后生成CPP代码。

在这里插入图片描述
看一下生成的代码,由于user32.dll里面函数很多,有1213个,所以代码非常长。
在这里插入图片描述

接下来,创建一个DLL项目,将代码放进去编译,设置项目编码为多字节字符集,关闭预编译选项,即生成了一个伪造的user32.dll。

在这里插入图片描述
我们可以在DllMain里添加想要的功能。

在这里插入图片描述
注意,如果我们的程序是32位,则要拿SysWOW64下

DLL劫持算是一个很古老的技术了,早在XP时代就有臭名昭著的lpk .dll劫持,病毒通过伪装系统 lpk .dll达到注入目标进程,为什么会被劫持呢?因为在程序执行的时候会在当前目录搜索 lpk .dll文件,如果文件存在就会被加载到进程地址空间。 DLL劫持原理:   DLL劫持技术当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间中,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间中。  由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录中查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行。这个过程用个形象的词来描述就是系统DLL劫持(hijack)了。  伪造的dll制作好后,放到程序当前目录下,这样当原程序调用原函数时就调用了伪造的dll的同名函数,进入劫持DLL代码,处理完毕后,再调用原DLL此函数。  这种补丁技术,对加壳保护的软件很有效,选择挂接的函数最好是在壳中没有被调用的,当挂接函数被执行时,相关的代码已被解压,可以直接补丁了。在有些情况下,必须用计数器统计挂接的函数的调用次数来接近OEP。此方法巧妙地绕过了壳的复杂检测,很适合加壳程序的补丁制作。  一些木马或病毒也会利用DLL劫持技术搞破坏,因此当在应用程序目录下发现系统一些DLL文件存在时,如lpk.dll ,应引起注意。 思路: 我们拿winmm.dll劫持做演示,通常的劫持技术是导出和winmm.dll同样的函数并提供相同的参数,当程序运行后加载winmm.dll会事先在当前目录查找,此时如果你编写的伪装winmm.dll在当前目录就会被加载到进程空间,如果程序还调用了里面的函数就会调用你编写的函数你必须保证可以正常运行你得调回原winmm.dll中的函数。 这样来回调用大大降低了效率,而且易语言 导出的函数的特殊性大大降低了效率甚至部分程序还不能正常的回调。 那有没有办法解决这个问题呢? 于是我想到了能不能调用函数的时候直接跳转到原函数呢 这样大大降低了劫持影响的效率  比如 程序a.exe调用 a.dll 里面的 test函数 劫持后 程序a.exe调用a.dll里面的test的时候 会先调用我们劫持dll里面的test然后跳转到a.dll里面的test 这样就相当于调用一个函数变成了调用两个函数 我们完全可以这样 调用我们的test的时候 直接跳转到原函数 而且我们的导出函数不需要提供任何参数跟返回值 这简直太棒了!! DLL公开的子程序就是只用作导出函数请不要加任何代码没有意义。 例程: 直接上winmm.dll劫持源码 使用黑月编译 测试劫持:易语言核心支持库(krnln.fne) 微信 QQ Steam QQ飞车 CF 英雄联盟 一切正常。测试只是为了得到劫持效果仅供参考,请勿用于非法用途。 DLL劫持生成工具 由于时间关系先到这里,后续再更。。。 如果想自己回调某个函数拦截修改功能,请把pszProcName数组变量对应的成员名称给删除 然后自己修改对应的导出函数 提供原函数同样的参数跟返回值
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值