目标程序
程序下载:crakmeeasy
解压密码:9unk
任务目标:寻找正确序列号
观察程序
序列号寻踪
同样运行程序,并对 GetDlgItemTextA 设置断点。
运行程序到断点处
“Ctrl+F9” 运行程序到返回处,在数据敞口可以看到错误序列号
继续运行到程序主模块,发现下面有个 10445678951 的字符串,注意这里的值是从低位向高位存储。
继续执行后,发现把上面字符串的内存地址存存到 eax 中。
继续执行,可以看到这里把 eax(内存地址:00401222) 的前 4 个字符放到 edx 中。
我们继续单步运行,可以看到这段是把字符串存储到内存地址 0240F7A8 中
我们执行到执行到 memset 函数处,之这里有(count、c、dest)三个参数。我们这里先找一下 memset 函数的相关参数。
从 dest 这个变量的内存地址往后 8 个字符用 0 填充
我们继续运行这 memset 函数,可以看到后面的值都被填充为 0。
接下来调用的是 lstrlen 函数,用于计算字符串的长度。在堆栈中可以看到填充的内容。
然后 lstrlen 函数,将长度的返回值存到 eax,返回的字符串存到 ecx 中。
这里 把 eax 值减 1,然后存储到 edx 中。
这里把 edx 的 0A 和 值 00 进行比较。如果 0 小于 0A,就会跳转到 401360
JB: jump not above and equal 低于,即不高于且不等于则转移。CMP 比较无符号数后影响的是 CF。
继续执行,这里把错误的序列号存到 eax 中,然后再对 edx 初始化为 0 。
然后创建一个循环 eax + edx,然后 EDX 依次递增来获取我们输入序列号的每一个字节。这里将错误序列号的第一个字节 ‘1’ 存储到 edx 中,可以看到此时 edx 值变成了 31
movsx 指令是将指定字节保存到 edx 中,然后再向高位填充零,如果该字节为负数高位补 1
edx 的值 31 减去 14,然后将结果保存到 eax 中。
lea 指令,将中括号里的算数结果存储到指定的寄存器中
下一条指令 ebp-30,这里 edx 指向的内存地址是字符串 ‘10445678951’
下一条指令是把 ecx 初始化为 0,然后 ecx + edx 的第一个字节存储到 edx,此时 edx 值为 31
后面就是使用 eax 和 edx 进行比较,eax 是错误的序列号 ‘31-14’,edx 程序给的常量 ‘31’
也就是说:
正确的序列号 - 14 = 常量
正确的序列号 = 常量 + 14
因此,正确的序列号为:EDHHIJKLMIE
分析 API 插件:xAnalyzer
注意:下载 xAnalyzer.dp32 、 xAnalyzer.dp32、apis_def.zip(分别解压到 plugins 中)
- 本文标题: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 许可协议。转载请注明出处!