动画介绍:工具准备: ollydbg 和少许的汇编知识 一点耐性,你可能一遍看不懂
好了,现在开始
现在用ollydbg调试
看到刚才的错误提示符吗?
bad serial,sorry
现在就查找这个
查找文本参考 00401154 |> \6A 30 PUSH 30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL 00401156 |. 68 35304000 PUSH crackme.00403035 ; |Title = "Crackme 1.0" 0040115B |. 68 22304000 PUSH crackme.00403022 ; |Text = "Bad Serial, Sorry!" 00401160 |. FF35 54304000 PUSH DWORD PTR DS:[403054] ; |hOwner = NULL 00401166 |. E8 23000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
显然这里是错误提示,弹出的对话框。
由红色的那条线看到,是由00401135 |. /75 1D |JNZ SHORT crackme.00401154
跳到错误提示的。 00401122 |. B9 08000000 MOV ECX,8 00401127 |. BE 44304000 MOV ESI,crackme.00403044 0040112C |. BF 08304000 MOV EDI,crackme.00403008 00401131 |> 8A06 /MOV AL,BYTE PTR DS:[ESI] 00401133 |. 3A07 |CMP AL,BYTE PTR DS:[EDI] 00401135 |. 75 1D |JNZ SHORT crackme.00401154
显然这里是校验注册码。逐位校验,一共8位(MOV ECX,8),若有一位不同就说明注册码不对了。
现在看看输入的数据保存在哪里?利用getdlgitemtext这个函数做中断 00401099 |. 6A 0A PUSH 0A ; /Count = A (10.) 0040109B |. 68 44304000 PUSH crackme.00403044 ; |Buffer = crackme.00403044 004010A0 |. 68 B80B0000 PUSH 0BB8 ; |ControlID = BB8 (3000.) 004010A5 |. FF35 54304000 PUSH DWORD PTR DS:[403054] ; |hWnd = NULL 004010AB |. E8 D2000000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
0040109B |. 68 44304000 PUSH crackme.00403044这个是保存数据的参数 地址是:00403044 |