目标程序
程序下载:Acid burn
解压密码:9unk
任务目标:寻找正确序列号
F2 断点原理
F2 断点:设置 F2 断点的时候,程序会在断点指令前面添加 int3 中断指令,其机器码是 CC,所以 F2 断点也称为 int3 断点(CC 断点)。
利弊:设置 F2 断点的好处是可以设置无数个,坏处是容易被检测到,进而执行干扰调试的反调试程序。
逆向步骤
运行性程序观察程序特征
使用查壳工具查壳(如果加壳就先脱壳,没加壳就直接进入下一步)
使用IDA进行静态分析(找到程序关键点)
使用 x64dbg 进行动态调试
观察程序
观察程序由三个按钮:1.序列号/名字 2.退出 3.序列号。这里先从简单的做起,点击第三个按钮 “Serial”。
到达下面的界面随意输入任何字符串,这个时候弹窗出现 “Try Again!”。这个字符串就是关键字符串。
分析步骤
Serial
先 “F9” 运行到程序模块(主模块),之后再右键—>搜索—>当前模块—>字符串。
之后可以看到许多的字符串,如下图所示
这时在下面的搜索区域搜索字符串,x64dbg 会自动筛选出所有类似的字符串。
但是这边有三个字符串,不知道该如何选择。在不知道具体是哪个字符串的时候我们只需要给满足条件的字符串下断点,右键—> 所有命令上设置断点。
之后就是按 “F9” 直到让程序运行起来(我这边将 选项—>选项—>事件 中的 “TLS回调函数” 取消了,所以操作中少按了一次 “F9”)。
程序运行后,在 “Serial” 中输入任意字符串,并点击 “Check it Baby!”。可以看到此时程序停在了 “0042F4F8” 这个内存地址上。
从断点处往上查看错误消息和跳转指令,仔细查看可以看到在 “0042F4D5” 处有个关键跳转指令。很明显可以看到,只要跳转成功程序就会输出 “try again”,不跳转程序就会输出 “God Job Dude”。所以只要这里不跳转程序就能破解成功。
在 “jne” 指令处用分号添加注释,然后继续向上看,可以看到一个 call 子程序。这个子程序应该是在判断 Serial 的值是否正确,然后下面再进行跳转,如果正确输出正确信息,如果错误就输出 “try again!”。之后在 “call” 指令处按 “F2” 设置断点。
然后重新按 “F9” 运行程序,并点击 “Check it Baby!”,此时程序停在 call 命令处。在右边的寄存器的窗口可以看到 EAX=123456;EDX=Hello Dude!
,下面的 call 命令应该是判断这两个字符串是否相等,所以程序正确的序列号应该是 “Hello Dude!”。
Serial/Name
观察程序 Serial/Name
删除之前设置的断点,点击 “断点” ,右键—>删除全部。然后再进入 CPU 处,使用 “ctrl+f2” 重新加载程序。
运行到主模块,并搜索字符串 “Sorry , The serial is incorect!”,然后在所有命令上设置断点。
运行程序,此时程序停在 “0042FB26” 地址处,向上查看可以找到关键跳转 jne 和 call 命令。同样在 jne 命令处设置注释,在 call 命令处设置断点。
“F9” 继续运行程序,此时看到程序运行在 call 指令处。可以看到右边的 EAX=CW-8692-CRACKED
,这个很有可能是正确的 Serial。
总结
注册码部分是一个简单的明文判断。
注册码/名字部分是根据名称所生成的注册码。
reference
- 本文标题:x64dbg-字符串搜索
- 本文作者:9unk
- 创建时间:2020-12-03 11:00:07
- 本文链接:https://9unkk.github.io/2020/12/03/x64dbg-zi-fu-chuan-sou-suo/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!