【文章标题】: 一个很简单的crackme的算法分析
【文章作者】: coldpine
【软件名称】: Crackme1.exe
【软件大小】: 44.1
【下载地址】: http://www.crackmes.de/
【加壳方式】: 无壳
【编写语言】: vc++
【使用工具】: od
【软件介绍】: 如果有人已经破解分析过,请通知我删除
【作者声明】: 比较简单,希望和我这样的菜鸟能够快速的步入高手行列。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
用od加载查找模块其中有getdlgitemtext下断点单步执行很快到了下面这个地方
0040140C |. 8D45 F4 LEA EAX, DWORD PTR SS:[EBP-C] ;输入的序列号的地址送eax
0040140F |. 50 PUSH EAX ;进栈
00401410 |. E8 DB0B0000 CALL Crackme1.00401FF0
00401415 |. 83F8 0A CMP EAX, 0A ;比较序列号是不是十位
00401418 |. 59 POP ECX
00401419 |. 75 2F JNZ SHORT Crackme1.0040144A
0040141B |. 8D45 F4 LEA EAX, DWORD PTR SS:[EBP-C]
0040141E |. 50 PUSH EAX
0040141F |. E8 A7FCFFFF CALL Crackme1.004010CB ;函数判断序列号每位是不是0-9之间数字
00401424 |. 85C0 TEST EAX, EAX
00401426 |. 59 POP ECX
00401427 74 21 JE SHORT Crackme1.0040144A
00401429 |. 8D45 F4 LEA EAX, DWORD PTR SS:[EBP-C]
0040142C |. 50 PUSH EAX
0040142D |. E8 B7FCFFFF CALL Crackme1.004010E9 ;序列号关键计算的地方要跟入
00401432 |. 85C0 TEST EAX, EAX
00401434 |. 59 POP ECX
00401435 74 13 JE SHORT Crackme1.0040144A ;关键跳转,爆破点
00401437 |. 6A 00 PUSH 0
00401439 |. 68 BC404100 PUSH Crackme1.004140BC ; cool
0040143E |. 68 A0404100 PUSH Crackme1.004140A0 ; correct serial number !!!
00401443 |. 8BCE MOV ECX, ESI
00401445 |. E8 A1830000 CALL Crackme1.004097EB
0040144A |> 8BCE MOV ECX, ESI
0040144C |. E8 CD680000 CALL Crackme1.00407D1E
00401451 |. 5E POP ESI
00401452 |. C9 LEAVE
00401453 \. C3 RET
0040142D |. E8 B7FCFFFF CALL Crackme1.004010E9
----------------------------------------
004010E9 /$ 56 PUSH ESI
004010EA |. 8B7424 08 MOV ESI, DWORD PTR SS:[ESP+8] ;序列号送入esi
004010EE |. 57 PUSH EDI ;进栈
004010EF |. 6A 31 PUSH 31 ;31进栈
004010F1 |. 56 PUSH ESI ;进栈
004010F2 |. E8 BDFFFFFF CALL Crackme1.004010B4 ;此函数是计算序列号中1的个数
004010F7 |. 59 POP ECX
004010F8 |. 59 POP ECX
004010F9 |. 0FBE0E MOVSX ECX, BYTE PTR DS:[ESI] ;将序列号的每位的ascii码值取出
004010FC |. 6A 30 PUSH 30
004010FE |. 5F POP EDI
004010FF |. 03C7 ADD EAX, EDI ;将序列号的中1的个数加上30
00401101 |. 3BC8 CMP ECX, EAX ;将序列号的ascii码值和上面算的数字进行比较
00401103 0F85 C0000000 JNZ Crackme1.004011C9
00401109 |. 6A 32 PUSH 32
0040110B |. 56 PUSH ESI
0040110C |. E8 A3FFFFFF CALL Crackme1.004010B4 ;同理,统计序列号中2的个数
00401111 |. 59 POP ECX
00401112 |. 03C7 ADD EAX, EDI
00401114 |. 59 POP ECX
00401115 |. 0FBE4E 01 MOVSX ECX, BYTE PTR DS:[ESI+1]
00401119 |. 3BC8 CMP ECX, EAX
0040111B 0F85 A8000000 JNZ Crackme1.004011C9
00401121 |. 6A 33 PUSH 33
00401123 |. 56 PUSH ESI
00401124 |. E8 8BFFFFFF CALL Crackme1.004010B4 ;统计3的个数
00401129 |. 59 POP ECX
0040112A |. 03C7 ADD EAX, EDI
0040112C |. 59 POP ECX
0040112D |. 0FBE4E 02 MOVSX ECX, BYTE PTR DS:[ESI+2]
00401131 |. 3BC8 CMP ECX, EAX
00401133 0F85 90000000 JNZ Crackme1.004011C9
00401139 |. 6A 34 PUSH 34
0040113B |. 56 PUSH ESI
0040113C |. E8 73FFFFFF CALL Crackme1.004010B4 ;统计4的个数
00401141 |. 59 POP ECX
00401142 |. 03C7 ADD EAX, EDI
00401144 |. 59 POP ECX
00401145 |. 0FBE4E 03 MOVSX ECX, BYTE PTR DS:[ESI+3]
00401149 |. 3BC8 CMP ECX, EAX
0040114B 75 7C JNZ SHORT Crackme1.004011C9
0040114D |. 6A 35 PUSH 35
0040114F |. 56 PUSH ESI
00401150 |. E8 5FFFFFFF CALL Crackme1.004010B4 ;统计5的个数
00401155 |. 59 POP ECX
00401156 |. 03C7 ADD EAX, EDI
00401158 |. 59 POP ECX
00401159 |. 0FBE4E 04 MOVSX ECX, BYTE PTR DS:[ESI+4]
0040115D |. 3BC8 CMP ECX, EAX
0040115F 75 68 JNZ SHORT Crackme1.004011C9
00401161 |. 6A 36 PUSH 36
00401163 |. 56 PUSH ESI
00401164 |. E8 4BFFFFFF CALL Crackme1.004010B4 ;统计6的个数
00401169 |. 59 POP ECX
0040116A |. 03C7 ADD EAX, EDI
0040116C |. 59 POP ECX
0040116D |. 0FBE4E 05 MOVSX ECX, BYTE PTR DS:[ESI+5]
00401171 |. 3BC8 CMP ECX, EAX
00401173 75 54 JNZ SHORT Crackme1.004011C9
00401175 |. 6A 37 PUSH 37
00401177 |. 56 PUSH ESI
00401178 |. E8 37FFFFFF CALL Crackme1.004010B4 ;统计7的个数
0040117D |. 59 POP ECX
0040117E |. 03C7 ADD EAX, EDI
00401180 |. 59 POP ECX
00401181 |. 0FBE4E 06 MOVSX ECX, BYTE PTR DS:[ESI+6]
00401185 |. 3BC8 CMP ECX, EAX
00401187 75 40 JNZ SHORT Crackme1.004011C9
00401189 |. 6A 38 PUSH 38
0040118B |. 56 PUSH ESI
0040118C |. E8 23FFFFFF CALL Crackme1.004010B4 ;统计8的个数
00401191 |. 59 POP ECX
00401192 |. 03C7 ADD EAX, EDI
00401194 |. 59 POP ECX
00401195 |. 0FBE4E 07 MOVSX ECX, BYTE PTR DS:[ESI+7]
00401199 |. 3BC8 CMP ECX, EAX
0040119B 75 2C JNZ SHORT Crackme1.004011C9
0040119D |. 6A 39 PUSH 39
0040119F |. 56 PUSH ESI
004011A0 |. E8 0FFFFFFF CALL Crackme1.004010B4 ;统计9的个数
004011A5 |. 59 POP ECX
004011A6 |. 03C7 ADD EAX, EDI
004011A8 |. 59 POP ECX
004011A9 |. 0FBE4E 08 MOVSX ECX, BYTE PTR DS:[ESI+8]
004011AD |. 3BC8 CMP ECX, EAX
004011AF 75 18 JNZ SHORT Crackme1.004011C9
004011B1 |. 57 PUSH EDI
004011B2 |. 56 PUSH ESI
004011B3 |. E8 FCFEFFFF CALL Crackme1.004010B4 ;统计0的个数
004011B8 |. 59 POP ECX
004011B9 |. 03C7 ADD EAX, EDI
004011BB |. 59 POP ECX
004011BC |. 0FBE4E 09 MOVSX ECX, BYTE PTR DS:[ESI+9]
004011C0 |. 3BC8 CMP ECX, EAX
004011C2 75 05 JNZ SHORT Crackme1.004011C9
004011C4 |. 6A 01 PUSH 1
004011C6 |. 58 POP EAX
004011C7 |. EB 02 JMP SHORT Crackme1.004011CB
004011C9 |> 33C0 XOR EAX, EAX
004011CB |> 5F POP EDI
004011CC |. 5E POP ESI
004011CD \. C3 RET
算法总结:序列号取前面的十位,并且每位的数字是几,
代表该位数字出现的次数
如:13.......此时说明序列号中有一个1三个2
要求刚好能全部满足,通过分析,序列号应该是:2100010006
也就是有两个1一个2一个6六个零
--------------------------------------------------------------------------------
【经验总结】
经验总结:感觉就是做一道数学题,但是通过思考,
我觉得应该从末位0入手,通过分类讨论,即假设0有九个的话,最后一位就应该是9,但是
9必定要出现一个,所以第九位又必须是1,出现了矛盾,假设0有八个的话,必定末位出现8,
所以第八位又必须是1,既然是1那么第一位就有数字,所以又矛盾,依次类推,末位
为6的时候,表示序列号中有6个零,另外第六位就是1,说明1至少有一个,
故第一位为2或者是更多,但是刚好2的时候能够成立.
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年09月10日 20:22:59
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)