飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2795|回复: 1

[原创] 对一简单crackme的追码和简单算法分析

[复制链接]

该用户从未签到

发表于 2007-12-24 16:18:40 | 显示全部楼层 |阅读模式
【破文标题】对一简单crackme的追码和简单算法分析
【破文作者】gtboy
【作者邮箱】lywbff@163.com
【作者主页】没有,我很菜还有点懒
破解工具】peid,ICY OD
【破解平台】盗版的winxp sp2
【软件名称】crackme
【软件大小】8.00 KB
【原版下载】看雪crackme2007合辑
【保护方式】无壳,序列号方式
【软件简介】不要说我炒冷饭啊,这个crackme2007合集里面的crackme最多,我的电脑没有联网啊,上网还得在同学的机子上。但决定是自己分析的。
【破解声明】纯粹是为了练手,第一次独立追码成功,继续写文以纪念之。
------------------------------------------------------------------------
【破解过程】peid查壳,没有加,那就OD吧,直接运行,输入gtboy和假的注册码1234567890,点test后弹出出错对话框"Try again",那就查下这个字符串吧,很快就找到了,向上看看那个地方调用了,很快就找到了计算注册码的地方,把关键的地方贴出来吧。
00401139   $  6A 32         PUSH 32                                  ; /Count = 32 (50.)
0040113B   .  68 F3204000   PUSH Crackme1.004020F3                   ; |把用户名压入堆栈
00401140   .  68 C8000000   PUSH 0C8                                 ; |ControlID = C8 (200.)
00401145   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
00401148   .  E8 DE000000   CALL <JMP.&USER32.GetDlgItemTextA>       ; \计算用户名的长度
0040114D   .  83F8 00       CMP EAX,0                                ;  与0做比较,验证是否输入
00401150   .  0F84 99000000 JE Crackme1.004011EF
00401156   .  83F8 04       CMP EAX,4                                ;  是否大于4位
00401159   .  0F82 90000000 JB Crackme1.004011EF
0040115F   .  33C9          XOR ECX,ECX
00401161   .  33DB          XOR EBX,EBX
00401163   .  33F6          XOR ESI,ESI
00401165   .  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX             ;  eax中为用户名的长度
00401168   >  0FBE81 F32040>MOVSX EAX,BYTE PTR DS:[ECX+4020F3]       ;  依次取用户名的每个字母到eax
0040116F   .  83F8 20       CMP EAX,20                               ;  所取字母的ascii值是否为20,即忽略空格
00401172   .  74 07         JE SHORT Crackme1.0040117B               ;  若是则不加以改变,取下一个字母
00401174   .  6BC0 04       IMUL EAX,EAX,4                           ;  ascii值乘以4
00401177   .  03D8          ADD EBX,EAX                              ;  把eax的值和ebx相加,ebx为前面字母的计算值的累加
00401179   .  8BF3          MOV ESI,EBX                              ;  把累加的结果放入esi
0040117B   >  41            INC ECX                                  ;  累加,把字母取完
0040117C   .  3B4D FC       CMP ECX,DWORD PTR SS:[EBP-4]
0040117F   .^ 75 E7         JNZ SHORT Crackme1.00401168
00401181   .  83FE 00       CMP ESI,0                                ;  esi中为顺序计算的结果
00401184   .  74 69         JE SHORT Crackme1.004011EF
00401186   .  BB 89476500   MOV EBX,654789                           ;  把654789放入ebx,作为ebx的初值
0040118B   >  0FBE81 F22040>MOVSX EAX,BYTE PTR DS:[ECX+4020F2]       ;  逆序取用户名的字母放入eax,从算法上看就没有用嘛
00401192   .  4B            DEC EBX                                  ;  ebx的值减1
00401193   .  6BC3 02       IMUL EAX,EBX,2                           ;  ebx的值乘以2后放入eax
00401196   .  03D8          ADD EBX,EAX                              ;  把eax和ebx的值相加后放入ebx
00401198   .  4B            DEC EBX                                  ;  ebx的值再减一
00401199   .  49            DEC ECX                                  ;  看是否已经取完
0040119A   .^ 75 EF         JNZ SHORT Crackme1.0040118B
0040119C   .  56            PUSH ESI                                 ; /顺着取计算的结果
0040119D   .  53            PUSH EBX                                 ; |逆序取计算的结果
0040119E   .  68 C7204000   PUSH Crackme1.004020C7                   ; |连接成BS-%lX-%lu的形式,lx为逆序的值,lu不清楚
004011A3   .  68 BB214000   PUSH Crackme1.004021BB                   ; |把连接好的真码入栈
004011A8   .  E8 6C000000   CALL <JMP.&USER32.wsprintfA>             ; \wsprintfA
004011AD   .  58            POP EAX                                  ;  Crackme1.004021BB
004011AE   .  58            POP EAX
004011AF   .  58            POP EAX
004011B0   .  58            POP EAX
004011B1   .  E8 01000000   CALL Crackme1.004011B7                   ;  短call,想单步跟的话要用F7,脱壳的时候也有这种现象
004011B6   .  C3            RETN
004011B7   $  33C9          XOR ECX,ECX
004011B9   .  6A 32         PUSH 32                                  ; /Count = 32 (50.)
004011BB   .  68 57214000   PUSH Crackme1.00402157                   ; |假码入栈
004011C0   .  68 C9000000   PUSH 0C9                                 ; |ControlID = C9 (201.)
004011C5   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
004011C8   .  E8 5E000000   CALL <JMP.&USER32.GetDlgItemTextA>       ; \GetDlgItemTextA
004011CD   .  83F8 00       CMP EAX,0                                ;  假码的长度
004011D0   .  74 1D         JE SHORT Crackme1.004011EF
004011D2   .  33C9          XOR ECX,ECX
004011D4   >  0FBE81 572140>MOVSX EAX,BYTE PTR DS:[ECX+402157]       ;  把假码和真码每次取一位进行比较,有一个错即跳到失败
004011DB   .  0FBE99 BB2140>MOVSX EBX,BYTE PTR DS:[ECX+4021BB]
004011E2   .  3BC3          CMP EAX,EBX
004011E4   .  75 09         JNZ SHORT Crackme1.004011EF
004011E6   .  83F8 00       CMP EAX,0
004011E9   .  74 19         JE SHORT Crackme1.00401204
004011EB   .  41            INC ECX
004011EC   .^ EB E6         JMP SHORT Crackme1.004011D4
004011EE   .  C3            RETN
004011EF   >  6A 10         PUSH 10                                  ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004011F1   .  68 E4204000   PUSH Crackme1.004020E4                   ; |Title = "Nope"
004011F6   .  68 E9204000   PUSH Crackme1.004020E9                   ; |Text = "Try again"
004011FB   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hOwner
004011FE   .  E8 34000000   CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA
00401203   .  C3            RETN
00401204   >  6A 40         PUSH 40                                  ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401206   .  68 D2204000   PUSH Crackme1.004020D2                   ; |Title = "Solved"
0040120B   .  68 D9204000   PUSH Crackme1.004020D9                   ; |Text = "Well done."
00401210   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hOwner
00401213   .  E8 1F000000   CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA
00401218   .  C3            RETN

