melody 1.52 简单算法分析
【文章标题】: 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:
004472EA|.64:8920 mov dword ptr fs:, esp
004472ED|.8D55 F4 lea edx, dword ptr
004472F0|.8B83 E0010000 mov eax, dword ptr
004472F6|.E8 0D6FFDFF call 0041E208 ;取试炼码
004472FB|.837D F4 00 cmp dword ptr , 0 ;试炼码是否为空?
004472FF|.0F84 5B010000 je 00447460 ;为空则跳向失败
00447305|.8D55 F0 lea edx, dword ptr
00447308|.8B83 DC010000 mov eax, dword ptr
0044730E|.E8 F56EFDFF call 0041E208 ;取用户名
00447313|.837D F0 00 cmp dword ptr , 0 ;用户名是否为空?
00447317|.0F84 43010000 je 00447460 ;为空则跳向失败
0044731D|.8D55 F4 lea edx, dword ptr
00447320|.8B83 E0010000 mov eax, dword ptr
00447326|.E8 DD6EFDFF call 0041E208 ;取试炼码
0044732B|.8B45 F4 mov eax, dword ptr ;试炼码地址入EAX
0044732E|.E8 65FAFBFF call 00406D98 ;试炼码由字符串转为对应16进制
00447333|.8945 EC mov dword ptr , eax ;放入
00447336|.DB45 EC fild dword ptr ;将整数试炼码16进制装入st(0)
00447339|.E8 8AB6FBFF call 004029C8 ;将st(0)值以整数保存到eax
0044733E|.8945 FC mov dword ptr , eax
00447341|.8D55 F8 lea edx, dword ptr
00447344|.8B83 DC010000 mov eax, dword ptr
0044734A|.E8 B96EFDFF call 0041E208
0044734F|.33F6 xor esi, esi ;esi清零
00447351|.8B45 F8 mov eax, dword ptr ;用户名地址入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 ;用户名地址传入ecx
00447365|.0FB64C11 FF |movzx ecx, byte ptr ;用户名逐位扩展送入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 , esi
00447373|.DB45 EC fild dword ptr ;将整数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 ;esi值与内试炼码的16进制相比较
00447387|.0F85 C9000000 jnz 00447456 ;不等则跳向失败,爆破点
0044738D|.B2 01 mov dl, 1
0044738F|.A1 28634400 mov eax, dword ptr
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
004473AC|.8B83 DC010000 mov eax, dword ptr
004473B2|.E8 516EFDFF call 0041E208
004473B7|.8B4D F4 mov ecx, dword ptr
004473BA|.BA C4744400 mov edx, 004474C4 ;username
004473BF|.8BC6 mov eax, esi
004473C1|.E8 1AF3FFFF call 004466E0
004473C6|.8D55 F4 lea edx, dword ptr
004473C9|.8B83 E0010000 mov eax, dword ptr
004473CF|.E8 346EFDFF call 0041E208
004473D4|.8B45 F4 mov eax, dword ptr
004473D7|.E8 BCF9FBFF call 00406D98
004473DC|.8945 EC mov dword ptr , eax
004473DF|.DB45 EC fild dword ptr
004473E2|.83C4 F8 add esp, -8
004473E5|.DD1C24 fstp qword ptr
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
00447406|.8B83 DC010000 mov eax, dword ptr
0044740C|.E8 F76DFDFF call 0041E208
00447411|.8B4D F4 mov ecx, dword ptr
00447414|.8D45 E8 lea eax, dword ptr
00447417|.BA EC744400 mov edx, 004474EC ;registered for
0044741C|.E8 EFC7FBFF call 00403C10
00447421|.8B55 E8 mov edx, dword ptr
00447424|.A1 10FE4400 mov eax, dword ptr
00447429|.8B00 mov eax, dword ptr
0044742B|.8B80 A8020000 mov eax, dword ptr
00447431|.E8 026EFDFF call 0041E238
00447436|.A1 10FE4400 mov eax, dword ptr
0044743B|.8B00 mov eax, dword ptr
0044743D|.8B80 A4020000 mov eax, dword ptr
00447443|.33D2 xor edx, edx
00447445|.E8 1A6DFDFF call 0041E164
0044744A|.A1 B0074500 mov eax, dword ptr
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:, edx
00447468|.68 92744400 push 00447492
0044746D|>8D45 E8 lea eax, dword ptr
00447470|.E8 D3C4FBFF call 00403948
00447475|.8D45 F0 lea eax, dword ptr
00447478|.BA 02000000 mov edx, 2
0044747D|.E8 EAC4FBFF call 0040396C
00447482|.8D45 F8 lea eax, dword ptr
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
szErrMessdb "用户名不能为空!",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
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目录下就会出现你需要的可爱注册机了。
————————————————————————————————————————————————————————————
如果有一个和我一样菜的菜鸟看了本文能有所收获,就是本人最大的动力。 /:good
写的很详细,拜读中
写的很好~!!
支持~!!!!!!!!!!!!!!! mov a,eax多余/:017 牛人啊,拜读中……………… 原帖由 tianxj 于 2008-9-19 06:34 发表 https://www.chinapyg.com/images/common/back.gifmov a,eax多余/:017
主要这里用了invoke lstrlen,a
mov ecx,eax
取长度,eax 值就变了,用a传递了下。(试了下取长度不行)
请tianxj老师指教?
页:
[1]