返回列表 发帖

[转帖]菜鸟算法练习破文一

作者:maomaoma 标 题: 【原创】菜鸟maomaoma的算法练习破文一 作 者: maomaoma 时 间: 2006-12-08,09:30 链 接: http://bbs.pediy.com/showthread.php?threadid=36095 【破文标题】菜鸟maomaoma的算法练习破文一 【破文作者】maomaoma 【作者邮箱】 【作者主页】无 【破解工具】OD、PEiD 【破解平台】winxp 【软件名称】Alive MP4 Converter 1.6.2.2 【软件大小】3311KB 【原版下载】http://nj.onlinedown.net/soft/52416.htm 【保护方式】无 【软件简介】Alive MP4 Converter 是一款专业的 MP4 转换器,它可以将各种主流的视频格式转换为 MP4 (MPEG4). 【破解声明】我是菜鸟,学写破文,还请大侠多多指教:) ------------------------------------------------------------------------ 【破解过程】 1、PEiD查主程序无壳(暗自高兴:)),Borland Delphi 6.0 - 7.0编译 2、OD载入,根据注册错误提示字符串“invalid registration code! \n\nplease enter an available registration code.”下断点 3、F9运行,输入用户名:maomaoma,注册码:12345678,OD断下 4、具体分析过程及代码注释如下: 第一部分 /*486EEC*/ push ebp //OD断在此处 /*486EED*/ mov ebp, esp /*486EEF*/ push 0 /*486EF1*/ push 0 /*486EF3*/ push 0 /*486EF5*/ push 0 /*486EF7*/ push 0 /*486EF9*/ push ebx /*486EFA*/ push esi /*486EFB*/ mov [ebp-8], ecx /*486EFE*/ mov [ebp-4], edx /*486F01*/ mov esi, eax /*486F03*/ mov eax, [ebp-4] /*486F06*/ call 00404A74 /*486F0B*/ mov eax, [ebp-8] /*486F0E*/ call 00404A74 /*486F13*/ xor eax, eax /*486F15*/ push ebp /*486F16*/ push 00486FE3 /*486F1B*/ push dword ptr fs:[eax] /*486F1E*/ mov fs:[eax], esp /*486F21*/ xor ebx, ebx /*486F23*/ xor edx, edx /*486F25*/ mov eax, [ebp-4] /*486F28*/ call 00404BC8 /*486F2D*/ test eax, eax /*486F2F*/ jle short 00486F3C /*486F31*/ lea eax, [ebp-8] /*486F34*/ mov edx, [ebp-4] /*486F37*/ call 0040466C /*486F3C*/ lea ecx, [ebp-C] /*486F3F*/ mov edx, [ebp-4] /*486F42*/ mov eax, esi /*486F44*/ call 00487078 //算法call跟进 /*486F49*/ mov edx, [ebp-C] //(initial cpu selection) /*486F4C*/ mov eax, [ebp-8] //内存注册机位置 /*486F4F*/ call 004087E8 //真假码比较call /*486F54*/ test eax, eax /*486F56*/ jnz short 00486F99 //不等则跳 /*486F58*/ mov edx, [ebp-4] /*486F5B*/ mov eax, esi /*486F5D*/ call 00486A88 /*486F62*/ test al, al /*486F64*/ je short 00486FC8 /*486F66*/ mov bl, 1 /*486F68*/ push 40 /*486F6A*/ lea edx, [ebp-10] /*486F6D*/ mov eax, [4A8E04] /*486F72*/ mov eax, [eax] /*486F74*/ call 004641C4 /*486F79*/ mov eax, [ebp-10] /*486F7C*/ call 00404A84 /*486F81*/ push eax /*486F82*/ push 00486FF4 //registered successfully, thanks for your registration. /*486F87*/ mov eax, [4A8E04] /*486F8C*/ mov eax, [eax] /*486F8E*/ mov eax, [eax+30] /*486F91*/ push eax /*486F92*/ call /*486F97*/ jmp short 00486FC8 /*486F99*/ push 10 /*486F9B*/ lea edx, [ebp-14] /*486F9E*/ mov eax, [4A8E04] /*486FA3*/ mov eax, [eax] /*486FA5*/ call 004641C4 /*486FAA*/ mov eax, [ebp-14] /*486FAD*/ call 00404A84 /*486FB2*/ push eax /*486FB3*/ push 0048702C //invalid registration code! \n\nplease enter an available registration code. /*486FB8*/ mov eax, [4A8E04] /*486FBD*/ mov eax, [eax] /*486FBF*/ mov eax, [eax+30] /*486FC2*/ push eax /*486FC3*/ call /*486FC8*/ xor eax, eax /*486FCA*/ pop edx /*486FCB*/ pop ecx /*486FCC*/ pop ecx /*486FCD*/ mov fs:[eax], edx /*486FD0*/ push 00486FEA /*486FD5*/ lea eax, [ebp-14] /*486FD8*/ mov edx, 5 /*486FDD*/ call 004045F8 /*486FE2*/ retn 第二部分 跟进/*486F44*/ call 00487078 /*487078*/ push ebp /*487079*/ mov ebp, esp /*48707B*/ push 0 /*48707D*/ push 0 /*48707F*/ push 0 /*487081*/ push 0 /*487083*/ push 0 /*487085*/ push 0 /*487087*/ push 0 /*487089*/ push 0 /*48708B*/ push ebx /*48708C*/ push esi /*48708D*/ push edi /*48708E*/ mov ebx, ecx /*487090*/ mov [ebp-4], edx /*487093*/ mov edi, eax /*487095*/ mov eax, [ebp-4] /*487098*/ call 00404A74 /*48709D*/ xor eax, eax /*48709F*/ push ebp /*4870A0*/ push 004871D3 /*4870A5*/ push dword ptr fs:[eax] /*4870A8*/ mov fs:[eax], esp /*4870AB*/ lea eax, [ebp-4] //用户名入堆栈 /*4870AE*/ mov edx, 004871EC //gg9e1x!co /*4870B3*/ call 00404894 //用户名跟固定字符串相连,记着N /*4870B8*/ mov eax, [ebp-4] /*4870BB*/ call 0040488C //取得相连后字符串位数 /*4870C0*/ mov esi, eax //字符串位数入esi /*4870C2*/ sar esi, 1 //esi右移1位 /*4870C4*/ jns short 004870C9 /*4870C6*/ adc esi, 0 /*4870C9*/ lea eax, [ebp-10] /*4870CC*/ push eax /*4870CD*/ mov ecx, esi //esi值赋给ecx /*4870CF*/ mov edx, 1 /*4870D4*/ mov eax, [ebp-4] /*4870D7*/ call 00404AE4 //取相连后字符串前ecx位构成变换后用户名第一部分,记着A /*4870DC*/ mov eax, [ebp-10] /*4870DF*/ push eax /*4870E0*/ lea eax, [ebp-14] /*4870E3*/ push eax /*4870E4*/ mov eax, [ebp-4] /*4870E7*/ call 0040488C //取N位数 /*4870EC*/ mov ecx, eax /*4870EE*/ lea edx, [esi+1] //edx=esi+1 /*4870F1*/ mov eax, [ebp-4] /*4870F4*/ call 00404AE4 //取余下的字符构成变换后用户名第二部分,记着B /*4870F9*/ mov edx, [ebp-14] /*4870FC*/ lea eax, [ebp-4] /*4870FF*/ pop ecx /*487100*/ call 004048D8 /*487105*/ lea eax, [ebp-8] /*487108*/ push eax /*487109*/ mov ecx, 0A /*48710E*/ mov edx, 1 /*487113*/ mov eax, [ebp-4] //A,B位置置换,记着C /*487116*/ call 00404AE4 //取前十位字符,记着D /*48711B*/ lea eax, [ebp-C] /*48711E*/ push eax /*48711F*/ mov eax, [ebp-4] /*487122*/ call 0040488C /*487127*/ mov ecx, eax /*487129*/ mov edx, 6 //edx=6 /*48712E*/ mov eax, [ebp-4] //eax=C /*487131*/ call 00404AE4 //取第六位到最末字符,记着E /*487136*/ cmp dword ptr [ebp-C], 0 /*48713A*/ jnz short 0048714C /*48713C*/ lea eax, [ebp-C] /*48713F*/ mov edx, 004871EC //gg9e1x!co /*487144*/ mov ecx, [ebp-8] /*487147*/ call 004048D8 /*48714C*/ push ebx /*48714D*/ mov ecx, [ebp-C] //ecx=E /*487150*/ mov edx, [ebp-8] //edx=D /*487153*/ mov eax, edi /*487155*/ call 00486938 //跟进 /*48715A*/ lea eax, [ebp-18] /*48715D*/ push eax /*48715E*/ mov eax, [ebx] /*487160*/ mov ecx, 5 /*487165*/ mov edx, 1 /*48716A*/ call 00404AE4 //取N2前五位(注册码第一部分) /*48716F*/ push dword ptr [ebp-18] /*487172*/ push 00487200 //- /*487177*/ lea eax, [ebp-1C] /*48717A*/ push eax /*48717B*/ mov eax, [ebx] /*48717D*/ mov ecx, 5 /*487182*/ mov edx, 6 /*487187*/ call 00404AE4 //取N2六到十位(注册码第二部分) /*48718C*/ push dword ptr [ebp-1C] /*48718F*/ push 00487200 //- /*487194*/ lea eax, [ebp-20] /*487197*/ push eax /*487198*/ mov eax, [ebx] /*48719A*/ mov ecx, 5 /*48719F*/ mov edx, 0B /*4871A4*/ call 00404AE4 //取N2十一到十五位(注册码第二部分) /*4871A9*/ push dword ptr [ebp-20] /*4871AC*/ mov eax, ebx /*4871AE*/ mov edx, 5 /*4871B3*/ call 0040494C //注册码三部分相连,得到最终注册码 /*4871B8*/ xor eax, eax /*4871BA*/ pop edx /*4871BB*/ pop ecx /*4871BC*/ pop ecx /*4871BD*/ mov fs:[eax], edx /*4871C0*/ push 004871DA /*4871C5*/ lea eax, [ebp-20] /*4871C8*/ mov edx, 8 /*4871CD*/ call 004045F8 /*4871D2*/ retn /*4871D3*/ jmp 00403FFC /*4871D8*/ jmp short 004871C5 /*4871DA*/ pop edi /*4871DB*/ pop esi /*4871DC*/ pop ebx /*4871DD*/ mov esp, ebp /*4871DF*/ pop ebp /*4871E0*/ retn 第三部分 跟进/*487155*/ call 00486938 /*486938*/ push ebp /*486939*/ mov ebp, esp /*48693B*/ add esp, -20 /*48693E*/ push ebx /*48693F*/ push esi /*486940*/ push edi /*486941*/ xor ebx, ebx /*486943*/ mov [ebp-20], ebx /*486946*/ mov [ebp-10], ebx /*486949*/ mov [ebp-8], ecx /*48694C*/ mov [ebp-4], edx /*48694F*/ mov eax, [ebp-4] /*486952*/ call 00404A74 /*486957*/ mov eax, [ebp-8] /*48695A*/ call 00404A74 /*48695F*/ xor eax, eax /*486961*/ push ebp /*486962*/ push 00486A54 /*486967*/ push dword ptr fs:[eax] /*48696A*/ mov fs:[eax], esp /*48696D*/ mov eax, [ebp-8] /*486970*/ call 0040488C //取E位数 /*486975*/ mov [ebp-C], eax /*486978*/ cmp dword ptr [ebp-C], 0 /*48697C*/ jnz short 0048698B /*48697E*/ lea eax, [ebp-8] /*486981*/ mov edx, 00486A6C //think space /*486986*/ call 0040466C /*48698B*/ xor esi, esi /*48698D*/ mov ebx, 100 //ebx储存D、E变换后注册码(N1),初始化为100 /*486992*/ lea eax, [ebp-10] /*486995*/ push eax /*486996*/ mov dword ptr [ebp-1C], 100 /*48699D*/ mov byte ptr [ebp-18], 0 /*4869A1*/ lea edx, [ebp-1C] /*4869A4*/ xor ecx, ecx /*4869A6*/ mov eax, 00486A80 //%1.2x /*4869AB*/ call 004099D0 //格式化ebx值 /*4869B0*/ mov eax, [ebp-4] /*4869B3*/ call 0040488C //取D位数 /*4869B8*/ mov edi, eax /*4869BA*/ test edi, edi /*4869BC*/ jle short 00486A1E /*4869BE*/ mov dword ptr [ebp-14], 1 /*4869C5*/ mov eax, [ebp-4] //D、E转为N1核心算法部分 /*4869C8*/ mov edx, [ebp-14] /*4869CB*/ movzx eax, byte ptr [eax+edx-1] //D依次取字符ASCII值 /*4869D0*/ add eax, ebx //加m(第一次加常数100) /*4869D2*/ mov ecx, 0FF //ecx=0FF /*4869D7*/ cdq /*4869D8*/ idiv ecx //除ecx /*4869DA*/ mov ebx, edx //计算结果保留于ebx /*4869DC*/ cmp esi, [ebp-C] /*4869DF*/ jge short 004869E4 /*4869E1*/ inc esi //循环计数 /*4869E2*/ jmp short 004869E9 /*4869E4*/ mov esi, 1 /*4869E9*/ mov eax, [ebp-8] /*4869EC*/ movzx eax, byte ptr [eax+esi-1] //E依次取字符ASCII值 /*4869F1*/ xor ebx, eax //异或第一部分变换结果 /*4869F3*/ lea eax, [ebp-20] /*4869F6*/ push eax /*4869F7*/ mov [ebp-1C], ebx //ebx值保留堆栈中 /*4869FA*/ mov byte ptr [ebp-18], 0 /*4869FE*/ lea edx, [ebp-1C] /*486A01*/ xor ecx, ecx /*486A03*/ mov eax, 00486A80 //%1.2x /*486A08*/ call 004099D0 //格式化ebx值,记着m /*486A0D*/ mov edx, [ebp-20] /*486A10*/ lea eax, [ebp-10] /*486A13*/ call 00404894 //初始值100及每次m相连 /*486A18*/ inc dword ptr [ebp-14] /*486A1B*/ dec edi /*486A1C*/ jnz short 004869C5 /*486A1E*/ mov eax, [ebp+8] //最终结果,记着N2 /*486A21*/ mov edx, [ebp-10] /*486A24*/ call 00404628 //结果入堆栈 /*486A29*/ xor eax, eax /*486A2B*/ pop edx /*486A2C*/ pop ecx /*486A2D*/ pop ecx /*486A2E*/ mov fs:[eax], edx /*486A31*/ push 00486A5B /*486A36*/ lea eax, [ebp-20] /*486A39*/ call 004045D4 /*486A3E*/ lea eax, [ebp-10] /*486A41*/ call 004045D4 /*486A46*/ lea eax, [ebp-8] /*486A49*/ mov edx, 2 /*486A4E*/ call 004045F8 /*486A53*/ retn ------------------------------------------------------------------------ 【破解总结】 1、用户名与固定字符串组合并作变换 2、由变换后用户名计算出注册码 3、真假码明码比较:) 可作内存注册机,刚自学编程,算法注册机不会,还要向大侠们学习:) 提供一组可用注册码: 用户名:maomaoma 注册码:10010-56CC5-DE35D ------------------------------------------------------------------------ 【版权声明】本文系作者原创, 转载请注明作者并保持文章的完整, 谢谢!

[转帖]菜鸟算法练习破文一

学习破解先要学什么?这样才能看懂这些数字和字母?

TOP

返回列表 回复 发帖