【破文标题】easycrackme破解手记
【破文作者】网游难民
【作者邮箱】
【作者主页】http://bbs.chinapyg.com/discuz.php
【破解工具】PEiD,OD
【破解平台】Windows XP
【软件名称】easycrackme
【软件大小】22.0 KB
【原版下载】本地
【保护方式】注册码
【软件简介】一个比较简单的crackme,偶分析了给大家分享,
不足之处请大家多多指教~~
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)
------------------------------------------------------------------------
用PEID查壳为Borland Delphi 4.0 - 5.0,无壳
+++++++++++++++++++++++++++++++++++++++++++
运行软件,输入试练码,点确定弹出对话框"Invalid",退出软件
再用OD截入脱壳后的程序,右键超级字串查找,找到"Invalid",双击进入程序代码段,往上查找合适地方下断。
+++++++++++++++++++++++++++++++++++++++++++++
004040BE |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 用户名放如EAX中
004040C1 |. E8 0AEEFFFF CALL easycrac.00402ED0
004040C6 |. 8BD0 MOV EDX,EAX ; 用户名位数
004040C8 |. 85D2 TEST EDX,EDX
004040CA |. 7F 1F JG SHORT easycrac.004040EB ; 检测用户名是否为空~~
004040CC |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
004040CF |. BA E0414000 MOV EDX,easycrac.004041E0 ; your name?
004040D4 |. E8 A7EDFFFF CALL easycrac.00402E80
004040D9 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
004040DC |. BA F4414000 MOV EDX,easycrac.004041F4 ; error
004040E1 |. E8 9AEDFFFF CALL easycrac.00402E80
004040E6 |. E9 98000000 JMP easycrac.00404183
004040EB |> 33F6 XOR ESI,ESI
004040ED |. 8BDA MOV EBX,EDX
004040EF |. 85DB TEST EBX,EBX
004040F1 |. 7E 19 JLE SHORT easycrac.0040410C
004040F3 |. B8 01000000 MOV EAX,1 ; EAX=1
004040F8 |> 8B4D FC /MOV ECX,DWORD PTR SS:[EBP-4] ; 用户名放入ECX
004040FB |. 0FB64C01 FF |MOVZX ECX,BYTE PTR DS:[ECX+EAX-1]
00404100 |. 8BF8 |MOV EDI,EAX
00404102 |. 4F |DEC EDI
00404103 |. 0FAFCF |IMUL ECX,EDI
00404106 |. 03F1 |ADD ESI,ECX
00404108 |. 40 |INC EAX
00404109 |. 4B |DEC EBX
0040410A |.^ 75 EC \JNZ SHORT easycrac.004040F8 ; 循环,用户名第一位*0,第二位*1。依次类推~~结果相加,和记为A
0040410C |> 8D1C12 LEA EBX,DWORD PTR DS:[EDX+EDX] ; 用户名位数*2放入EBX
0040410F |. 83C3 63 ADD EBX,63 ; 用户名位数*2放入EBX加上63
00404112 |. 81E3 FFFF0000 AND EBX,0FFFF
00404118 |. 81E6 FFFF0000 AND ESI,0FFFF
0040411E |. C1E3 10 SHL EBX,10 ; 左移10位
00404121 |. 03F3 ADD ESI,EBX ; A加上上面的数,值放在ESI中。
00404123 |. 8BDE MOV EBX,ESI ;
00404125 |. 8BF3 MOV ESI,EBX
00404127 |. 83E6 0F AND ESI,0F ; ESI与0F与,结果放入ESI中
0040412A |. 8B1CB5 B85040>MOV EBX,DWORD PTR DS:[ESI*4+4050B8] ; 把ESI与0F与后的数*2+4050B8对应的地址里的数放入EBX,值记为B---在后面给出这个表格
00404131 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
00404134 |. 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8] ; 注册码放入ECX
00404137 |. BA 04424000 MOV EDX,easycrac.00404204 ; 0
0040413C |. E8 DBEDFFFF CALL easycrac.00402F1C
00404141 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; 0+注册码
00404144 |. E8 57FEFFFF CALL easycrac.00403FA0 ; 关键CALL哦,跟进
00404149 |. 8BF0 MOV ESI,EAX ; 得到的值C放入ESI
0040414B |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0040414E |. BA F4414000 MOV EDX,easycrac.004041F4 ; error
00404153 |. E8 28EDFFFF CALL easycrac.00402E80
00404158 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
0040415B |. BA 10424000 MOV EDX,easycrac.00404210 ; invalid
00404160 |. E8 1BEDFFFF CALL easycrac.00402E80
00404165 |. 3BDE CMP EBX,ESI ; 关键比较,即B与C比较,不相等则GAMEOVER
00404167 |. 75 1A JNZ SHORT easycrac.00404183 ; 关键跳转
00404169 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0040416C |. BA 20424000 MOV EDX,easycrac.00404220 ; ok
00404171 |. E8 0AEDFFFF CALL easycrac.00402E80
00404176 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
00404179 |. BA 2C424000 MOV EDX,easycrac.0040422C ; thanks a lot
0040417E |. E8 FDECFFFF CALL easycrac.00402E80
00404183 |> 6A 00 PUSH 0
++++++++++++++++++++++++++++++++++++++++++++++++++++
在0040412A处在信息窗口右击--数据窗口中跟随地址:
004050B8 19791126
004050BC 19791007
004050C0 11261979
004050C4 10071979
004050C8 12345678
004050CC 9ABCDEF0
004050D0 12123434
004050D4 78787878
004050D8 CCC6CCC6
004050DC CC00CC00
004050E0 FFEFEFFF
004050E4 DDCC5555
004050E8 67678789
004050EC CECECBCC
004050F0 778899AB
004050F4 44337766
004050F8 00000000
004050FC 00000000
00405100 00000000
SI与0F与后的数*2+4050B8对应的地址里的数,就是上面的地址对应的数,即为B。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
关键CALL:
00403FA0 /$ 55 PUSH EBP
00403FA1 |. 8BEC MOV EBP,ESP
00403FA3 |. 83C4 F8 ADD ESP,-8
00403FA6 |. 53 PUSH EBX
00403FA7 |. 33D2 XOR EDX,EDX
00403FA9 |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
00403FAC |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00403FAF |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00403FB2 |. E8 D9EFFFFF CALL easycrac.00402F90
00403FB7 |. 33C0 XOR EAX,EAX
00403FB9 |. 55 PUSH EBP
00403FBA |. 68 16404000 PUSH easycrac.00404016
00403FBF |. 64:FF30 PUSH DWORD PTR FS:[EAX]
00403FC2 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
00403FC5 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
00403FC8 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
00403FCB |. E8 B0EEFFFF CALL easycrac.00402E80
00403FD0 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00403FD3 |. E8 F8EEFFFF CALL easycrac.00402ED0 ;
00403FD8 |. 8BC8 MOV ECX,EAX ;0用户名的位数放入ECX,即用户名位数+1
00403FDA |. 41 INC ECX ;0用户名的位数+1,即用户名位数+2
00403FDB |. 33D2 XOR EDX,EDX
00403FDD |. B8 01000000 MOV EAX,1
00403FE2 |> 03D2 /ADD EDX,EDX
00403FE4 |. 8D1492 |LEA EDX,DWORD PTR DS:[EDX+EDX*4]
00403FE7 |. 8B5D F8 |MOV EBX,DWORD PTR SS:[EBP-8]
00403FEA |. 0FB65C03 FF |MOVZX EBX,BYTE PTR DS:[EBX+EAX-1]
00403FEF |. 03D3 |ADD EDX,EBX
00403FF1 |. 83EA 30 |SUB EDX,30 ; EDX-30
00403FF4 |. 40 |INC EAX
00403FF5 |. 3BC8 |CMP ECX,EAX
00403FF7 |.^ 75 E9 \JNZ SHORT easycrac.00403FE2 ;关键循环,得到值C,在EDX中,在下面有详细解说,
00403FF9 |. 8BDA MOV EBX,EDX ;C放入EBX中
00403FFB |. 33C0 XOR EAX,EAX
00403FFD |. 5A POP EDX
00403FFE |. 59 POP ECX
00403FFF |. 59 POP ECX
00404000 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
00404003 |. 68 1D404000 PUSH easycrac.0040401D
00404008 |> 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
0040400B |. BA 02000000 MOV EDX,2
00404010 |. E8 F7EDFFFF CALL easycrac.00402E0C
00404015 \. C3 RETN
00404016 .^ E9 BDE8FFFF JMP easycrac.004028D8
0040401B .^ EB EB JMP SHORT easycrac.00404008
0040401D . 8BC3 MOV EAX,EBX ;把C的值放入EAX中
0040401F . 5B POP EBX
00404020 . 59 POP ECX
00404021 . 59 POP ECX
00404022 . 5D POP EBP
00404023 . C3 RETN
关于关键循环C:
因为程序在我们注册码第一位填加的是0,可以忽略不记,至于为什么,你看完就知道了~~
那个循环等价于:
取用户名的第一位的ASCII码-30的值*2记为a1,a1+a1*4的值记为c1.
c1+用户名第二位的ASCII码-30的值*2记为a2,a2+a2*4的值记为c2.
c2+用户名第三位的ASCII码-30的值*2记为a3,a3+a3*4的值记为c3.
.........................
这样一直循环到用户名最后一位。最后的值记为c0
取c0的后8位就是C。
因为0的ASCII码是30上面-30后就位0了,就不记入总值了,所以说忽略不记。
而用户名第一位*0,第二位*1。依次类推~~结果相加的值为A
用户名位数*2加上63的值左移10位后加上A记为B.
最后B和C比较,相等则注册成功,不等则注册失败~
总结下,经过asdmusic 兄弟提醒,求出C的那个循环原来是把注册码的16进制保存在计算机中,C即为注册码的16进制~~~:)
即B的十进制即为真码~~:)
偶新手对这些汇编的进制转换不太敏感,以后注意~~
------------------------------------------------------------------------
此crackme算法比较简单,就是把算法表达出来比较麻烦:)
如果没有看懂的朋友建议跟一遍就知道了~~~
------------------------------------------------------------------------
【版权声明】本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)