vienna 发表于 2010-3-25 16:33

新手简单算法分析 -- 超级MP3转换大师 V1.20 附上粗糙注册机

本帖最后由 vienna 于 2010-3-26 11:09 编辑

【文章标题】: 新手简单算法分析 -- 超级MP3转换大师 V1.20
【文章作者】: vienna
【作者主页】: http://hi.baidu.com/vi_orz
【软件名称】: 超级MP3转换大师 V1.20
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: Delphi
【使用工具】: OD
【操作平台】: XP SP3
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
载入,MessageBox断点断下错误


004C4C60/.55            push ebp
004C4C61|.8BEC          mov ebp,esp
004C4C63|.6A 00         push 0
004C4C65|.6A 00         push 0
004C4C67|.53            push ebx
004C4C68|.8BD8          mov ebx,eax
004C4C6A|.33C0          xor eax,eax
004C4C6C|.55            push ebp
004C4C6D|.68 204D4C00   push MP3Conve.004C4D20
004C4C72|.64:FF30       push dword ptr fs:[eax]
004C4C75|.64:8920       mov dword ptr fs:[eax],esp
004C4C78|.8D55 FC       lea edx,
004C4C7B|.8B83 20030000 mov eax,dword ptr ds:[ebx+320]
004C4C81|.E8 DEFCF9FF   call MP3Conve.00464964
004C4C86|.8B45 FC       mov eax,
004C4C89|.E8 66FAF3FF   call MP3Conve.004046F4
004C4C8E|.85C0          test eax,eax
004C4C90|.75 29         jnz short MP3Conve.004C4CBB            ;是否填上用户名
004C4C92|.6A 40         push 40
004C4C94|.68 2C4D4C00   push MP3Conve.004C4D2C
004C4C99|.68 344D4C00   push MP3Conve.004C4D34
004C4C9E|.8BC3          mov eax,ebx
004C4CA0|.E8 A764FAFF   call MP3Conve.0046B14C
004C4CA5|.50            push eax                                 ; |hOwner
004C4CA6|.E8 6525F4FF   call <jmp.&user32.MessageBoxA>         ; \MessageBoxA
004C4CAB|.8B83 20030000 mov eax,dword ptr ds:[ebx+320]
004C4CB1|.8B10          mov edx,dword ptr ds:[eax]
004C4CB3|.FF92 C4000000 call dword ptr ds:[edx+C4]
004C4CB9|.EB 4A         jmp short MP3Conve.004C4D05
004C4CBB|>8D55 F8       lea edx,
004C4CBE|.8B83 24030000 mov eax,dword ptr ds:[ebx+324]
004C4CC4|.E8 9BFCF9FF   call MP3Conve.00464964
004C4CC9|.8B45 F8       mov eax,
004C4CCC|.E8 23FAF3FF   call MP3Conve.004046F4
004C4CD1|.85C0          test eax,eax
004C4CD3|.75 29         jnz short MP3Conve.004C4CFE            ;是否填上注册码
004C4CD5|.6A 40         push 40
004C4CD7|.68 2C4D4C00   push MP3Conve.004C4D2C
004C4CDC|.68 444D4C00   push MP3Conve.004C4D44
004C4CE1|.8BC3          mov eax,ebx
004C4CE3|.E8 6464FAFF   call MP3Conve.0046B14C
004C4CE8|.50            push eax                                 ; |hOwner
004C4CE9|.E8 2225F4FF   call <jmp.&user32.MessageBoxA>         ; \MessageBoxA
004C4CEE|.8B83 24030000 mov eax,dword ptr ds:[ebx+324]
004C4CF4|.8B10          mov edx,dword ptr ds:[eax]
004C4CF6|.FF92 C4000000 call dword ptr ds:[edx+C4]
004C4CFC|.EB 07         jmp short MP3Conve.004C4D05
004C4CFE|>8BC3          mov eax,ebx
004C4D00|.E8 3FF9FFFF   call MP3Conve.004C4644                   ;跟进去
004C4D05|>33C0          xor eax,eax
004C4D07|.5A            pop edx
004C4D08|.59            pop ecx
004C4D09|.59            pop ecx
004C4D0A|.64:8910       mov dword ptr fs:[eax],edx
004C4D0D|.68 274D4C00   push MP3Conve.004C4D27
004C4D12|>8D45 F8       lea eax,
004C4D15|.BA 02000000   mov edx,2
004C4D1A|.E8 39F7F3FF   call MP3Conve.00404458
004C4D1F\.C3            retn


过了检测是否为空之后跟进


