如何通过IDA中PE文件.data段的字节序列识别INT、浮点等数据类型
IDA PE文件.data段未知字节类型识别方法
优先通过程序上下文判断(准确率最高)
- 首先在IDA中选中这部分字节的起始地址,查看交叉引用(快捷键
X),找到所有访问这些地址的代码位置:- 如果访问指令是
mov 寄存器, dword ptr [地址],对应4字节整型;如果是mov qword ptr [地址], 寄存器对应8字节整型 - 如果是
movss xmm寄存器, dword ptr [地址]对应单精度浮点(float);如果是movsd xmm寄存器, qword ptr [地址]对应双精度浮点(double) - 如果是
lea 寄存器, [地址]或者直接把地址值当参数传递,大概率是指针类型 - 如果是按1字节/2字节访问,对应char/short类型
- 如果访问指令是
逐类验证常见数据类型
PE文件默认是小端序,所有数值转换需要按小端规则处理:
- 整型验证:按2/4/8字节拆分后转成十进制数值,看是否符合程序业务逻辑的合理范围,比如常见的配置值、枚举量、文件偏移、窗口尺寸等
- 浮点型验证:4字节按IEEE754单精度规则转数值,8字节按双精度规则转数值,检查是否是常用的计算参数、比例系数、物理常数等
- 指针验证:将字节按小端转成地址值,查看是否落在当前PE加载的内存空间范围内,比如是否指向.text段的函数入口、.rdata段的字符串或常量地址
- 二进制资源验证:如果以上类型都不符合,检查是否是加密/压缩数据、内置资源片段:可以先算字节熵,熵值过高大概率是加密数据或密文;也可以匹配常见文件头特征,比如PNG头
89 50 4E 47、ZIP头50 4B 03 04等 - 自定义结构体验证:如果不同偏移的访问长度不一样,说明是自定义结构体,可根据访问的偏移位置拆分不同字段,再按上面的方法逐个判断字段类型
测试方法优化思路
你之前写C程序对比的方法可以调整:不要随机修改浮点值测试,而是将当前待识别的字节按候选类型转成对应数值,再写到C程序中定义对应类型的变量,编译后查看生成的PE的.data段对应变量的字节是否和你现在拿到的字节完全一致,一致就可以确认类型。
内容的提问来源于stack exchange,提问作者neehack
相关产品推荐
相关产品推荐

