飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4426|回复: 5

[原创] melody 1.52 简单算法分析

[复制链接]
  • TA的每日心情
    开心
    2018-12-18 12:34
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2008-9-16 16:37:57 | 显示全部楼层 |阅读模式
    【文章标题】: melody 1.52 算法简单分析
    【文章作者】: qifeon
    【软件名称】: melody
    【下载地址】: 自己搜索下载
    【保护方式】: 注册码
    【使用工具】: OD,PEID
    【操作平台】: WINXP SP2
    【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
    --------------------------------------------------------------------------------
    【详细过程】
      一、PEID查壳,显示无壳。编程语言为Borland Delphi 3.0。
      
      二、运行软件,输入“qifeon,123456”,有错误提示“invalide registration name or code. try again”。
      
       三、确定关键代码段

        对这个简单程序,方法有很多。查找字符串,下断API函数等。论坛有少数朋友仍然不会使用DEDE寻

    找按钮事件代码,这里简单演示下。一般DEDE需要配合资源处理软件使用,主要是找出原始按钮名称,

    有过编程经验的朋友都知道,编程时一般都把默认的名称如Button1修改为有意义的标题,如“确定”“注

    册”等。而在DEDE里显示的是开发时默认的名称,所以一般需要这一步。话不多说,动手,用PEexplore

    打开程序
    tu01.GIF
    然后用DEDE打开
    tu02.GIF

    四、分析过程

    打开OD,载入程序,“Ctrl+G”,输入004472D0,来到按钮事件代码处,下断,就可以开始调试之旅了。

    004472D0  /.  55            push    ebp                              ;  按钮事件代码开始处
    004472D1  |.  8BEC          mov     ebp, esp
    004472D3  |.  33C9          xor     ecx, ecx
    004472D5  |.  51            push    ecx
    004472D6  |.  51            push    ecx
    004472D7  |.  51            push    ecx
    004472D8  |.  51            push    ecx
    004472D9  |.  51            push    ecx
    004472DA  |.  51            push    ecx
    004472DB  |.  53            push    ebx
    004472DC  |.  56            push    esi
    004472DD  |.  8BD8          mov     ebx, eax
    004472DF  |.  33C0          xor     eax, eax
    004472E1  |.  55            push    ebp
    004472E2  |.  68 8B744400   push    0044748B
    004472E7  |.  64:FF30       push    dword ptr fs:[eax]
    004472EA  |.  64:8920       mov     dword ptr fs:[eax], esp
    004472ED  |.  8D55 F4       lea     edx, dword ptr [ebp-C]
    004472F0  |.  8B83 E0010000 mov     eax, dword ptr [ebx+1E0]
    004472F6  |.  E8 0D6FFDFF   call    0041E208                         ;  取试炼码
    004472FB  |.  837D F4 00    cmp     dword ptr [ebp-C], 0             ;  试炼码是否为空?
    004472FF  |.  0F84 5B010000 je      00447460                         ;  为空则跳向失败
    00447305  |.  8D55 F0       lea     edx, dword ptr [ebp-10]
    00447308  |.  8B83 DC010000 mov     eax, dword ptr [ebx+1DC]
    0044730E  |.  E8 F56EFDFF   call    0041E208                         ;  取用户名
    00447313  |.  837D F0 00    cmp     dword ptr [ebp-10], 0            ;  用户名是否为空?
    00447317  |.  0F84 43010000 je      00447460                         ;  为空则跳向失败
    0044731D  |.  8D55 F4       lea     edx, dword ptr [ebp-C]
    00447320  |.  8B83 E0010000 mov     eax, dword ptr [ebx+1E0]
    00447326  |.  E8 DD6EFDFF   call    0041E208                         ;  取试炼码
    0044732B  |.  8B45 F4       mov     eax, dword ptr [ebp-C]           ;  试炼码地址入EAX
    0044732E  |.  E8 65FAFBFF   call    00406D98                         ;  试炼码由字符串转为对应16进制
    00447333  |.  8945 EC       mov     dword ptr [ebp-14], eax          ;  放入[ebp-14]
    00447336  |.  DB45 EC       fild    dword ptr [ebp-14]               ;  将整数试炼码16进制装入st(0)
    00447339  |.  E8 8AB6FBFF   call    004029C8                         ;  将st(0)值以整数保存到eax
    0044733E  |.  8945 FC       mov     dword ptr [ebp-4], eax
    00447341  |.  8D55 F8       lea     edx, dword ptr [ebp-8]
    00447344  |.  8B83 DC010000 mov     eax, dword ptr [ebx+1DC]
    0044734A  |.  E8 B96EFDFF   call    0041E208
    0044734F  |.  33F6          xor     esi, esi                         ;  esi清零
    00447351  |.  8B45 F8       mov     eax, dword ptr [ebp-8]           ;  用户名地址入EAX
    00447354  |.  E8 6BC8FBFF   call    00403BC4                         ;  取用户名长度,设为len
    00447359  |.  85C0          test    eax, eax
    0044735B  |.  7E 13         jle     short 00447370
    0044735D  |.  BA 01000000   mov     edx, 1                           ;  edx=1
    00447362  |>  8B4D F8       /mov     ecx, dword ptr [ebp-8]          ;  用户名地址传入ecx
    00447365  |.  0FB64C11 FF   |movzx   ecx, byte ptr [ecx+edx-1]       ;  用户名逐位扩展送入ecx
    0044736A  |.  03F1          |add     esi, ecx                        ;  esi=esi+ecx,通过循环esi内保存用户名ASCII值之和,设为sum
    0044736C  |.  42            |inc     edx                             ;  edx增1
    0044736D  |.  48            |dec     eax                             ;  eax减1
    0044736E  |.^ 75 F2         \jnz     short 00447362                  ;  循环次数取决于用户名长度
    00447370  |>  8975 EC       mov     dword ptr [ebp-14], esi
    00447373  |.  DB45 EC       fild    dword ptr [ebp-14]               ;  将整数sum装入st(0)
    00447376  |.  E8 4DB6FBFF   call    004029C8                         ;  将st(0)值以整数保存到eax
    0044737B  |.  8BD0          mov     edx, eax                         ;  edx=eax=sum
    0044737D  |.  C1E0 07       shl     eax, 7                           ;  eax值左移7位
    00447380  |.  03C2          add     eax, edx                         ;  eax=eax+edx
    00447382  |.  8BF0          mov     esi, eax                         ;  eax 值传入esi,查看eax值10进制就是真正注册码了
    00447384  |.  3B75 FC       cmp     esi, dword ptr [ebp-4]           ;  esi值与[ebp-4]内试炼码的16进制相比较
    00447387  |.  0F85 C9000000 jnz     00447456                         ;  不等则跳向失败,爆破点
    0044738D  |.  B2 01         mov     dl, 1
    0044738F  |.  A1 28634400   mov     eax, dword ptr [446328]
    00447394  |.  E8 8BF0FFFF   call    00446424
    00447399  |.  8BF0          mov     esi, eax
    0044739B  |.  B1 01         mov     cl, 1
    0044739D  |.  BA A0744400   mov     edx, 004474A0                    ;  \software\lighttek\melody
    004473A2  |.  8BC6          mov     eax, esi
    004473A4  |.  E8 73F1FFFF   call    0044651C
    004473A9  |.  8D55 F4       lea     edx, dword ptr [ebp-C]
    004473AC  |.  8B83 DC010000 mov     eax, dword ptr [ebx+1DC]
    004473B2  |.  E8 516EFDFF   call    0041E208
    004473B7  |.  8B4D F4       mov     ecx, dword ptr [ebp-C]
    004473BA  |.  BA C4744400   mov     edx, 004474C4                    ;  username
    004473BF  |.  8BC6          mov     eax, esi
    004473C1  |.  E8 1AF3FFFF   call    004466E0
    004473C6  |.  8D55 F4       lea     edx, dword ptr [ebp-C]
    004473C9  |.  8B83 E0010000 mov     eax, dword ptr [ebx+1E0]
    004473CF  |.  E8 346EFDFF   call    0041E208
    004473D4  |.  8B45 F4       mov     eax, dword ptr [ebp-C]
    004473D7  |.  E8 BCF9FBFF   call    00406D98
    004473DC  |.  8945 EC       mov     dword ptr [ebp-14], eax
    004473DF  |.  DB45 EC       fild    dword ptr [ebp-14]
    004473E2  |.  83C4 F8       add     esp, -8
    004473E5  |.  DD1C24        fstp    qword ptr [esp]
    004473E8  |.  9B            wait
    004473E9  |.  BA D8744400   mov     edx, 004474D8                    ;  usercode
    004473EE  |.  8BC6          mov     eax, esi
    004473F0  |.  E8 1BF4FFFF   call    00446810
    004473F5  |.  8BC6          mov     eax, esi
    004473F7  |.  E8 8CF0FFFF   call    00446488
    004473FC  |.  8BC6          mov     eax, esi
    004473FE  |.  E8 31BAFBFF   call    00402E34
    00447403  |.  8D55 F4       lea     edx, dword ptr [ebp-C]
    00447406  |.  8B83 DC010000 mov     eax, dword ptr [ebx+1DC]
    0044740C  |.  E8 F76DFDFF   call    0041E208
    00447411  |.  8B4D F4       mov     ecx, dword ptr [ebp-C]
    00447414  |.  8D45 E8       lea     eax, dword ptr [ebp-18]
    00447417  |.  BA EC744400   mov     edx, 004474EC                    ;  registered for
    0044741C  |.  E8 EFC7FBFF   call    00403C10
    00447421  |.  8B55 E8       mov     edx, dword ptr [ebp-18]
    00447424  |.  A1 10FE4400   mov     eax, dword ptr [44FE10]
    00447429  |.  8B00          mov     eax, dword ptr [eax]
    0044742B  |.  8B80 A8020000 mov     eax, dword ptr [eax+2A8]
    00447431  |.  E8 026EFDFF   call    0041E238
    00447436  |.  A1 10FE4400   mov     eax, dword ptr [44FE10]
    0044743B  |.  8B00          mov     eax, dword ptr [eax]
    0044743D  |.  8B80 A4020000 mov     eax, dword ptr [eax+2A4]
    00447443  |.  33D2          xor     edx, edx
    00447445  |.  E8 1A6DFDFF   call    0041E164
    0044744A  |.  A1 B0074500   mov     eax, dword ptr [4507B0]
    0044744F  |.  E8 1C49FEFF   call    0042BD70
    00447454  |.  EB 0A         jmp     short 00447460
    00447456  |>  B8 04754400   mov     eax, 00447504                    ;  invalide registration name or code. try again.
    0044745B  |.  E8 E000FFFF   call    00437540
    00447460  |>  33C0          xor     eax, eax
    00447462  |.  5A            pop     edx
    00447463  |.  59            pop     ecx
    00447464  |.  59            pop     ecx
    00447465  |.  64:8910       mov     dword ptr fs:[eax], edx
    00447468  |.  68 92744400   push    00447492
    0044746D  |>  8D45 E8       lea     eax, dword ptr [ebp-18]
    00447470  |.  E8 D3C4FBFF   call    00403948
    00447475  |.  8D45 F0       lea     eax, dword ptr [ebp-10]
    00447478  |.  BA 02000000   mov     edx, 2
    0044747D  |.  E8 EAC4FBFF   call    0040396C
    00447482  |.  8D45 F8       lea     eax, dword ptr [ebp-8]
    00447485  |.  E8 BEC4FBFF   call    00403948
    0044748A  \.  C3            retn

    五、算法总结

    程序算法非常简单,正所谓提高菜鸟信心之练手绝佳对象。君不见中国男足热身老找柬埔寨、老挝等球队?找感觉啊

    1、求出用户名ASCII值之和,设为sum;

    2、sum左移7位,然后与sum相加;

    3、上面值转为10进制,即为注册码。

    六、keymake汇编注册机代码

    大侠刘健英写keymake,主要用来做汇编注册机模板的,而我们大多拿来做内存注册机和补丁了,现在试用它来做个注册机,其实很方便的。
    具体使用大家可以看下帮助部分,很详细。关键注意作者设计时为了统一,把编辑框输入和输出地址都放在EAX。算法部分汇编代码一般直接
    从程序提取,可以使用OD插件Codedata或Asm2clipboard .本人开始学的时候很笨,直接从OD复制下来,自己手动去除虚拟地址和机器码。
    代码多的话会累死。感谢插件的作者,给我们节省了时间。如果子程序太多,就需要用IDA带脚本提取了。当然如果你对这个模板不满意或想
    另外学习熟悉些汇编自己写模板也不难。

    数据区粘贴

    szHomePage db "http://www.365hz.net",0
    szEmail    db "mailto:[email protected]",0
    szErrMess  db "用户名不能为空!",0
    szBuffer db 50 dup (0)
    szFormat db "%d",0
    a dd 0

    代码区

    mov a,eax
    invoke lstrlen,a
    mov ecx,eax
    xor esi,esi
    mov edx,1h
    n1:
      mov eaX,a       
      movzx   eax, byte ptr [eax+edx-1]
      add     esi, eax
      inc     edx
      dec     ecx
      jnz n1
    mov edx,esi
    mov eax,esi
      shl     eax, 7
      add     eax, edx
    invoke wsprintf,addr szBuffer,addr szFormat,eax
    lea eax,szBuffer

    然后编译就可以了,keymake目录下就会出现你需要的可爱注册机了。


    ————————————————————————————————————————————————————————————
    如果有一个和我一样菜的菜鸟看了本文能有所收获,就是本人最大的动力。

    评分

    参与人数 1威望 +40 飘云币 +80 收起 理由
    tianxj + 40 + 80 您发布的主题属于精品!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2021-3-7 23:32
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    发表于 2008-9-17 01:13:24 | 显示全部楼层
    /:good

    写的很详细,拜读中
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-9-17 16:17:51 | 显示全部楼层

    写的很好~!!

    支持~!!!!!!!!!!!!!!!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-5-1 14:44
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-9-19 06:34:24 | 显示全部楼层
    mov a,eax多余/:017
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    前天 08:19
  • 签到天数: 1087 天

    [LV.10]以坛为家III

    发表于 2008-9-19 08:20:27 | 显示全部楼层
    牛人啊,拜读中………………
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-12-18 12:34
  • 签到天数: 4 天

    [LV.2]偶尔看看I

     楼主| 发表于 2008-9-19 08:52:03 | 显示全部楼层
    原帖由 tianxj 于 2008-9-19 06:34 发表
    mov a,eax多余/:017

    主要这里用了invoke lstrlen,a
    mov ecx,eax
    取长度,eax 值就变了,用a传递了下。(试了下[eax-4]取长度不行)
    请tianxj老师指教?
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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