背景
我最近研究了DLL内存加载,网上找了好久代码,基本的原理差不多,自己稍微总结一下。
逻辑
- 内存读取PE,按照PE格式进行加载(任何一本介绍PE的书籍都可以看有关知识)
- 修复重定位表(这点非常重要,我开始不明白他怎么修复定位表)
- 修复定位表
- 其他细节(tls回调,修改PEB)
- 调用入口启动
疑惑
1:怎么执行代码?
我们创建内存,然后复制PE到内存中,然后直接调用,但一些变量地址或者函数地址是以va(虚拟地址)直接访问,这些地址固定死的,但加载内存时候,基本不可能是原来的基地址,那么这些地址就是错误地址。那么这些地址要被修改,所以正常加载DLL或者EXE(正常启动EXE基本地址不会变化),如果模块的基地址变化都需要修改地址不然会崩溃。那重定位表记录原来硬编码的地址,我们遍历所有地址修复就修改掉。
2;兼容性
因为毕竟是我们人工模拟加载,那么可能缺失很多环境,导致异常。程序异常退出,这种只能通过OD动态调试分析,然后结合进程,线程有关知识来进行分析。最快就拿别人开源代码跑,因为这种都是经验,如果对这块没有研究,突然去研究感觉有点懵。
代码
1:一份简单代码
2:一份比较稳定,代码非常漂亮
https://github.com/polycone/pe-loader
可以加载MFC,代码优美,多了PEB修复,TLS回调等,只能启动标准的PE,不支持c#.可以正常启动酷我。酷狗启动不了,网易云音乐可以,QQ可以启动但看进程明显自动创建进程来实现。PC微信可以。整体看稳定系还是非常高,而且如果我们自己用,被启动程序我们也可以改,来适配稳定系。
加载DLL
加载DLL比EXE简单一些,不用修复PEB,我暂时没有测试DLL,但应该差不多。
作用
这个看每个人用途,这个技术和android插件技术类似,android多开就是插件技术,稳定性就要看模拟的程度了,这样子技术需要大量的用户测试反馈来排除一些坑。
备注
1:我本想顺着分析loadlibray,发现对于我非内核开发或者非专门逆向分析来说有点难,这种需要经验分析,有一些书籍有涉及,但比较少。
2:大量这几天查看和阅读大量知道PE加载器的核心知识点。
3:找相关代码 google : pe loader github 就可以找到很多代码。