网游难民 发表于 2006-8-4 02:05:30

【破文标题】easycrackme算法分析

【破文标题】easycrackme破解手记
【破文作者】网游难民
【作者邮箱】
【作者主页】https://www.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:             ;用户名放如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:
004040CF|.BA E0414000   MOV EDX,easycrac.004041E0                ;your name?
004040D4|.E8 A7EDFFFF   CALL easycrac.00402E80
004040D9|.8D45 FC       LEA EAX,DWORD PTR SS:
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:            ;用户名放入ECX
004040FB|.0FB64C01 FF   |MOVZX ECX,BYTE PTR DS:
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:         ;用户名位数*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与0F与后的数*2+4050B8对应的地址里的数放入EBX,值记为B---在后面给出这个表格
00404131|.8D45 F8       LEA EAX,DWORD PTR SS:
00404134|.8B4D F8       MOV ECX,DWORD PTR SS:             ;注册码放入ECX
00404137|.BA 04424000   MOV EDX,easycrac.00404204                ;0
0040413C|.E8 DBEDFFFF   CALL easycrac.00402F1C
00404141|.8B45 F8       MOV EAX,DWORD PTR SS:             ;0+注册码
00404144|.E8 57FEFFFF   CALL easycrac.00403FA0                   ;关键CALL哦,跟进
00404149|.8BF0          MOV ESI,EAX                              ;得到的值C放入ESI
0040414B|.8D45 FC       LEA EAX,DWORD PTR SS:
0040414E|.BA F4414000   MOV EDX,easycrac.004041F4                ;error
00404153|.E8 28EDFFFF   CALL easycrac.00402E80
00404158|.8D45 F8       LEA EAX,DWORD PTR SS:
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:
0040416C|.BA 20424000   MOV EDX,easycrac.00404220                ;ok
00404171|.E8 0AEDFFFF   CALL easycrac.00402E80
00404176|.8D45 F8       LEA EAX,DWORD PTR SS:
00404179|.BA 2C424000   MOV EDX,easycrac.0040422C                ;thanks a lot
0040417E|.E8 FDECFFFF   CALL easycrac.00402E80
00404183|>6A 00         PUSH 0
++++++++++++++++++++++++++++++++++++++++++++++++++++
在0040412A处在信息窗口右击--数据窗口中跟随地址:
004050B819791126
004050BC19791007
004050C011261979
004050C410071979
004050C812345678
004050CC9ABCDEF0
004050D012123434
004050D478787878
004050D8CCC6CCC6
004050DCCC00CC00
004050E0FFEFEFFF
004050E4DDCC5555
004050E867678789
004050ECCECECBCC
004050F0778899AB
004050F444337766
004050F800000000
004050FC00000000
0040510000000000
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:,EDX
00403FAC|.8945 FC       MOV DWORD PTR SS:,EAX
00403FAF|.8B45 FC       MOV EAX,DWORD PTR SS:
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:
00403FC2|.64:8920       MOV DWORD PTR FS:,ESP
00403FC5|.8D45 F8       LEA EAX,DWORD PTR SS:
00403FC8|.8B55 FC       MOV EDX,DWORD PTR SS:
00403FCB|.E8 B0EEFFFF   CALL easycrac.00402E80
00403FD0|.8B45 F8       MOV EAX,DWORD PTR SS:            
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:
00403FE7|.8B5D F8       |MOV EBX,DWORD PTR SS:
00403FEA|.0FB65C03 FF   |MOVZX EBX,BYTE PTR DS:
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:,EDX
00404003|.68 1D404000   PUSH easycrac.0040401D
00404008|>8D45 F8       LEA EAX,DWORD PTR SS:
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算法比较简单,就是把算法表达出来比较麻烦:)
如果没有看懂的朋友建议跟一遍就知道了~~~
------------------------------------------------------------------------
【版权声明】本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

[ 本帖最后由 网游难民 于 2006-8-4 13:05 编辑 ]

bfqyygy 发表于 2006-8-5 10:35:41

分析的不错!!学习了!!

haiyun 发表于 2006-8-6 00:26:56

非常详尽的分析~~可惜偶是菜鸟一个,看不懂~

野猫III 发表于 2006-8-6 14:48:13

阿民进步好快呀~罚你两天内做出这个软件的算法注册机!

网游难民 发表于 2006-8-6 14:54:07

原帖由 野猫III 于 2006-8-6 14:48 发表
阿民进步好快呀~罚你两天内做出这个软件的算法注册机!
:L 算法注册机~~
偶只能来个黑底白字的了~`~:L /fad

lgjxj 发表于 2006-8-6 14:57:35

注册机前晚以写好了,今天不知跑到哪去了,晕
经典的查表

网游难民 发表于 2006-8-6 15:05:11

原帖由 lgjxj 于 2006-8-6 14:57 发表
注册机前晚以写好了,今天不知跑到哪去了,晕
经典的查表


偶连老师布置的C作业都没有好好写过~~
兄弟把你的拿出来给偶当猫的作业交啊~~~~/:D
用C写要用到数组,指针~~case选择结构~字符串函数还有位运算:L :L

[ 本帖最后由 网游难民 于 2006-8-6 15:33 编辑 ]

网游难民 发表于 2006-8-6 19:14:33

偶的C水平只能够计算机2级的~~~~
一个长的字符串偶拿它没有办法拉~~
如果在注册码前面出现“-”
那就请你输入一个短点的用户名吧/:D

obi-one 发表于 2006-8-8 15:42:50

看不懂:time:
页: [1]
查看完整版本: 【破文标题】easycrackme算法分析