【破文标题】大菜一号Crack Me算法分析
【破文作者】小子贼野(MayDay)
【作者主页】http://mayday.unpack.cn
【破解工具】OD
【破解平台】纯D版XPsp2
【软件名称】CrAkME
【软件大小】11.7KB
【原版下载】见附件
【保护方式】用户名+序列号
【软件简介】一个Crack Me
【破解声明】初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
------------------------------------------------------------------------
感谢大菜一号提供了这么好的Crack Me,感谢他对我的帮助
00401062 > \66:83BC24 6C0>CMP WORD PTR SS:[ESP+16C],1 ; 案例 111 (WM_COMMAND) --> 分支 0040103A
0040106B . 0F85 B5010000 JNZ CrAckME.00401226
00401071 . B9 08000000 MOV ECX,8 ; 在这下断
00401076 . BE 78604000 MOV ESI,CrAckME.00406078 ; 密码表
0040107B . 8D7C24 74 LEA EDI,DWORD PTR SS:[ESP+74]
0040107F . 33C0 XOR EAX,EAX
00401081 . F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
00401083 . A4 MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
00401084 . B9 19000000 MOV ECX,19
00401089 . 8DBC24 FC0000>LEA EDI,DWORD PTR SS:[ESP+FC]
00401090 . F3:AB REP STOS DWORD PTR ES:[EDI]
00401092 . B9 19000000 MOV ECX,19
00401097 . 8D7C24 10 LEA EDI,DWORD PTR SS:[ESP+10]
0040109B . 8BAC24 640100>MOV EBP,DWORD PTR SS:[ESP+164]
004010A2 . 8B1D 9C504000 MOV EBX,DWORD PTR DS:[<&USER32.GetDlgIte>; USER32.GetDlgItemTextA
004010A8 . F3:AB REP STOS DWORD PTR ES:[EDI]
004010AA . B9 19000000 MOV ECX,19
004010AF . 8DBC24 980000>LEA EDI,DWORD PTR SS:[ESP+98] ; 密码表给EDI
004010B6 . F3:AB REP STOS DWORD PTR ES:[EDI]
004010B8 . 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10] ; 分别给EAX和ECX清零
004010BC . 6A FF PUSH -1 ; /Count = FFFFFFFF (-1.)
004010BE . 50 PUSH EAX ; |Buffer
004010BF . 68 E8030000 PUSH 3E8 ; |ControlID = 3E8 (1000.)
004010C4 . 55 PUSH EBP ; |hWnd
004010C5 . 33F6 XOR ESI,ESI ; |ESI=0
004010C7 . FFD3 CALL EBX ; \GetDlgItemTextA
004010C9 . 8D7C24 10 LEA EDI,DWORD PTR SS:[ESP+10] ; 获取用户名的位数
004010CD . 83C9 FF OR ECX,FFFFFFFF
004010D0 . 33C0 XOR EAX,EAX
004010D2 . F2:AE REPNE SCAS BYTE PTR ES:[EDI]
004010D4 . F7D1 NOT ECX
004010D6 . 49 DEC ECX
004010D7 . 83F9 08 CMP ECX,8
004010DA . 75 35 JNZ SHORT CrAckME.00401111 ; 不是8就挂了
004010DC . 8D8C24 980000>LEA ECX,DWORD PTR SS:[ESP+98]
004010E3 . 6A FF PUSH -1 ; /Count = FFFFFFFF (-1.)
004010E5 . 51 PUSH ECX ; |ECX=12F9BC
004010E6 . 68 E9030000 PUSH 3E9 ; |ControlID = 3E9 (1001.)
004010EB . 55 PUSH EBP ; |hWnd
004010EC . FFD3 CALL EBX ; \GetDlgItemTextA
004010EE . 8DBC24 980000>LEA EDI,DWORD PTR SS:[ESP+98] ; 假码位数
004010F5 . 83C9 FF OR ECX,FFFFFFFF
004010F8 . 33C0 XOR EAX,EAX
004010FA . F2:AE REPNE SCAS BYTE PTR ES:[EDI]
004010FC . F7D1 NOT ECX
004010FE . 49 DEC ECX
004010FF . 8D7C24 10 LEA EDI,DWORD PTR SS:[ESP+10]
00401103 . 8BD1 MOV EDX,ECX
00401105 . 83C9 FF OR ECX,FFFFFFFF
00401108 . F2:AE REPNE SCAS BYTE PTR ES:[EDI]
0040110A . F7D1 NOT ECX
0040110C . 49 DEC ECX
0040110D . 3BD1 CMP EDX,ECX ; 比较ECX,EDX,相等就GO
0040110F . 74 23 JE SHORT CrAckME.00401134
00401111 > 6A 30 PUSH 30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
00401113 . 68 6C604000 PUSH CrAckME.0040606C ; |Sorry..!
00401118 . 68 54604000 PUSH CrAckME.00406054 ; |不对不对,再加油!^o^
0040111D . 55 PUSH EBP ; |hOwner
0040111E . FF15 A0504000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
00401124 . 5F POP EDI
00401125 . 5E POP ESI
00401126 . 5D POP EBP
00401127 . B8 01000000 MOV EAX,1
0040112C . 5B POP EBX
0040112D . 81C4 50010000 ADD ESP,150
00401133 . C3 RETN
00401134 > 8A4434 10 MOV AL,BYTE PTR SS:[ESP+ESI+10]
00401138 . 8B3D A0504000 MOV EDI,DWORD PTR DS:[<&USER32.MessageBo>; USER32.MessageBoxA
0040113E . 3C 30 CMP AL,30
00401140 . 7C 0C JL SHORT CrAckME.0040114E
00401142 . 3C 7D CMP AL,7D
00401144 . 7F 08 JG SHORT CrAckME.0040114E
00401146 . 46 INC ESI
00401147 . 83FE 08 CMP ESI,8
0040114A .^ 7C E8 JL SHORT CrAckME.00401134 ; 用户名的ascii不能大于7D而且不能小于30
0040114C . EB 0F JMP SHORT CrAckME.0040115D
0040114E > 6A 30 PUSH 30
00401150 . 68 6C604000 PUSH CrAckME.0040606C ; Sorry..!
00401155 . 68 54604000 PUSH CrAckME.00406054 ; 不对不对,再加油!^o^
0040115A . 55 PUSH EBP
0040115B . FFD7 CALL EDI
0040115D > 33C9 XOR ECX,ECX ; ECX=0
0040115F > 0FBE440C 10 MOVSX EAX,BYTE PTR SS:[ESP+ECX+10] ; ESP+ECX+10的内存地址=用户名的ascii,EAX=用户名最后一位的ascii
00401164 . 99 CDQ
00401165 . BE 30000000 MOV ESI,30 ; ESI=30
0040116A . F7FE IDIV ESI ; 除以30,所得的商放在eax,余数放在edx
0040116C . 41 INC ECX ; ECX+1,指向下一位注册码,同时循环计数器加一
0040116D . 83F9 08 CMP ECX,8 ; 比较是否循环完8次
00401170 . 8A4414 74 MOV AL,BYTE PTR SS:[ESP+EDX+74] ; ESP+EDX+74的内存地址指向的位置就是注册码的第一位
00401174 . 88840C FB0000>MOV BYTE PTR SS:[ESP+ECX+FB],AL
0040117B .^ 7C E2 JL SHORT CrAckME.0040115F ; 没循环完就跳上去
0040117D . 8DB424 980000>LEA ESI,DWORD PTR SS:[ESP+98] ; 假码
00401184 . 8D8424 FC0000>LEA EAX,DWORD PTR SS:[ESP+FC] ; 真码
0040118B > 8A10 MOV DL,BYTE PTR DS:[EAX] ; 可做内存注册机
看到各位大大们经常在最后都会写个算法总结,我也模仿模仿
这个的算法,其实就是首先设置一个密码表,然后通过一个循环,让内存地址的指针指向密码表的
某个位置,所指的字符就是注册码(当时有点感觉是指针,结果朋友说用数组也行,没办法,谁让
我菜
),还有就是用户名和注册码必须是8位,不然就挂了,用户名必须是数字和字母,总
结的比较乱,这个是第二个算法分析,还不大会写,如果有什么不妥,还请大家多多指出,我以后
会加以改正
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!