模块扫描与区域选择
CE 可以在不同范围内扫描 AOB。本章比较全进程、模块和指定区间的用途,帮助你减少无关结果,同时避免把扫描范围误认为正确性证明。
先确定范围
附加 CE 自带 Tutorial,在第 5 关查找写入数值的指令,或在第 7 关选中注入点。在内存浏览器中确认目标指令属于哪个模块,记录模块名称及相对偏移。32 位目标的名称可能是 Tutorial-i386.exe;若使用 64 位 Tutorial,模块可能是 Tutorial-x86_64.exe,应以实际进程和模块列表为准。程序本体、动态库和运行时生成的代码可能处于不同区域。若特征确实位于某个已加载模块,限定该模块能减少无关内存的匹配;若代码来自动态生成区域,就不能无条件假设它属于主模块。
AA 中 aobScan 搜索进程内存,aobScanModule 限定一个模块,aobScanRegion 使用指定范围。实际可读区域、模块加载时机、扫描保护选项会影响结果。脚本中直接选择一个范围前,应在 CE 中验证该范围真实包含目标代码,并与当前进程和架构匹配。
理解模块扫描语法
下面是语法示意,模块和字节都是假设值,并非已采集的 Tutorial 字节。练习时应将模块替换为当前实际名称,并将模式替换为从当前关卡窗口采集并确认的字节:
aobscanmodule(exampleHit,Example.exe,48 8B 05 ?? ?? ?? ??)
第一个参数是找到位置时使用的符号,第二个是模块名,第三个是字节模式。官方文档还介绍 $process 作为当前进程名称的用法。AA 的扫描命令会把首个匹配位置作为标签,因此脚本执行成功并不证明只有一个匹配;需要另用扫描界面或 Lua 收集全部结果。
指定区域与定位偏移
指定区域时要确认起止范围实际覆盖整个目标模式,还要留意模块尚未加载、卸载或重新加载。结果通常指向特征首字节,若目标指令在特征内部,则需要根据实际字节数计算偏移并在反汇编器确认指令边界。偏移不是凭反汇编行数计算:不同指令长度可能不同。
练习验收:在同一进程分别记录全范围与目标模块的结果数;对每项结果检查所属模块、实际字节及指令。模块范围找不到而全范围存在时,先核查目标是否属于所选模块和该模块是否已加载,再重新判断扫描范围。
定位到候选后,可先在内存浏览器查看模块边界,再将候选地址与该范围对比。多个同名或功能相似的模块、运行时生成代码以及尚未执行的路径都会影响判断;无法确认模块归属时,应保留候选并继续观察,而非直接选择第一个地址。