写在前面,Name/Serial的分析比单独的Serial分析要复杂很多,分析期间对 movzx eax, byte ptr ds:[eax]这个指令理解稍微模糊了,卡壳整个小时
Name/Serial分析思路
输入hacker/123456,同样弹出Try Again! Sorry, The serial is incorect !
我们同样从字符串入手
第一处 Sorry, The serial is incorect!
有两处地方出现提示错误
首先跟踪到0042FA63地址,双击对应的字符串即可
从Sorry字符串开始往下是 call 0042A170, 0042A170是MessageBox函数
往上分析,JGE是关键跳转
继续往上分析,cmp命令把4与eax进行比较,若eax>4,S标志位为1,JGE指令跳转到0042FA79
往上分析,call 00406930 实际是调用了strlen函数,strlen函数用来计算字符串长度,返回值放在eax寄存器中
继续往上,找到strlen函数用来计算哪个字符串的长度呢?既然要分析这个函数,那就从这个函数的开始进行分析,这个函数的开始刚好是上一个函数结束的地方,因此往上找到最近的一个call,打上断点,单步调试
运行成功断下,我们发现这个指令是把local.5的值赋给eax,local.5是ebp-14,14是16进制值,通过寄存器窗口可以知道现在的ebp为0019F708,那么ebp-14要看右下的堆栈窗口,从ebp往上上移5个单位,到达地址0019F6F4,这里存放的是ascii值为hacker的地址:0234D67C
按F8执行下一步,eax的值变成了0234D67C
到下面的操作都是对hacker值进行计算,调用strlen函数后,我们可以看到eax的值变成了5,经过后续调试发现当name的值大于4时,eax的值都会大于4
当我们name的位置数abc的时候,eax的值为1,经过后续调试发现name的值小于1,eax都为1
直接进入打印sorry, the serial is incorect !
由此可以判断输入的name要大于4
第二处Sorry, The serial is incorect!
往上分析,JNZ关键跳转
再往上分析,我们发现上一段打印调用MessageBox打印Sorry的代码之后会直接跳过以下红色框的代码,那么当name的字符大于等于4的时候会进入红色框代码,如果序列号正确,会打印Good job dude,错误打印Sorry
因此把这段代码分析透即可,打上断点,逐步调试,分析过程看以下注释即可
地址431750中存放的是29
到此可以知道是把我们输入的序列号123456与CW-8528-CRACKED进行比较,相等则成功
CW-8528-CRACKED是我们正确的序列号,验证正确
完成的分析过程请看注释
注册机思路
输入字符
判断字符长度得大于等于4
取输入字符的首位
把它转换成ascii码
然后与16进制的29相乘
然后把得到的值乘以2
然后把16进制转换为10进制
拼接CW-***-CRACKED
CW-8528-CRACKED
|