PE完整镜像可匹配Shellcode特征但各段均搜索不到的原因是什么?
问题原因
- pefile使用错误:你调用
sec.get_data(sec.PointerToRawData, sec.SizeOfRawData)的参数完全不符合接口要求。Section.get_data()的第一个入参是相对于当前段自身起始位置的偏移,不是PE文件的全局文件偏移。sec.PointerToRawData是该段在磁盘文件中的全局起始偏移,你把这个值作为段内偏移传入,相当于从段开头跳过了数千字节,绝大多数情况已经超出段本身的长度,根本读不到有效数据,自然匹配不到特征。
正确写法直接调用sectionData = sec.get_data()即可,无参状态下默认读取整个段的所有原始数据。 - 存储位置预期错误:你定义的
unsigned char buf[]是栈上局部变量,初始化所用的字符串字面量默认会被编译器放在.rdata只读数据段,而非你预期的.data可写数据段。如果开启了较高等级的编译优化,编译器甚至会把这个短常量直接作为立即数嵌入到.text代码段的指令流中,不会单独出现在数据段。 - 内存镜像与磁盘文件的差异:
get_memory_mapped_image()返回的是PE按照内存加载规则对齐后的镜像,会包含段之间的内存填充、重定位修正后的内容,和磁盘上存储的原始段数据存在差异,甚至部分特征刚好落在段之间的填充区域,遍历单个段原始数据就会漏掉。
排查要点
- 修正pefile的段数据读取代码后重新匹配
- 检查编译选项:确认是否开启了O2/O3优化、字符串常量合并、常量嵌入等优化开关
- 用IDA、x64dbg等反汇编工具手动定位目标特征字节的地址,确认其所属的段范围
- 排查特征字节是否存在跨段的情况:如果特征一部分在前一个段末尾,一部分在后一个段开头,单段匹配自然无法命中
内容的提问来源于stack exchange,提问作者hashy
相关产品推荐
相关产品推荐

