能力值:
( LV4,RANK:50 )
|
-
-
10 楼
跟着前边两位分析的继续分析,第一次发贴错的地方或者分析不好的地方希望高手多多教俺。
00423C60 . 8B46 60 mov eax, dword ptr [esi+60]
00423C63 . 8B4E 5C mov ecx, dword ptr [esi+5C]
00423C66 . 50 push eax
00423C67 . 51 push ecx
00423C68 . C64424 1C 01 mov byte ptr [esp+1C], 1
00423C6D . E8 3EFDFFFF call 004239B0
00423C72 . 83C4 08 add esp, 8
00423C75 . 85C0 test eax, eax
00423C77 75 18 jnz short 00423C91 ;这个跳转很重要,根据比较eax,eax根据上边的函数出来,所以进上边的函数看看。
00423C79 . 6A 40 push 40
00423C7B . 68 38FE4900 push 0049FE38 ; sorry
00423C80 . 68 0CFE4900 push 0049FE0C ; invalid username or registration code
00423C85 . 8BCE mov ecx, esi
/************************************************************************************************/
004239B0 /$ 56 push esi
004239B1 |. 8B7424 0C mov esi, dword ptr [esp+C]
004239B5 |. 57 push edi
004239B6 |. 8B7C24 0C mov edi, dword ptr [esp+C]
004239BA |. 56 push esi
004239BB |. 57 push edi
004239BC |. E8 0FFCFFFF call 004235D0
004239C1 |. 83C4 08 add esp, 8
004239C4 |. 85C0 test eax, eax
004239C6 |. 75 11 jnz short 004239D9
004239C8 |. 56 push esi
004239C9 |. 57 push edi
004239CA |. E8 E1F6FFFF call 004230B0
004239CF |. 83C4 08 add esp, 8
004239D2 |. 85C0 test eax, eax ;这不是那个EAX吗?继续跟上边的函数4230b0
004239D4 |. 75 03 jnz short 004239D9
004239D6 |. 5F pop edi
004239D7 |. 5E pop esi
004239D8 |. C3 retn
/************************************************************************************************/
进入这个4230b0函数以后,前边对用户名和密码进行了好多严整,我想大概包括长度,数字,字母。一类的。
0042314D |. F7D1 not ecx
0042314F |. 49 dec ecx
00423150 |. 3BCD cmp ecx, ebp
00423152 |. 0F87 52010000 ja 004232AA ; 比较用户名和密码的长度
00423158 |. 8BFB mov edi, ebx
0042315A |. 8BCE mov ecx, esi
0042315C |. F2:AE repne scas byte ptr es:[edi]
0042315E |. F7D1 not ecx
00423160 |. 49 dec ecx
00423161 |. 0F84 43010000 je 004232AA ;又是比较,如果让他跳走,那就失败了。
00423167 |. 8BFA mov edi, edx
00423169 |. 8BCE mov ecx, esi
0042316B |. F2:AE repne scas byte ptr es:[edi]
0042316D |. F7D1 not ecx
0042316F |. 49 dec ecx
00423170 |. 0F84 34010000 je 004232AA ;又是比较,如果让他跳走,那就失败了。
00423176 |. 894424 38 mov dword ptr [esp+38], eax
0042317A |> 8B5424 38 /mov edx, dword ptr [esp+38]
0042317E |. 8A82 E0FC4900 |mov al, byte ptr [edx+49FCE0]
00423184 |. 8B15 D4424A00 |mov edx, dword ptr [4A42D4] ; Speed_DV.004A42E8
这个地方有3个跳转,如果跳转出去就是说你输入的用户名或者密码的长度不符合软件要求。(我这么认为。在分析分析就好了。)
继续下走。~~~~
0042319B |. F2:AE |repne scas byte ptr es:[edi]
0042319D |. F7D1 |not ecx
0042319F |. 49 |dec ecx
004231A0 |. C64424 2C 02 |mov byte ptr [esp+2C], 2
004231A5 |. 74 4F |je short 004231F6
004231A7 |> 8A042B |/mov al, byte ptr [ebx+ebp]
004231AA |. 33F6 ||xor esi, esi
004231AC |> 3A0475 78FC49>||/cmp al, byte ptr [esi*2+49FC78] ; 算法
004231B3 |. 74 08 |||je short 004231BD
004231B5 |. 46 |||inc esi
004231B6 |. 83FE 34 |||cmp esi, 34
004231B9 |.^ 7C F1 ||\jl short 004231AC
004231BB |. EB 11 ||jmp short 004231CE
004231BD |> 8A0C75 79FC49>||mov cl, byte ptr [esi*2+49FC79]
004231C4 |. 51 ||push ecx
004231C5 |. 8D4C24 38 ||lea ecx, dword ptr [esp+38]
004231C9 |. E8 7A550400 ||call 00468748
004231CE |> 83FE 34 ||cmp esi, 34
004231D1 |. 75 0E ||jnz short 004231E1
004231D3 |. 8B5424 18 ||mov edx, dword ptr [esp+18]
004231D7 |. 8D4C24 34 ||lea ecx, dword ptr [esp+34]
004231DB |. 52 ||push edx
004231DC |. E8 67550400 ||call 00468748
004231E1 |> 8BFB ||mov edi, ebx
004231E3 |. 83C9 FF ||or ecx, FFFFFFFF
这里就是算法的地方了。循环啊~~~晕晕的。继续下边看。。。
0042320A |. 52 |push edx
0042320B |. B9 54894A00 |mov ecx, 004A8954
00423210 |. E8 8F240400 |call 004656A4
00423215 |. 50 |push eax
00423216 |. 8D4C24 38 |lea ecx, dword ptr [esp+38]
0042321A |. C64424 30 03 |mov byte ptr [esp+30], 3
0042321F |. E8 39550400 |call 0046875D
00423224 |. 8D4C24 1C |lea ecx, dword ptr [esp+1C]
00423228 |. C64424 2C 02 |mov byte ptr [esp+2C], 2
0042322D |. E8 13510400 |call 00468345
00423232 |> 8B4424 20 |mov eax, dword ptr [esp+20]
00423236 |. 8B4C24 34 |mov ecx, dword ptr [esp+34]
0042323A |. 50 |push eax ; /Arg2
0042323B |. 51 |push ecx ; |Arg1
0042323C |. E8 B4F90200 |call 00452BF5 ; \Speed_DV.00452BF5
00423241 |. 83C4 08 |add esp, 8
呵呵,到了这里,你看看Arg2 和Arg1里边是什么~~~~?抄下来,试试能不能成功。~:)
引用名言:打完收工。从小语文不好,大家能理解就行了,最近西红柿贵,大家别丢我这啊。
总结一下:就是逆推.从eax入手.
|
能力值:
( LV4,RANK:50 )
|
-
-
12 楼
/*************************************************************/
/* username字符串输入的时候只能是大小写字母,长度小于16个字符。
o_out字符数组里边是存放最后的注册码。
*/
/*************************************************************/
char username[]="Second";
int nameLength=sizeof(username)-1;
if(nameLength>0x10)
{
AfxMessageBox("名称过长");
return;
}
//用到的一个全局数据区域。
BYTE b_49fc78[0x80]={
0x61, 0x43, 0x62, 0x78, 0x63, 0x69, 0x64, 0x49, 0x65, 0x41,
0x66, 0x58, 0x67, 0x4D, 0x68, 0x6B, 0x69, 0x45, 0x6A, 0x56,
0x6B, 0x5A, 0x6C, 0x65, 0x6D, 0x52, 0x6E, 0x79, 0x6F, 0x42,
0x70, 0x4B, 0x71, 0x64, 0x72, 0x54, 0x73, 0x53, 0x74, 0x50,
0x75, 0x57, 0x76, 0x6C, 0x77, 0x6A, 0x78, 0x44, 0x79, 0x48,
0x7A, 0x46, 0x41, 0x7A, 0x42, 0x71, 0x43, 0x70, 0x44, 0x4F,
0x45, 0x6B, 0x46, 0x67, 0x47, 0x59, 0x48, 0x6D, 0x49, 0x74,
0x4A, 0x61, 0x4B, 0x72, 0x4C, 0x51, 0x4D, 0x6E, 0x4E, 0x73,
0x4F, 0x75, 0x50, 0x55, 0x51, 0x47, 0x52, 0x4A, 0x53, 0x4C,
0x54, 0x4E, 0x55, 0x62, 0x56, 0x63, 0x57, 0x66, 0x58, 0x68,
0x59, 0x6F, 0x5A, 0x77, 0x41, 0x4D, 0x42, 0x00, 0x47, 0x6B,
0x65, 0x73, 0x56, 0x63, 0x6E, 0x72, 0x54, 0x70, 0x41, 0x51,
0x73, 0x58, 0x77, 0x4B, 0x00, 0x00, 0x00, 0x00
};
char o_out[100]={0};
int j=0;
do
{
for(int i=0;i<0x34;i++)
{
if(username[j]==b_49fc78[i*2])
{
o_out[j]=b_49fc78[i*2+1];
j++;
break;
}
}
}while(j<nameLength);
int otherLen=0x10-nameLength;
for(int x=0;x<otherLen;x++)
{
o_out[nameLength+x]=b_49fc78[x+0x6c];
}
AfxMessageBox(_T(o_out));
主要代码大概应该就是这样了.
加点限制就可以当注册机用了.
能力有限望大牛多多给予帮助.谢谢bithaha出的题.能有锻炼的机会.
|