首页
社区
课程
招聘
[原创]PE分析小工具开发流水账(一)
发表于: 2025-11-11 17:40 555

[原创]PE分析小工具开发流水账(一)

2025-11-11 17:40
555

    最近想开发一个可以查看PE文件各字段值的小工具,虽然GitHub上肯定能找到很多这样的很厉害的工具,很多现代工具也集成了这样的功能,但我其实只是想作为学习项目来开发一个这样的小工具。


1.项目目标

    内核:C++

    界面:使用平台API

    基本功能:解析一个PE文件的各个字段,并在文件被混淆、加壳等异常情况时成功报错。

    扩展功能:处理特定壳处理过的PE文件,不是那种很复杂的,就比如UPX这种压缩壳啊,或者其他的一些简单壳。


2.当前设计思路

    这是我初步设计的一个工作图:


3.一些问题

    问题一:PE文件分析时上下文依赖的难拆分与可维护性冲突问题

    刚开始只设计了三个解析阶段,也就是读取——分析——输出的一个简单流程。但这里会产生一个超级大类,虽然上下文非常容易读取,但此时变得十分难以维护和扩展。于是就设计了现在的这个框架,将原本的分析工作分成了三个阶段,在第一个阶段中完成全文件的初步解析,并储存上文依赖字段,第二个阶段完成扩展壳特征分析,第三个阶段为添加壳的字段解析功能。这时二三阶段属于扩展,可以轻松添加与删除,虽然仍不是完全独立的,需要依赖一阶段存储的关键字段。且数据处理单独建立了一个类,存储输出的匹配结果和诊断信息。


    问题二:如何处理字段映射的格式转换以及正确性

   这里我的设计思路是依赖于加载器关键字段作为标杆。什么样的文件是PE文件?PE文件本质上就是一种格式,假设一个混淆过PE文件被修改了1%,比如只改了MZ头,它不能运行,但是我可以说他是一个被修改被混淆过的PE文件。但一个标准的PE文件被修改了99%,我可以说它已经不是PE文件了。而PE文件,或者说恶意软件,它们希望的结果必然是执行,以上面说的修改MZ头为例,其实这种修改并没有什么意义,只是我说的一种极端情况而已,因为一旦MZ头被修改,它一定会在加载器那里报错,变成不可执行的文件。所以说加壳啊,混淆啊,本质上都不会修改哪些加载器依赖的字段,所以我可以大概率的信任这些字段,信任的字段不仅包括信任值,也包括偏移,如果加载器有机会找到那些值,我也可以,所以在第一阶段的处理中,我就是逐字节按顺序提取那些关键字段,至于其他字段,他们是后面阶段要处理的事情。


    问题三:极端情况

    如问题二中的假设那样,一个文件仅仅被修改了MZ头,这时工具直接报错看起来好笨,因此我认为也不能完全信任加载器依赖字段。所以这时需要尽可能的诊断更多的依赖字段,我设定的标准是,如果一半以上的依赖字段出现问题,基本上就可以判断这里不是一个有效的PE文件,分析它并没有什么价值,可以直接报错了。但对于某些值来说,是强烈关联的,必然machine值与magic值,如果magic值被恶意篡改,我也许需要进行反推和预分析,我目前开发到这里,出现了滚雪球一样的需求延申,这里也是需要平衡的地方。像magic值,会关系到后面按照什么结构来进行后续分析,所以这也是不得不解决的一个问题。


    问题四:简洁性设计

    PE文件中存在不止一处的字段关联性,比如上面提到的machine与magic字段关联,还存在比如实际偏移和值规定偏移的区别。还有比如节区数的规定和实际节区数,虽然正常解析会忽略那些多出来的节区,但是在代码执行中任何的空隙都能够指定指针进行跳转执行,所以这些是必须考虑的。我认为如果每次遇到一个这样的问题就全文解析一遍会非常浪费时间,因此怎么设计的简洁很重要,目前我没有想到怎么尽可能少次的读取和分析文件,未来想到的话会继续在流水账里面分享。


    好多问题……如果有一天我真能做完,我就最终把它开源。


[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

最后于 2025-11-16 15:45 被Calparrot编辑 ,原因: 减少口语化表述,并更新一些遇到的问题。
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回