x64dbg-硬件断点
9unk Lv5

目标程序

程序下载:CRACKME2

解压密码:9unk

任务目标:寻找正确序列号

硬件断点原理

在寄存器中,有一些寄存器是用于调试的。人们把他们称为调试寄存器,调试寄存器一共有 8 个名字分别从 Dr0-Dr7。所以我们也把调试寄存器简单的称为 Drx。

  • 对于Dr0-Dr3的四个调试寄存器,他们的作用是存放中断的地址,因此 x64dbg 只能设置 4 个硬件断点。
  • 对于Dr4,Dr5这两个寄存器我们一般不使用他们,保留。
  • 对于Dr6,Dr7这两个寄存器的作用是用来记录你在Dr0-Dr3中下断的地址的属性,比如:对这个401000是硬件读还是写,或者是执行;是对字节还是对字,或者是双字。

优点:不会改变指令,不会被自校验检测,精确到字节

缺点:只能建立4个

观察程序

程序有一个文本框(这时应该考虑到 GetDlgItemTextA)、按钮。

1.jpg

分析步骤

“F9” 运行程序,然后再使用 “ctrl+N” 查找 Crackme2.exe 的 GetDlgItemTextA。

1.jpg

双击 “GetDlgItemTextA”,右键断点—>设置硬件断点(执行)。此时可以看到 DR0 调试寄存器,存储了第一个断点的地址。

2.jpg

3.jpg

继续运行程序,此时程序断在了 “GetDlgItemTextA” 处。

4.jpg

“ctrl+F9” 运行程序到返回处,继续单步运行返回到主模块中。

5.jpg

向上分析程序,看到刚才输入的 password “123456”。选择这条命令,右键—>在内存窗口中转到—>crackme2.40217E。查看下面的内存窗口,可以看到 “123456”。

6.jpg

选中内存 1 中的 “123456”—>右键—>断点—>硬件,访问—>字节。此时可以看到 DR1 调试寄存器,存储了第一个断点的地址。

7.jpg

8.jpg

“F9” 继续运行程序,看到此时程序断在了计算判断 password 的部分。向上分析程序,可以看到正确消息和错误消息,这里把正确消息的内存地址记一下。

12.jpg

9.jpg

这里主要不是分析程序的算法,所以这里按 “F8” 让程序执行到 ret 指令处。继续执行程序,分析可以找到 “正确 call” 和 “关键跳转”。

10.jpg

11.jpg

后面就可以使用爆破方式破解程序。

15.jpg

16.jpg

  • 本文标题:x64dbg-硬件断点
  • 本文作者:9unk
  • 创建时间:2020-12-09 11:00:07
  • 本文链接:https://9unkk.github.io/2020/12/09/x64dbg-ying-jian-duan-dian/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!