004C4644   $55            push ebp
004C4645   .8BEC          mov ebp,esp
004C4647   .33C9          xor ecx,ecx
004C4649   .51            push ecx
004C464A   .51            push ecx
004C464B   .51            push ecx
004C464C   .51            push ecx
004C464D   .51            push ecx
004C464E   .53            push ebx
004C464F   .56            push esi
004C4650   .57            push edi
004C4651   .8945 FC       mov dword ptr ss:[ebp-4],eax
004C4654   .33C0          xor eax,eax
004C4656   .55            push ebp
004C4657   .68 95474C00   push MP3Conve.004C4795
004C465C   .64:FF30       push dword ptr fs:[eax]
004C465F   .64:8920       mov dword ptr fs:[eax],esp
004C4662   .8B45 FC       mov eax,dword ptr ss:[ebp-4]
004C4665   .E8 9A020000   call MP3Conve.004C4904                   ;跟进
004C466A   .84C0          test al,al
004C466C   .0F84 DB000000 je MP3Conve.004C474D                     ;判断是否将你输入的码放进注册表~算法在上面


然后都差不多

004C4964|.E8 03010000   call MP3Conve.004C4A6C                   ;出现真码?这里跟~
004C4969|.8B55 F4       mov edx,
004C496C|.58            pop eax
004C496D|.E8 CEFEF3FF   call MP3Conve.00404840                   ;这里比较,影响下面的

~~~~

