PE加载器,DLL内存加载器

背景

我最近研究了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 就可以找到很多代码。

发表评论

电子邮件地址不会被公开。 必填项已用*标注