x64dbg-硬件编码序列号寻踪四
9unk Lv5

目标程序

程序下载:crakmeeasy

解压密码:9unk

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

观察程序

1.jpg

序列号寻踪

同样运行程序,并对 GetDlgItemTextA 设置断点。

2.jpg

运行程序到断点处

3.jpg

“Ctrl+F9” 运行程序到返回处,在数据敞口可以看到错误序列号

5.jpg

继续运行到程序主模块,发现下面有个 10445678951 的字符串,注意这里的值是从低位向高位存储。

4.jpg

继续执行后,发现把上面字符串的内存地址存存到 eax 中。

6.jpg

继续执行,可以看到这里把 eax(内存地址:00401222) 的前 4 个字符放到 edx 中。

7.jpg

8.jpg

我们继续单步运行,可以看到这段是把字符串存储到内存地址 0240F7A8 中

9.jpg

10.jpg

11.jpg

12.jpg

13.jpg

14.jpg

我们执行到执行到 memset 函数处,之这里有(count、c、dest)三个参数。我们这里先找一下 memset 函数的相关参数。

15.jpg

16.jpg

17.jpg

从 dest 这个变量的内存地址往后 8 个字符用 0 填充

我们继续运行这 memset 函数,可以看到后面的值都被填充为 0。

18.jpg

19.jpg

接下来调用的是 lstrlen 函数,用于计算字符串的长度。在堆栈中可以看到填充的内容。

20.jpg

然后 lstrlen 函数,将长度的返回值存到 eax,返回的字符串存到 ecx 中。

21.jpg

这里 把 eax 值减 1,然后存储到 edx 中。

22.jpg

23.jpg

这里把 edx 的 0A 和 值 00 进行比较。如果 0 小于 0A,就会跳转到 401360

24.jpg

JB: jump not above and equal 低于,即不高于且不等于则转移。CMP 比较无符号数后影响的是 CF。

继续执行,这里把错误的序列号存到 eax 中,然后再对 edx 初始化为 0 。

25.jpg

然后创建一个循环 eax + edx,然后 EDX 依次递增来获取我们输入序列号的每一个字节。这里将错误序列号的第一个字节 ‘1’ 存储到 edx 中,可以看到此时 edx 值变成了 31

26.jpg

movsx 指令是将指定字节保存到 edx 中,然后再向高位填充零,如果该字节为负数高位补 1

edx 的值 31 减去 14,然后将结果保存到 eax 中。

28.jpg

27.jpg

lea 指令,将中括号里的算数结果存储到指定的寄存器中

下一条指令 ebp-30,这里 edx 指向的内存地址是字符串 ‘10445678951’

29.jpg

下一条指令是把 ecx 初始化为 0,然后 ecx + edx 的第一个字节存储到 edx,此时 edx 值为 31

30.jpg

31.jpg

后面就是使用 eax 和 edx 进行比较,eax 是错误的序列号 ‘31-14’,edx 程序给的常量 ‘31’

也就是说:

正确的序列号 - 14 = 常量

正确的序列号 = 常量 + 14

32.jpg

34.jpg

因此,正确的序列号为:EDHHIJKLMIE

33.jpg

分析 API 插件:xAnalyzer

注意:下载 xAnalyzer.dp32 、 xAnalyzer.dp32、apis_def.zip(分别解压到 plugins 中)

35.jpg

  • 本文标题:x64dbg-硬件编码序列号寻踪四
  • 本文作者:9unk
  • 创建时间:2020-12-21 14:18:28
  • 本文链接:https://9unkk.github.io/2020/12/21/x64dbg-ying-jian-bian-ma-xu-lie-hao-xun-zong-si/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!