通过动态跟踪得到了自己的注册码BS-6022E527-2196,注册机我不会写,就对算法简单的分析了下子,就“0040119E   .  68 C7204000   PUSH Crackme1.004020C7                   ; |连接成BS-%lX-%lu的形式,lx为逆序的值,lu不清楚”这个地方很迷惑,lu应该是顺序计算的值吧,但我的值应该是894,而不是2196,去看crackme2007上的分析的时候和我想的是一样的,但是我的值却不一样了,很困惑,考完试了再跟下吧,今天看来是没有希望了。昨晚熬夜看球,可惜自己喜欢的队输了,刚起床把逆序的部分分析了下子,和大家一起来分享下子,呵呵,这个crackme很适合咱们菜鸟练手的。
   
------------------------------------------------------------------------
【破解总结】追出注册码的感觉比爆破好了那么点,可惜中间的一点迷惑始终让自己很郁闷。还有就是004011B1   .  E8 01000000   CALL Crackme1.004011B7  这个短call,有时脱壳的时候会看到,单步跟踪要用F7的。我的文笔不是很好,希望大家不要仍西红柿啊。
------------------------------------------------------------------------
【版权声明】支持pyg,锻炼自己。想转就转吧,没有技术含量的,(*^__^*) 嘻嘻……

Crackme1.rar

2.59 KB, 下载次数: 10, 下载积分: 飘云币 -2 枚

评分

参与人数 1飘云币 +20 收起 理由
tianxj + 20 感谢您发布的原创作品!

查看全部评分

PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-5-6 16:27
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2007-12-24 16:41:23 | 显示全部楼层
    真的想静下心来学习一遍这个CrackMe合集!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表