首页
社区
课程
招聘
[原创]一个很简单的crackme的算法分析
发表于: 2006-9-10 20:27 5282

[原创]一个很简单的crackme的算法分析

2006-9-10 20:27
5282

【文章标题】: 一个很简单的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


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 433
活跃值: (176)
能力值: ( LV13,RANK:1250 )
在线值:
发帖
回帖
粉丝
2
你的分析过于简单了,看我的帖:

http://bbs.pediy.com/showthread.php?s=&threadid=29817
2006-9-13 09:49
0
雪    币: 256
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
3
最初由 冲天剑 发布
你的分析过于简单了,看我的帖:

http://bbs.pediy.com/showthread.php?s=&threadid=29817


兄弟,不好意思,你先已经分析了!看了你的帖子,才
知道你的描述是多么的好,向你学习!!!!!!!!!!!

另外,最近分析的头都晕了,找一个简单本来是找回一些自信的,呵呵,
既然雷同了,那我就删除了吧!!!

请求管理员删除此帖.

再次声明,雷同纯属巧合!!!
2006-9-13 12:26
0
雪    币: 433
活跃值: (176)
能力值: ( LV13,RANK:1250 )
在线值:
发帖
回帖
粉丝
4
最初由 coldpine 发布
兄弟,不好意思,你先已经分析了!看了你的帖子,才
知道你的描述是多么的好,向你学习!!!!!!!!!!!

另外,最近分析的头都晕了,找一个简单本来是找回一些自信的,呵呵,
既然雷同了,那我就删除了吧!!!
........


自己去掉附件就可以了,为什么要整个删掉呢?
我只是想说明一个普遍现象,现在很多破文都是这样,不写详细的分析过程,或者只写很简单的总结,然后反汇编内容旁边加些注释,就以为别人能看懂了,殊不知,人家既无法一眼看懂反汇编的内容,看了简单的注释也几乎不会增进理解。
只是希望你的分析能写得详细些而已。
2006-9-13 15:25
0
雪    币: 256
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
5
你说的对!
同时,有比较,才能有进步!!
多谢兄弟提醒!
以后再写的时候一定参照你的写法,
尽量详细一些.
2006-9-13 18:01
0
游客
登录 | 注册 方可回帖
返回
//