如何使用pefile区分PE文件中的代码字节与数据字节
PE文件代码字节与数据字节区分方法
- 节属性判断:PE节头中包含明确的段属性标记,原生
.data节默认属性为IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE,被标记为可读写数据段,无执行权限;常规代码段(包括你植入shellcode的.CRT节如果配置为可执行)会携带IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ属性,默认无写入权限,这是最基础的判别依据。 - 反汇编合法性校验:数据段字节反汇编后会出现大量无效操作码、非法指令,或是频繁出现无意义的超长指令、异常操作数,比如.data段存储的全局变量值反汇编结果大多是CPU无法正常执行的无效内容;而人工植入的shellcode属于合法可执行代码,反汇编后全部为x86/x64架构下的合规指令,序列连贯,符合寄存器操作、函数调用的常规逻辑。
- 字节序列统计特征:代码段的字节分布完全符合对应架构指令集的编码规律,比如x86架构下0x90(nop)、0x55(push rbp)这类高频操作码的出现概率远高于数据段;数据段的字节分布更随机,大量出现ASCII码、小端序整数常量等数据类型特征值,常见指令操作码的出现概率极低。
- 控制流逻辑校验:有效代码的指令序列可以构建出完整的控制流图,存在明确的跳转目标、函数出入口结构(比如典型的函数序言
push rbp; mov rbp, rsp、尾声leave; ret);而数据字节反汇编得到的内容无法构建连贯控制流,跳转目标大多指向无效地址,不存在正常的函数结构。 - 交叉引用类型校验:正常代码段的指令会被段内跳转、调用指令引用,也会和导入表、重定位表等PE结构产生关联;而.data段的字节只会被代码的内存读写指令引用,不会作为执行流的跳转目标出现,你植入的可执行shellcode只要能被触发,必然存在指向它的执行流引用,和普通数据的引用类型完全不同。
内容的提问来源于stack exchange,提问作者hashy
相关产品推荐
相关产品推荐

