【文章标题】: 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

打开程序

然后用DEDE打开


 四、分析过程

打开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:qifeon@yahoo.com",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目录下就会出现你需要的可爱注册机了。



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