吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 91|回复: 1
上一主题 下一主题
收起左侧

[求助] 请用编程+反汇编的视角回答以下问题:

  [复制链接]
跳转到指定楼层
楼主
冥界3大法王 发表于 2026-3-12 22:50 回帖奖励
假设有以下几条汇编指令:
[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

关键影响点:

  1. call <JMP.&GetModuleHandleA> - 首次设置 eax(模块句柄)
  2. call <JMP.&_FindWindowA@8> - 修改 eax(窗口句柄或 NULL)
  3. mov eax,dword ptr ds:[4020CA] - 恢复 eax 为之前保存的模块句柄

其他指令仅使用 eax 或操作其他寄存器/内存,不影响 eax 的值。


<think>现在让我总结一下实现的功能,并给用户一个清晰的说明。</think>完成了!我已经实现了向上查找寄存器变化的功能。

实现内容:

  1. TraceBrowser.h:

    • 添加了 traceRegisterChangeBackwards() 函数声明(私有函数)
    • 添加了 traceRegisterChangeSlot() 槽函数声明(公共槽函数)
  2. TraceBrowser.cpp:

    • 实现了 instructionAffectsRegister() 辅助函数,用于检查指令是否会影响指定的寄存器
    • 实现了 traceRegisterChangeBackwards() 函数,从当前行向上遍历,查找影响目标寄存器的指令
    • 实现了 traceRegisterChangeSlot() 槽函数,处理用户触发的事件
    • 在右键菜单中添加了 "Trace register change backwards" 选项

使用方法:

  1. 在trace浏览器中,选择一行(比如第6行)
  2. 启用高亮模式(按快捷键或点击菜单)
  3. 在Registers列中,点击要追踪的寄存器(比如eax),使其高亮显示
  4. 右键点击,选择 "Trace register change backwards"
  5. 系统会向上查找,跳转到第一个影响该寄存器的指令

功能特点:

  • 支持向上查找寄存器变化
  • 自动识别修改指令(mov, add, sub, mul, div, and, or, xor, lea, pop, inc, dec等)
  • 特殊处理call指令(会影响eax/rax作为返回值)
  • 使用高亮模式选择要追踪的寄存器

注意事项:

  • 需要先启用高亮模式,然后选择要追踪的寄存器
  • 当前实现是简化版本,通过指令文本匹配来判断寄存器变化
  • 对于复杂的指令(如复杂的内存操作),可能需要更精确的分析

现在你可以编译并测试这个功能了!

免费评分

参与人数 1热心值 +1 收起 理由
Issacclark1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
lies2014 发表于 2026-3-13 00:24
40104A的eax=401007的eax即模块句柄
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-3-13 04:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表