飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 100739|回复: 153

[原创] [PYG]算法分析入门第二课

[复制链接]
  • TA的每日心情
    开心
    2024-12-1 11:04
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2005-3-29 12:47:38 | 显示全部楼层 |阅读模式
    【破文标题】[PYG]算法分析入门第二课
    【破文作者】飘云[PYG]
    破解工具】od二哥修改版
    【破解平台】winxp
    【作者邮箱】[email protected]
    【软件名称】crackme
    【保护方式】用户名+注册码

       ★★★以前分析过的东西,拿出来和大家分享一下,高手勿入,写的不好的请不要见笑,~~^_^~~

    试运行程序输入注册信息:
    piaoyun
    789456123
    有错误提示

    我们用od载入程序,查找字符参考,来到这里:

    0040121A         > \68 00200000         push 2000                               ; /Style =

    MB_OK|MB_TASKMODAL; Default case of switch 004011A4
    0040121F         .  68 01204000         push chap203.00402001                   ; |Title =

    "Duelist's Crackme #4"
    00401224         .  68 AE204000         push chap203.004020AE                   ; |Text = "Your

    registration info is invalid... Note that most of the special chars may raise registration

    problems!"
    00401229         .  6A 00               push 0                                  ; |hOwner = NULL

    和容易找到关键点:

    00401132     .  E8 41020000       call <jmp.&USER32.SendDlgItemMessage>; 取得用户名位数
    00401137     .  A3 AF214000       mov dword ptr ds:[4021AF],eax
    0040113C     .  83F8 00           cmp eax,0                             是否为0  
    0040113F     .  0F84 D5000000     je chap203.0040121A                   是则over
    00401145     .  83F8 08           cmp eax,8                             是否大于8位
    00401148     .  0F8F CC000000     jg chap203.0040121A                   大于则出错!
    0040114E     .  8BF0              mov esi,eax                           位数送到esi
    00401150     .  6A 00             push 0                              
    00401152     .  6A 00             push 0                              
    00401154     .  6A 0E             push 0E                              WM_GETTEXTLENGTH
    00401156     .  6A 04             push 4                              
    00401158     .  FF75 08           push dword ptr ss:[ebp+8]            
    0040115B     .  E8 18020000       call <jmp.&USER32.SendDlgItemMessage>; 取得假码位数
    00401160     .  83F8 00           cmp eax,0                              是否为0
    00401163     .  0F84 B1000000     je chap203.0040121A                    是则出错
    00401169     .  3BF0              cmp esi,eax                            是否和用户名位数相等
    0040116B     .  0F85 A9000000     jnz chap203.0040121A                   不等则出错
    00401171     .  68 60214000       push chap203.00402160               
    00401176     .  6A 08             push 8                              
    00401178     .  6A 0D             push 0D                              
    0040117A     .  6A 03             push 3                              
    0040117C     .  FF75 08           push dword ptr ss:[ebp+8]            
    0040117F     .  E8 F4010000       call <jmp.&USER32.SendDlgItemMessage>
    00401184     .  68 79214000       push chap203.00402179               
    00401189     .  6A 10             push 10                              
    0040118B     .  6A 0D             push 0D                              
    0040118D     .  6A 04             push 4                              
    0040118F     .  FF75 08           push dword ptr ss:[ebp+8]            
    00401192     .  E8 E1010000       call <jmp.&USER32.SendDlgItemMessage>
    00401197     .  B9 FFFFFFFF       mov ecx,-1                             初始化ecx
    0040119C     >  41                inc ecx                                
    0040119D     .  0FBE81 60214000   movsx eax,byte ptr ds:[ecx+402160]     逐位取用户名ascii值
    004011A4     .  83F8 00           cmp eax,0                              是否为0
    004011A7     .  74 32             je short chap203.004011DB              
    004011A9     .  BE FFFFFFFF       mov esi,-1
    004011AE     .  83F8 41           cmp eax,41                             是否小于41即字母“A”
    004011B1     .  7C 67             jl short chap203.0040121A              小于则出错
    004011B3     .  83F8 7A           cmp eax,7A                             是否大于7A即字母“z”
                                                           ★★判断用户名是否为字母★★
    004011B6     .  77 62             ja short chap203.0040121A              大于则出错
    004011B8     .  83F8 5A           cmp eax,5A                             是否小于41即字母“Z”
    004011BB     .  7C 03             jl short chap203.004011C0              是则跳
    004011BD     .  83E8 20           sub eax,20                             ascii值减去20
                                                           ★★这里就是将用户名转换成大写字母★★
    004011C0     .  46                inc esi                              
    004011C1     .  0FBE96 17204000   movsx edx,byte ptr ds:[esi+402017]   在这里点鼠标右键-转村中跟

    随-内存中跟随 可看到这张表:

    A1LSK2DJF4HGP3QWO5EIR6UTYZ8MXN7CBV9  (这里从第一位开始查找用户名在表中出现的位置)

    004011C8     .  3BC2              cmp eax,edx                           是否相等
    004011CA     .^ 75 F4             jnz short chap203.004011C0            不想等继续查找
    004011CC     .  0FBE86 3C204000   movsx eax,byte ptr ds:[esi+40203C]    在这里点鼠标右键-转村中

    跟随-内存中跟随 可看到这另一张表:   

    SU7CSJKF09NCSDO9SDF09SDRLVK7809S4NF  (这里把和用户名对应位置的数据放到eax  如我的:P对应S)

    004011D3     .  8981 94214000     mov dword ptr ds:[ecx+402194],eax     保存到内存中
    004011D9     .  EB C1             jmp short chap203.0040119C            循环
    004011DB     .  FF35 AF214000      push dword ptr ds:[4021AF]            
    004011E1     .  68 94214000         push chap203.00402194               真码入栈
    004011E6     .  68 79214000         push chap203.00402179               假码入栈
    004011EB     .  E8 54000000         call chap203.00401244               比较call,返回值送到eax  
    004011F0     .  83F8 01             cmp eax,1                           返回值为1则成功
    004011F3     .^ 0F84 DEFEFFFF       je chap203.004010D7                 此处必须跳
    004011F9     .  EB 1F               jmp short chap203.0040121A          这里跳向死亡

    跳动这里就见光明了:
    004010D7         > /68 00200000         push 2000                               ; /Style =

    MB_OK|MB_TASKMODAL
    004010DC         . |68 01204000         push chap203.00402001                   ; |Title =

    "Duelist's Crackme #4"
    004010E1         . |68 61204000         push chap203.00402061                   ; |Text =

    "Congratulations! Please send your KeyGen (working one) to [email protected]!"
    004010E6         . |6A 00               push 0                                  ; |hOwner = NULL


    【算法总结】
    用户名8位以内的字母
    注册码位数要和用户名位数相等
    找到两张表上一一对应的字母就是注册码

    我的注册信息:
    piaoyun
    S0SSLD0


    你学会了码?

    chap203.rar

    3.28 KB, 下载次数: 28518, 下载积分: 飘云币 -2 枚

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-4-4 09:40
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2005-3-29 17:49:31 | 显示全部楼层
    学习中~~~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-3-30 07:11:23 | 显示全部楼层
    学习!!!!!!!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-3-30 08:18:14 | 显示全部楼层

    学习ing................

    学习ing................
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-3-31 21:38:28 | 显示全部楼层
    :victory:
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-4-5 15:18:17 | 显示全部楼层
    学习~~~~~~~~~~~~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-4-26 22:49:40 | 显示全部楼层
    学了好长时间汇编,还是看不大懂!!!!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-12-1 11:04
  • 签到天数: 12 天

    [LV.3]偶尔看看II

     楼主| 发表于 2005-7-8 11:44:52 | 显示全部楼层
    这个是套路(也可以说是公式了)  就像做数学题一样!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-7-22 10:01:12 | 显示全部楼层
    继续学习中。。。。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-7-28 22:39:03 | 显示全部楼层
    努力中虽然还不是很理解.
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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