字节特征码与通配符
AOB 是一组字节,常用作定位代码或数据的特征。本章说明 Cheat Engine 如何按字节匹配及使用通配符,适合想理解程序重启后如何重新定位的读者。
特征码从哪里来
启动并附加 CE 自带的 Tutorial,在第 5 关先定位数值并查找写入它的指令;也可在第 7 关选择需要分析的写入指令。打开内存浏览器,记录窗口实际显示的一段连续机器码,而不只是抄写反汇编文本。不同启动中的模块加载地址可能改变,因此原始绝对地址未必能复用;若代码字节仍存在,可以用 AOB 搜索相应位置。AOB 是 Array of Bytes 的缩写,既可用于精确字节序列,也可包含通配符。
假设某处观察到 48 8B 05 12 34 56 78,若已分析确认后四个字节是可能变化的位移,可尝试 48 8B 05 ?? ?? ?? ??。每个 ?? 代表一个任意字节,不是任意长度;这个例子只是说明格式,不是能定位任何具体程序的通用签名。实际位移是否应替换,要看指令编码及不同版本实测。
精度与唯一性
?、*、x 可作为官方命令文档所列的通配符;也可在一个半字节位置使用,例如 5? 表示高半字节为 5、低半字节不限定。越多通配符通常意味着约束越少,可能增加无关命中。把整个指令操作码都替换掉,会让本来关键的语义信息丢失;尾部全通配符也无法提供区分能力。
选取连续指令时保留稳定且有辨识度的部分,谨慎处理重定位相关位移、地址以及版本可能改变的立即数。一次只改少量通配符,查看每次结果数量和上下文。若恰好只有一个命中,仍要确认它是目标指令及目标模块,而不能仅以数量判断语义。
在练习程序中验证
使用 CE 的数组字节扫描,选择合适的扫描区域后输入刚才从 Tutorial 窗口采集的字节序列。打开每个结果的反汇编视图,对比原目标指令、相邻指令和已知行为;记录扫描范围、结果数和程序版本。重启 Tutorial、重新附加并回到同一关后重新扫描,比较命中的模块及功能;更新后的新版本也要重新验证。
零结果时先检查输入、目标进程、模块是否加载和页面范围,再考虑签名是否过于严格;多个结果时增加稳定的前后字节或缩小模块范围。特征码找到地址之后,任何改写仍需完整指令和原字节检查。
保存模式时同时记录来源位置和适用版本;日后更新特征时,可将新旧结果逐项比较,而不必从一个孤立的字节字符串猜测原来的用途。