假设有以下几条汇编指令:
[Asm] 纯文本查看 复制代码 push 0
call <JMP.&GetModuleHandleA>
mov dword ptr ds:[4020CA],eax
push 0
push crackme.4020F4
call <JMP.&_FindWindowA@8>
or eax,eax
je crackme.40101D
mov dword ptr ds:[402064],4003
mov dword ptr ds:[<&WndProc>],<crackme.WndProc>
mov dword ptr ds:[40206C],0
mov dword ptr ds:[402070],0
mov eax,dword ptr ds:[4020CA]
mov dword ptr ds:[402074],eax ====》 假想敌为这里!
从此行向上。。哪些地方影响了eax的数值? 在行末尾加上(数字 标顺序)
如图所示,我让AI写了个自动标注 影响 寄存器的功能 ,它把eax都加亮显示了。。。
我怎么感觉不对呢?我感觉 它编的太过形式主义。。。
于是又问了DeepSeek
以下是影响 eax 数值的指令,并按顺序标记:
assembly push 0 call <JMP.&GetModuleHandleA> ; (1) eax = GetModuleHandleA(0) 的返回值 mov dword ptr ds:[4020CA],eax ; (2) 保存 eax 到 [4020CA],但不改变 eax push 0 push crackme.4020F4 call <JMP.&_FindWindowA@8> ; (3) eax = FindWindowA(0, "窗口类名") 的返回值 or eax,eax ; (4) 影响标志位但不改变 eax je crackme.40101D mov dword ptr ds:,4003 ; (5) 不影响 eax mov dword ptr ds:[<&WndProc>],<crackme.WndProc> ; (6) 不影响 eax mov dword ptr ds:[40206C],0 ; (7) 不影响 eax mov dword ptr ds:,0 ; (8) 不影响 eax mov eax,dword ptr ds:[4020CA] ; (9) eax = [4020CA](恢复之前保存的值) mov dword ptr ds:,eax ; (10) 保存 eax 到 ,但不改变 eax
关键影响点:
- call <JMP.&GetModuleHandleA> - 首次设置 eax(模块句柄)
- call <JMP.&_FindWindowA@8> - 修改 eax(窗口句柄或 NULL)
- mov eax,dword ptr ds:[4020CA] - 恢复 eax 为之前保存的模块句柄
其他指令仅使用 eax 或操作其他寄存器/内存,不影响 eax 的值。
<think>现在让我总结一下实现的功能,并给用户一个清晰的说明。</think>完成了!我已经实现了向上查找寄存器变化的功能。
实现内容:
-
TraceBrowser.h:
- 添加了
traceRegisterChangeBackwards() 函数声明(私有函数)
- 添加了
traceRegisterChangeSlot() 槽函数声明(公共槽函数)
-
TraceBrowser.cpp:
- 实现了
instructionAffectsRegister() 辅助函数,用于检查指令是否会影响指定的寄存器
- 实现了
traceRegisterChangeBackwards() 函数,从当前行向上遍历,查找影响目标寄存器的指令
- 实现了
traceRegisterChangeSlot() 槽函数,处理用户触发的事件
- 在右键菜单中添加了 "Trace register change backwards" 选项
使用方法:
- 在trace浏览器中,选择一行(比如第6行)
- 启用高亮模式(按快捷键或点击菜单)
- 在Registers列中,点击要追踪的寄存器(比如eax),使其高亮显示
- 右键点击,选择 "Trace register change backwards"
- 系统会向上查找,跳转到第一个影响该寄存器的指令
功能特点:
- 支持向上查找寄存器变化
- 自动识别修改指令(mov, add, sub, mul, div, and, or, xor, lea, pop, inc, dec等)
- 特殊处理call指令(会影响eax/rax作为返回值)
- 使用高亮模式选择要追踪的寄存器
注意事项:
- 需要先启用高亮模式,然后选择要追踪的寄存器
- 当前实现是简化版本,通过指令文本匹配来判断寄存器变化
- 对于复杂的指令(如复杂的内存操作),可能需要更精确的分析
现在你可以编译并测试这个功能了!
|