004C4A6C/$55            push ebp
004C4A6D|.8BEC          mov ebp,esp
004C4A6F|.51            push ecx
004C4A70|.B9 04000000   mov ecx,4
004C4A75|>6A 00         /push 0
004C4A77|.6A 00         |push 0
004C4A79|.49            |dec ecx
004C4A7A|.^ 75 F9         \jnz short MP3Conve.004C4A75
004C4A7C|.51            push ecx
004C4A7D|.874D FC       xchg ,ecx
004C4A80|.53            push ebx
004C4A81|.56            push esi
004C4A82|.57            push edi
004C4A83|.8BF9          mov edi,ecx
004C4A85|.8955 FC       mov ,edx
004C4A88|.8B45 FC       mov eax,
004C4A8B|.E8 54FEF3FF   call MP3Conve.004048E4
004C4A90|.33C0          xor eax,eax
004C4A92|.55            push ebp
004C4A93|.68 2D4C4C00   push MP3Conve.004C4C2D
004C4A98|.64:FF30       push dword ptr fs:[eax]
004C4A9B|.64:8920       mov dword ptr fs:[eax],esp
004C4A9E|.8BC7          mov eax,edi
004C4AA0|.E8 8FF9F3FF   call MP3Conve.00404434
004C4AA5|.8B45 FC       mov eax,
004C4AA8|.E8 47FCF3FF   call MP3Conve.004046F4
004C4AAD|.8BF0          mov esi,eax
004C4AAF|.85F6          test esi,esi
004C4AB1|.7E 26         jle short MP3Conve.004C4AD9
004C4AB3|.BB 01000000   mov ebx,1
004C4AB8|>8D4D EC       /lea ecx,
004C4ABB|.8B45 FC       |mov eax,
004C4ABE|.0FB64418 FF   |movzx eax,byte ptr ds:[eax+ebx-1]       ;逐位“vienna”算ascii
004C4AC3|.33D2          |xor edx,edx
004C4AC5|.E8 4642F4FF   |call MP3Conve.00408D10                  ;变成ascii
004C4ACA|.8B55 EC       |mov edx,                     ;ascii放入edx
004C4ACD|.8D45 F8       |lea eax,
004C4AD0|.E8 27FCF3FF   |call MP3Conve.004046FC
004C4AD5|.43            |inc ebx
004C4AD6|.4E            |dec esi                                 ;算成7669656E6E61
004C4AD7|.^ 75 DF         \jnz short MP3Conve.004C4AB8
004C4AD9|>8B45 F8       mov eax,                        ;放7669656E6E61入eax
004C4ADC|.E8 13FCF3FF   call MP3Conve.004046F4
004C4AE1|.8BF0          mov esi,eax
004C4AE3|.85F6          test esi,esi
004C4AE5|.7E 2C         jle short MP3Conve.004C4B13
004C4AE7|.BB 01000000   mov ebx,1
004C4AEC|>8B45 F8       /mov eax,                     ;放7669656E6E61入eax
004C4AEF|.E8 00FCF3FF   |call MP3Conve.004046F4
004C4AF4|.2BC3          |sub eax,ebx                           ;eax减ebx,c - 1,等于b放入eax
004C4AF6|.8B55 F8       |mov edx,                     ;放7669656E6E61入edx
004C4AF9|.8A1402      |mov dl,byte ptr ds:[edx+eax]            ;把edx+eax的那位7669656E6E61的ascii放入dl
004C4AFC|.8D45 E8       |lea eax,
004C4AFF|.E8 18FBF3FF   |call MP3Conve.0040461C
004C4B04|.8B55 E8       |mov edx,
004C4B07|.8D45 F4       |lea eax,
004C4B0A|.E8 EDFBF3FF   |call MP3Conve.004046FC
004C4B0F|.43            |inc ebx
004C4B10|.4E            |dec esi                                 ;这个循环是把vienna的ascii倒序,16E6E6569667
004C4B11|.^ 75 D9         \jnz short MP3Conve.004C4AEC
004C4B13|>8D45 F8       lea eax,
004C4B16|.50            push eax
004C4B17|.B9 04000000   mov ecx,4                              ;ecx = 4
004C4B1C|.BA 01000000   mov edx,1                              ;edx = 1
004C4B21|.8B45 F4       mov eax,                        ;16E6E6569667放入eax
004C4B24|.E8 2BFEF3FF   call MP3Conve.00404954                   ;这call好像拿了16E6E6569667的头4位16E6
004C4B29|.8D45 F4       lea eax,
004C4B2C|.50            push eax
004C4B2D|.B9 04000000   mov ecx,4
004C4B32|.BA 05000000   mov edx,5
004C4B37|.8B45 F4       mov eax,
004C4B3A|.E8 15FEF3FF   call MP3Conve.00404954
004C4B3F|.8B45 F8       mov eax,                        ;16E6放入eax
004C4B42|.E8 ADFBF3FF   call MP3Conve.004046F4
004C4B47|.83F8 04       cmp eax,4
004C4B4A|.7D 2F         jge short MP3Conve.004C4B7B            ;跳了
004C4B4C|.8B45 F8       mov eax,
004C4B4F|.E8 A0FBF3FF   call MP3Conve.004046F4
004C4B54|.8BD8          mov ebx,eax
004C4B56|.83FB 03       cmp ebx,3
004C4B59|.7F 20         jg short MP3Conve.004C4B7B
004C4B5B|>8D4D E4       /lea ecx,
004C4B5E|.8BC3          |mov eax,ebx
004C4B60|.C1E0 02       |shl eax,2
004C4B63|.33D2          |xor edx,edx
004C4B65|.E8 A641F4FF   |call MP3Conve.00408D10
004C4B6A|.8B55 E4       |mov edx,
004C4B6D|.8D45 F8       |lea eax,
004C4B70|.E8 87FBF3FF   |call MP3Conve.004046FC
004C4B75|.43            |inc ebx
004C4B76|.83FB 04       |cmp ebx,4
004C4B79|.^ 75 E0         \jnz short MP3Conve.004C4B5B
004C4B7B|>8B45 F4       mov eax,                        ;把第二个4位的放入eax
004C4B7E|.E8 71FBF3FF   call MP3Conve.004046F4
004C4B83|.83F8 04       cmp eax,4
004C4B86|.7D 2F         jge short MP3Conve.004C4BB7            ;也是跳了
004C4B88|.8B45 F4       mov eax,
004C4B8B|.E8 64FBF3FF   call MP3Conve.004046F4
004C4B90|.8BD8          mov ebx,eax
004C4B92|.83FB 03       cmp ebx,3
004C4B95|.7F 20         jg short MP3Conve.004C4BB7
004C4B97|>8D4D E0       /lea ecx,
004C4B9A|.8BC3          |mov eax,ebx
004C4B9C|.C1E0 02       |shl eax,2
004C4B9F|.33D2          |xor edx,edx
004C4BA1|.E8 6A41F4FF   |call MP3Conve.00408D10
004C4BA6|.8B55 E0       |mov edx,
004C4BA9|.8D45 F4       |lea eax,
004C4BAC|.E8 4BFBF3FF   |call MP3Conve.004046FC
004C4BB1|.43            |inc ebx
004C4BB2|.83FB 04       |cmp ebx,4
004C4BB5|.^ 75 E0         \jnz short MP3Conve.004C4B97
004C4BB7|>8D45 F0       lea eax,
004C4BBA|.BA 444C4C00   mov edx,MP3Conve.004C4C44                ;ASCII "MP3Conv268d58k"
004C4BBF|.E8 08F9F3FF   call MP3Conve.004044CC
004C4BC4|.8D45 DC       lea eax,
004C4BC7|.50            push eax
004C4BC8|.B9 04000000   mov ecx,4
004C4BCD|.BA 01000000   mov edx,1
004C4BD2|.8B45 F0       mov eax,
004C4BD5|.E8 7AFDF3FF   call MP3Conve.00404954                   ;把MP3Conv268d58k头4个英文字母拿出来,就是MP3C
004C4BDA|.FF75 DC       push
004C4BDD|.68 5C4C4C00   push MP3Conve.004C4C5C
004C4BE2|.FF75 F8       push
004C4BE5|.8D45 D8       lea eax,
004C4BE8|.50            push eax
004C4BE9|.B9 05000000   mov ecx,5
004C4BEE|.BA 05000000   mov edx,5
004C4BF3|.8B45 F0       mov eax,
004C4BF6|.E8 59FDF3FF   call MP3Conve.00404954
004C4BFB|.FF75 D8       push                         ;把第5到第10位的MP3Conv268d58k拿出来,onv26
004C4BFE|.68 5C4C4C00   push MP3Conve.004C4C5C
004C4C03|.FF75 F4       push
004C4C06|.8BC7          mov eax,edi
004C4C08|.BA 06000000   mov edx,6
004C4C0D|.E8 A2FBF3FF   call MP3Conve.004047B4                   ;里面做一下排序,我的号是MP3C-16E6onv26-E656
004C4C12|.33C0          xor eax,eax
004C4C14|.5A            pop edx
004C4C15|.59            pop ecx
004C4C16|.59            pop ecx
004C4C17|.64:8910       mov dword ptr fs:[eax],edx
004C4C1A|.68 344C4C00   push MP3Conve.004C4C34
004C4C1F|>8D45 D8       lea eax,
004C4C22|.BA 0A000000   mov edx,0A
004C4C27|.E8 2CF8F3FF   call MP3Conve.00404458
004C4C2C\.C3            retn
004C4C2D   .^ E9 62F1F3FF   jmp MP3Conve.00403D94
004C4C32   .^ EB EB         jmp short MP3Conve.004C4C1F
004C4C34   .5F            pop edi
004C4C35   .5E            pop esi
004C4C36   .5B            pop ebx
004C4C37   .8BE5          mov esp,ebp
004C4C39   .5D            pop ebp
004C4C3A   .C3            retn


