【文章标题】: 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
如果有一个和我一样菜的菜鸟看了本文能有所收获,就是本人最大的动力。