**硬编码序列号:**
> 不依赖于用户名来生成,总是由固定的字符和数字构成的固定不变的字符串
* * * * *
首先`Ctrl+N`查看API函数列表
`GetDlgItemTextA`获取用户输入的序列号
`MessageBoxA`提示输入的序列号正确,错误与否
我们给这两个API函数设置断点
然后,按F9键,运行CrackMe程序
在输入框输入wintry,然后单击确认验证
* * * * *
断在了GetDlgItemTextA处,该函数用于获取用户输入的序列号,
并且该函数的Buffer参数是用于存放获取到的序列号的缓冲区首地址
在该参数上单击鼠标右键选择数据窗口跟随。
当前缓冲区为空,因为该API函数还没有执行
Ctr+F9执行到函数返回。
该函数将用户输入的序列号保存到了缓冲区中
* * * * *
F7键单步返回到主程序中
看到比较和条件跳转指令,分别跳到正确和错误两个分支
往上有两条指令,一条给EBX寄存器赋值,一条和EBX比较
其中被赋值的值就是我们输入的序列号,然后和下边正确的序列号比较、
选择在数据窗口中跟随内存地址,对比寄存器,就能找到正确序列号了。
* * * * *
还有一个简单的方法,
直接查找参考字符串,跟进正确活错误提示语句
向上寻找关键Call,字符串比较函数等。。。
例子:
https://pan.baidu.com/s/1cO4vhODN388kwnyX9evrKQ
https://pan.baidu.com/s/1xIWFMBL79xVMeWWIwkhmNA
* * * * *
**再来看一个更加复杂的硬编码的CrackMe**
这个CrackMe并不是序列号直接进行比较
有一个简单的算法
https://pan.baidu.com/s/1QBz_dF9v1oz3RFYZ2zApIw