python反编译luac_Lua程序逆向之为Luac编写IDA Pro文件加载器

距离上一次讲Lua程序逆向已经有一段时间了,这一次我们书接上回,继续开启Lua程序逆向系列之旅。

在软件逆向工程实践中,为第三方文件编写文件格式分析器与指令反汇编器是一种常见的场景。这一篇的主要目的是,讲解如何为IDA Pro编写Luac的文件加载器,一方面强化对二进制文件格式的理解;另一方面,通过对IDA Pro进行扩展的插件式开发,更深入的领会IDA Pro的设计思想,以及掌握更多的高级使用方法。

IDA Pro提供了抽象的文件加载器与处理器模块概念。文件加载器与程序运行时的动态加载概念类似,将文件中的代码与数据,按照一定的逻辑方式进行排列与显示,文件加载器在设计时,会优先选择与文件二进制本身相关的数据结构进入载入,比如Windows、LInux、macOS上的二进制PE、ELF、Mach-O文件,它们都有数据、常量、代码段的概念,IDA Pro允许将这些二进制的不同的数据,加载到不同类型的段里面。

文件加载器的工作就是:分析文件的基本格式;解析文件的段层次结构,将需要用到的数据与代码加载到IDA Pro当中;区分与构建二进制中的数据与代码在段中的位置;创建函数,变量,建立交叉引用辅助用户进行分析等。当然,最后一项工作也可由处理器模块完成。

二进制文件加载器架构

IDA Pro没有详细的文档描述好何为二进制开发文件加载器,最有效的学习途径是阅读IDA Pro程序中自带的开源的文件加载器模块代码。

IDA Pro软件在升级着,版本的变化可能会也带来文件加载器开发接口的变化,本篇写作时,对应的IDA Pro版本为国内众所周知的IDA Pro版本7.0,实验环境为macOS 10.12平台。IDA Pro支持使用C/C++/idc/Python等多种语言编写文件加载器。这里选择使用Python,一方面基于语言的跨平台性,再者,IDA Pro软件的加载器目录(macOS平台):/Applications/IDAPro7.0/ida.app/Contents/MacOS/loaders中,有着可以参考的代码。理论上,本节编写的Luac文件加载器,放到Windows等其他平台上,不需要进行任何的修改,也可以很好的工作。

本次参考使用到的代码是uimage.py模块,这个不到200行的Python脚本是一个完整的U-Boot镜像加载器,完整的展示了二进制文件加载器的编写流程,是不错的参考资料。

文件加载器的架构比较简单,只需要在py文件中提供两个回调文法即可。分别是accept_file()与load_file()。accept_file()负责检查二进制文件的合法性,解析结果正常则返回二进制文件的格式化描述信息,该信息会显示在IDA Pro加载二进制文件时的对话框中,供用户进行选择。accept_file()的声明如下:

def accept_file(li, filename):

"""

Check if the file is of supported format

@param li: a file-like object which can be used to access the input data

@param filename: name of the file, if it is an archive member name then the actual file doesn't exist

@return: 0 - no more supported formats

string "name" - format name to display in the chooser dialog

dictionary { 'format': "name", 'options': integer }

options: should be 1, possibly ORed with ACCEPT_FIRST (0x8000)

to indicate preferred format

"""

accept_file()判断文件合法后,再由load_file()执行二进制的具体加载工作,这些工作包含设置处理器类型、将文件内容映射到idb数据库中、创建数据与代码段、创建与应用特定数据结构、添加入口点等。accept_file()的声明如下:

def load_file(li, neflags, format):

"""

Load the file into database

@param li: a file-like object which can be used to access the input data

@param neflags: options selected by the

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值