逆向入门CrackMe001(关键字符串)
分析程序
整个程序分为两部分 一个是序列号+用户名 一个是单纯的序列号
Serial部分
OD打开程序,F9启动,随便输入一个序列号,验证,出现错误对话框,序列号错误提示“Try Again!”
在反汇编窗口右键->查找->所有参考文本字符串
找到错误提示Try Again!
,双击跟随(如果相同的文本多次出现,需要多次定位才能命中)
分析一下,(0042F4F3
)错误提示是由(0042FD5
)跳转指令JNZ跳转来的,前面(0042F4D0
)应该是它的判断函数,在(0042F4D0
)处设置断点(F2),F9运行
黑底地址的就是程序执行到的地方,在我们设置的断点处停下来了
此时eax存放我们输入的序列号,edx存放着一个陌生字符串,合理猜测这就是序列号,call跳转的程序就是比较我们输入的序列号和正确序列号是否一致的
接下来验证我们的猜想
我们可以直接尝试输入正确序列号"Hello Dude!
"重新尝试运行
此时F7进入CALL 子程序查看
(图中所有注释都是我一边查资料一边按自己理解写的,逐句分析也是为了尽快熟悉汇编语言;并且由于本人刚刚开始接触汇编语言,如有错漏请多包含)
此时JNZ命令没有跳转,证明序列号正确
Serial/Name部分
随便输入尝试一下
查找报错文本
可以发现,这跟上面判断方式的很相似
先F7进入Call子程序查看
这段代码用于计算字符串长度
字符串为chuan,最后跟一个空字符0,也就是chuan\0(不知道是不是这么表示的)
因为多算了一个空字符,所以最后要减2
exc=-1 , 遍历字符串(chuan\0)完成后,exc=-7,eax=-2,length=eax-ecx=-2-(-7)=5
长度确实是5
CMP判断长度需要大于4,不然不跳转,就会报错
接下来这段一直出现[431750]
,它还执行IMUL命令,我们需要找到它的值,才能知道这里在算什么
往上面翻翻,原来[431750]的值为29
这应该是计算序列号的
结果=0x63*0x29*2=0x1FB6=8118(十进制)
注册机代码计算序列号部分就是按这个算法写
这里还有两个字符串,可能是用于拼接序列号的
这里同上,也是(0042FB03
)JNZ命令判断是否跳转
经过我的分析,(0042FAE5
)Call用于将CW, CRACKED,8118拼接成完整序列号"CW-8118-CRACKED"
其实继续运行下去,到(0042FAFB
)会把拼接好的序列号移动到eax,用于和我们输入的字符串(0042FAF8
)作比较,这也证明我们计算出的8118是正确的
完成~~
番外
-
1个字=2个字节,1个字节=8位(bit二进制位)=2位十六进制(2^8 =16^2)
-
单位地址=1个字=2个字节=4位十六进制
汇编跳转指令(转载):