好友
阅读权限25
听众
最后登录1970-1-1
|
本帖最后由 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,[local.1]
004C4C7B |. 8B83 20030000 mov eax,dword ptr ds:[ebx+320]
004C4C81 |. E8 DEFCF9FF call MP3Conve.00464964
004C4C86 |. 8B45 FC mov eax,[local.1]
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,[local.2]
004C4CBE |. 8B83 24030000 mov eax,dword ptr ds:[ebx+324]
004C4CC4 |. E8 9BFCF9FF call MP3Conve.00464964
004C4CC9 |. 8B45 F8 mov eax,[local.2]
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,[local.2]
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,[local.3]
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 [local.1],ecx
004C4A80 |. 53 push ebx
004C4A81 |. 56 push esi
004C4A82 |. 57 push edi
004C4A83 |. 8BF9 mov edi,ecx
004C4A85 |. 8955 FC mov [local.1],edx
004C4A88 |. 8B45 FC mov eax,[local.1]
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,[local.1]
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,[local.5]
004C4ABB |. 8B45 FC |mov eax,[local.1]
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,[local.5] ; ascii放入edx
004C4ACD |. 8D45 F8 |lea eax,[local.2]
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,[local.2] ; 放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,[local.2] ; 放7669656E6E61入eax
004C4AEF |. E8 00FCF3FF |call MP3Conve.004046F4
004C4AF4 |. 2BC3 |sub eax,ebx ; eax减ebx,c - 1,等于b放入eax
004C4AF6 |. 8B55 F8 |mov edx,[local.2] ; 放7669656E6E61入edx
004C4AF9 |. 8A1402 |mov dl,byte ptr ds:[edx+eax] ; 把edx+eax的那位7669656E6E61的ascii放入dl
004C4AFC |. 8D45 E8 |lea eax,[local.6]
004C4AFF |. E8 18FBF3FF |call MP3Conve.0040461C
004C4B04 |. 8B55 E8 |mov edx,[local.6]
004C4B07 |. 8D45 F4 |lea eax,[local.3]
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,[local.2]
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,[local.3] ; 16E6E6569667放入eax
004C4B24 |. E8 2BFEF3FF call MP3Conve.00404954 ; 这call好像拿了16E6E6569667的头4位16E6
004C4B29 |. 8D45 F4 lea eax,[local.3]
004C4B2C |. 50 push eax
004C4B2D |. B9 04000000 mov ecx,4
004C4B32 |. BA 05000000 mov edx,5
004C4B37 |. 8B45 F4 mov eax,[local.3]
004C4B3A |. E8 15FEF3FF call MP3Conve.00404954
004C4B3F |. 8B45 F8 mov eax,[local.2] ; 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,[local.2]
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,[local.7]
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,[local.7]
004C4B6D |. 8D45 F8 |lea eax,[local.2]
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,[local.3] ; 把第二个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,[local.3]
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,[local.8]
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,[local.8]
004C4BA9 |. 8D45 F4 |lea eax,[local.3]
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,[local.4]
004C4BBA |. BA 444C4C00 mov edx,MP3Conve.004C4C44 ; ASCII "MP3Conv268d58k"
004C4BBF |. E8 08F9F3FF call MP3Conve.004044CC
004C4BC4 |. 8D45 DC lea eax,[local.9]
004C4BC7 |. 50 push eax
004C4BC8 |. B9 04000000 mov ecx,4
004C4BCD |. BA 01000000 mov edx,1
004C4BD2 |. 8B45 F0 mov eax,[local.4]
004C4BD5 |. E8 7AFDF3FF call MP3Conve.00404954 ; 把MP3Conv268d58k头4个英文字母拿出来,就是MP3C
004C4BDA |. FF75 DC push [local.9]
004C4BDD |. 68 5C4C4C00 push MP3Conve.004C4C5C
004C4BE2 |. FF75 F8 push [local.2]
004C4BE5 |. 8D45 D8 lea eax,[local.10]
004C4BE8 |. 50 push eax
004C4BE9 |. B9 05000000 mov ecx,5
004C4BEE |. BA 05000000 mov edx,5
004C4BF3 |. 8B45 F0 mov eax,[local.4]
004C4BF6 |. E8 59FDF3FF call MP3Conve.00404954
004C4BFB |. FF75 D8 push [local.10] ; 把第5到第10位的MP3Conv268d58k拿出来,onv26
004C4BFE |. 68 5C4C4C00 push MP3Conve.004C4C5C
004C4C03 |. FF75 F4 push [local.3]
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,[local.10]
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[20] = "";
int iUserName[20];
int i,iStrLen;
cout << "输入用户名,中文好像不行~\n";
cin >> chUserName;
iStrLen = strlen(chUserName);
for(i = 0;i < iStrLen;++i) {
iUserName[i] = chUserName[i];
}
cout << "MP3C-";
PrintCapital(iUserName[iStrLen-1]%16);
cout << hex << iUserName[iStrLen-1]/16;
PrintCapital(iUserName[iStrLen-2]%16);
cout << hex << iUserName[iStrLen-2]/16;
cout << "onv26-";
PrintCapital(iUserName[iStrLen-3]%16);
cout << hex << iUserName[iStrLen-3]/16;
PrintCapital(iUserName[iStrLen-4]%16);
cout << hex << iUserName[iStrLen-4]/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 |
|