基本就是这样

一、把输入的用户名变成大写十六进制ASCII然后倒序
二、"MP3C-" + 倒序后的头4位 + "onv26-" + 倒序后的第5位至第8位就是注册码
三、输入的用户名少于4位的话貌似会有点处理。。没看了~~

例如输入vienna
ASCII "7669656E6E61"全部转成ASCII
ASCII "16E6E6569667"倒序
ASCII "MP3C-16E6onv26-E656"   加上默认的字符,搞定


#include <iostream>

using namespace std;
void PrintCapital(int iUN);

int main() {
        char chUserName = "";
        int iUserName;
        int i,iStrLen;

        cout << "输入用户名,中文好像不行~\n";
        cin >> chUserName;
        iStrLen = strlen(chUserName);

        for(i = 0;i < iStrLen;++i) {
                iUserName = chUserName;
        }
       
        cout << "MP3C-";
        PrintCapital(iUserName%16);
        cout << hex << iUserName/16;

        PrintCapital(iUserName%16);
        cout << hex << iUserName/16;
       
        cout << "onv26-";
       
        PrintCapital(iUserName%16);
        cout << hex << iUserName/16;
       
        PrintCapital(iUserName%16);
        cout << hex << iUserName/16;

}


void PrintCapital(int iUN) {
        switch(iUN) {
                case 0xA:
                        cout << "A";
                        break;
                case 0xB:
                        cout << "B";
                        break;
                case 0xC:
                        cout << "C";
                        break;
                case 0xD:
                        cout << "D";
                        break;
                case 0xE:
                        cout << "E";
                        break;
                case 0xF:
                        cout << "F";
                        break;

                default:
                        cout << iUN;
        }
}
--------------------------------------------------------------------------------
【经验总结】
也是昨天找来给自己入门分析算法的,适合新手。

--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!

                                                       2010年03月25日 下午 04:31:54

missviola 发表于 2010-3-25 18:08

彩笔新手进来学习了!话说大大这个代码着色的效果怎么弄的啊?

vienna 发表于 2010-3-25 18:20

回复 2# missviola

xTiNt着色
http://www.skycn.com/soft/16115.html

missviola 发表于 2010-3-25 18:45

回复 3# vienna


    具体怎么用来生成破文的啊,大大可否具体指点一下~~

vienna 发表于 2010-3-25 19:08

回复 4# missviola


    破文是看雪的破文生成器~贴代码就用刚刚的工具着色~
    http://www.pediy.com/tools/other/ctc/ctc.rar
    膜拜大大~~

kelibaba 发表于 2010-3-30 04:31

我来看看头像的。。

Hmily 发表于 2010-3-31 17:45

写的很好,加精鼓励,期待更多佳作!

hzmhzmhzm 发表于 2010-5-4 20:34

回复 1# vienna


    程序的算法真的是难点,明码的好办点.暗码比较有点难度.谢谢老师指点.

混混angel 发表于 2010-5-30 20:41

支持学习

落雪飞花 发表于 2011-2-11 14:27

大牛级别的啊!膜拜
页: [1] 2
查看完整版本: 新手简单算法分析 -- 超级MP3转换大师 V1.20 附上粗糙注册机