首页
社区
课程
招聘
[原创]简单分析crackme算法之一
发表于: 2006-8-2 14:01 6378

[原创]简单分析crackme算法之一

2006-8-2 14:01
6378

【文章标题】: 简单分析crackme算法之一
【文章作者】: shuair
【软件名称】: CRACKME.EXE
【软件大小】: 6.56 KB
【下载地址】: 本地下载
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: MASM32 / TASM32 [Overlay]
【使用工具】: OD
【操作平台】: Windows 2003
【作者声明】: 业余爱好,欢迎交流!
--------------------------------------------------------------------------------
【详细过程】
  一,用PEID查壳为MASM32 / TASM32 [Overlay]无壳。
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++
  二,运行软件,注册窗口进行注册,输入错误的注册信息进行检测!软件有尾巴!
   提示说:“No luck there mate!”
  用OD载入,右键超级字串查找,找到"No luck there mate!",双击进入程序代码段,往上查找,在一个合适的地方下断。
00401382  |.  56            push    esi                        ;  CRACKME.0040218E
00401383  |>  8A06          /mov     al, [esi]                        获取第一位
00401385  |.  84C0          |test    al, al
00401387  |.  74 13         |je      short 0040139C               
00401389  |.  3C 41         |cmp     al, 41                       
0040138B  |.  72 1F         |jb      short 004013AC                小于41
0040138D  |.  3C 5A         |cmp     al, 5A                       
0040138F  |.  73 03         |jnb     short 00401394                如果大于等于5A   检查!
00401391  |.  46            |inc     esi                       
00401392  |.^ EB EF         |jmp     short 00401383       
00401394  |>  E8 39000000   |call    004013D2
00401399  |.  46            |inc     esi                       
0040139A  |.^ EB E7         \jmp     short 00401383
0040139C  |>  5E            pop     esi                                     
0040139D  |.  E8 20000000   call    004013C2                                ; |这里是用户名位数想加,进入看看!
004013A2  |.  81F7 78560000 xor     edi, 5678                                        //结果与5678 xor
004013A8  |.  8BC7          mov     eax, edi
004013AA  |.  EB 15         jmp     short 004013C1
004013AC  |>  5E            pop     esi
004013AD  |.  6A 30         push    30                               ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
004013AF  |.  68 60214000   push    00402160                         ; |Title = "No luck!"
004013B4  |.  68 69214000   push    00402169                         ; |Text = "No luck there, mate!"
004013B9  |.  FF75 08       push    dword ptr [ebp+8]                ; |hOwner
004013BC  |.  E8 79000000   call    <jmp.&USER32.MessageBoxA>        ; \MessageBoxA
004013C1  \>  C3            retn                //注册码位置

用户名CALL算法:

004013C2  /$  33FF          xor     edi, edi
004013C4  |.  33DB          xor     ebx, ebx
004013C6  |>  8A1E          /mov     bl, [esi]                             ; 取第一位
004013C8  |.  84DB          |test    bl, bl
004013CA  |.  74 05         |je      short 004013D1
004013CC  |.  03FB          |add     edi, ebx                             ; 第一位和0加保存=edi ;;第二次=第一次结果+第二位
004013CE  |.  46            |inc     esi
004013CF  |.^ EB F5         \jmp     short 004013C6

来到这里:

00401232   .  50            push    eax
00401233   .  68 7E214000   push    0040217E                         ;  ASCII "78"
00401238   .  E8 9B010000   call    004013D8                             ;  算法
0040123D   .  83C4 04       add     esp, 4
00401240   .  58            pop     eax
00401241   .  3BC3          cmp     eax, ebx                             ;  用户名的与5678异或的结果与注册码比较
00401243   .  74 07         je      short 0040124C                     ;  爆炸点
00401245   .  E8 18010000   call    00401362
0040124A   .^ EB 9A         jmp     short 004011E6
0040124C   >  E8 FC000000   call    0040134D
00401251   .^ EB 93         jmp     short 004011E6
00401253  /.  C8 000000     enter   0, 0
00401257  |.  53            push    ebx
00401258  |.  56            push    esi
00401259  |.  57            push    edi

进入算法Call

004013D8  /$  33C0          xor     eax, eax                             ;   清0
004013DA  |.  33FF          xor     edi, edi                             ;   清0
004013DC  |.  33DB          xor     ebx, ebx                             ;   清0
004013DE  |.  8B7424 04     mov     esi, [esp+4]                     ;   取注册码78       
004013E2  |>  B0 0A         /mov     al, 0A                             
004013E4  |.  8A1E          |mov     bl, [esi]                             ;   取注册码第一位7   取8
004013E6  |.  84DB          |test    bl, bl
004013E8  |.  74 0B         |je      short 004013F5
004013EA  |.  80EB 30       |sub     bl, 30                             ;   37-30                38-30
004013ED  |.  0FAFF8        |imul    edi, eax                             ;   0*A        第一位结果edi*A
004013F0  |.  03FB          |add     edi, ebx                             ;   得到的结果加第一位=edi    edi*a+第二位  
                                                                     ;   
004013F2  |.  46            |inc     esi                             ;   下一位
004013F3  |.^ EB ED         \jmp     short 004013E2                       
004013F5  |>  81F7 34120000 xor     edi, 1234                             ;          (edi*a+第二位)结果 与 1234 异或
004013FB  |.  8BDF          mov     ebx, edi                                 
004013FD  \.  C3            retn

--------------------------------------------------------------------------------
【经验总结】
  它的算法是:
  用户名的位数想加得到的数与5678做异或运算
  
  注册码第一位-30 = 用A标记   第二次很明显了哦~  
  第一位 * A(这里被初始为0了;;;这句xor     eax, eax) = B 标记   第二次循环时:第一位结果edi*A
  第一位edi+0 =C 标记    ;;;第二次时:edi*a+第二位
  最后的出edi 与 1234 做异或! 比较注册名与注册码是否相等,如果相等成功.不等OVER.描述有些乱边调试边对照边想想就OK!
  
  后记:有一年多没有来看雪了,突然有种兴奋就有了这篇破文,适合菜鸟看!
  PS:感觉论坛很慢!!!!HOHO


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (9)
雪    币: 338
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
呵呵!!学习一下!
2006-8-3 16:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我下来试试看!
2006-8-13 15:06
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
收藏了,谢谢楼主了.
2006-8-15 05:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
实际操作时,用OD截入时,按F9运行,弹出注册对话框,点击HELP ->REGISTER时,弹不出注册码和注册名的对话框(下不下断点一样呀).不用OD载入时却正常,这是为何?这个CRACK有反调试功能吗?哪位解析下.怎么做?菜鸟笨.
2006-8-15 11:28
0
雪    币: 433
活跃值: (176)
能力值: ( LV13,RANK:1250 )
在线值:
发帖
回帖
粉丝
6
最初由 海东青山 发布
实际操作时,用OD截入时,按F9运行,弹出注册对话框,点击HELP ->REGISTER时,弹不出注册码和注册名的对话框(下不下断点一样呀).不用OD载入时却正常,这是为何?这个CRACK有反调试功能吗?哪位解析下.怎么做?菜鸟笨.


看我的贴可能有些帮助:
http://bbs.pediy.com/showthread.php?s=&threadid=30404

注意这个程序只能运行一个实例
2006-8-18 16:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
多谢冲天兄的指导,今晚研究你的帖子.
2006-8-18 17:07
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
十分感谢,辛苦了;一定好好研究你的帖子。
2006-8-21 10:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我来学习一下
慢慢看
2006-8-21 17:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
标准的算法分析贴,我也可以看得懂了,不错,有进步。
2006-8-21 22:38
0
游客
登录 | 注册 方可回帖
返回
//