用IDA稍微分析了下,给大佬一个参考.如果发现有什么地方分析的有问题请指出
[C++] 纯文本查看 复制代码 int wmain()
{
FILE *v0; // eax
FILE *v1; // eax
char *v2; // eax
unsigned int username_lenth; // kr00_4
unsigned int password_lenth; // kr04_4
char *v5; // eax
unsigned int password_lenth_2; // kr08_4
unsigned int v34_lenth; // kr0C_4
char *v8; // esi
char *v9; // eax
clock_t v10; // ST34_4
char username; // [esp+18h] [ebp-118h]
char password; // [esp+7Ch] [ebp-B4h]
char v14; // [esp+7Dh] [ebp-B3h]
char v15; // [esp+7Fh] [ebp-B1h]
int 破解程序累计用时_字符串; // [esp+E0h] [ebp-50h]
int v17; // [esp+E4h] [ebp-4Ch]
int v18; // [esp+E8h] [ebp-48h]
int v19; // [esp+ECh] [ebp-44h]
__int16 v20; // [esp+F0h] [ebp-40h]
int 输入用户名_字符串; // [esp+F4h] [ebp-3Ch]
int v22; // [esp+F8h] [ebp-38h]
int v23; // [esp+FCh] [ebp-34h]
__int16 v24; // [esp+100h] [ebp-30h]
char v25; // [esp+102h] [ebp-2Eh]
int 输入密码_字符串; // [esp+104h] [ebp-2Ch]
int v27; // [esp+108h] [ebp-28h]
int v28; // [esp+10Ch] [ebp-24h]
char v29; // [esp+110h] [ebp-20h]
int 破解密码_字符串; // [esp+114h] [ebp-1Ch]
int v31; // [esp+118h] [ebp-18h]
__int16 v32; // [esp+11Ch] [ebp-14h]
char v33; // [esp+11Eh] [ebp-12h]
char 数组_v34; // [esp+120h] [ebp-10h]
char v35; // [esp+121h] [ebp-Fh]
char v36; // [esp+122h] [ebp-Eh]
int v37; // [esp+123h] [ebp-Dh]
int v38; // [esp+127h] [ebp-9h]
输入用户名_字符串 = -456463417;
v22 = -1009521720;
v23 = -71063621;
v24 = -17757;
v25 = 0;
输入密码_字符串 = -456463417;
v27 = -591139896;
v28 = -1163662398;
v29 = 0;
v35 = -128;
v37 = 1869623861;
v38 = 6646122;
破解密码_字符串 = -1177427267;
v31 = -339551037;
v32 = -17757;
v33 = 0;
破解程序累计用时_字符串 = -490879290;
v17 = -221197133;
v18 = -960701504;
v19 = -1312111661;
v20 = -17757;
printf("%s\n", &输入用户名_字符串);
v0 = _iob_func();
fgets(&username, 21, v0);
printf("%s\n", &输入密码_字符串);
v1 = _iob_func();
fgets(&password, 21, v1);
if ( username )
{
v2 = &username;
do
{
*v2 = (*v2 - 28) & 0x52;
++v2;
}
while ( *v2 ); // 将username的每一个字符都*username_chr=(*username_chr-28)&0x52;
}
username_lenth = strlen(&username);
if ( username_lenth < 0xC || username_lenth > 0x12 )// if(username_lenth<12 || username_lenth>18)
{
++password; // password的第一个字节+1
数组_v34 = 96; // v34='`'
}
else
{
++v14;
数组_v34 = 98; // v34='b'
}
password_lenth = strlen(&password);
if ( password_lenth <= 0xC || (v36 = 95, password_lenth >= 0x12) )// if(password_lenth<= 12||(v36 = 95, password_lenth>=18))
v36 = 93;
if ( !strcmp(&username, &password) ) // 如果username == password
{
if ( 数组_v34 ) // 如果v34不是空的,感觉这个if一定会成立
{
v5 = &数组_v34;
do
{
*v5 = (*v5 - 28) & 0x52;
++v5;
}
while ( *v5 ); // 将v34里的每一位都-28后&0x52
}
}
else
{
++v15; // 没用的语句?
v35 = 127; // v35 = backspace
}
if ( !strcmp(&username, &password) )
++v36;
else
--v36;
password_lenth_2 = strlen(&password);
v34_lenth = strlen(&数组_v34);
if ( password_lenth_2 <= v34_lenth ) // 如果password_lenth_2 <= v34_lenth
{
if ( password_lenth_2 < v34_lenth )
exit(-1); // 只有password_lenth_2 == v34_lenth才会继续执行
if ( 数组_v34 )
{
v9 = &数组_v34;
do
{
*v9 = (*v9 - 28) & 0x52;
++v9;
}
while ( *v9 ); // 执行和上面一样的算法
}
printf("%s", &破解密码_字符串);
printstr(&数组_v34); // 打印解密出来的字符串
}
else // 否则直接打印解密出来的字符串
{
printf("%s", &破解密码_字符串);
if ( 数组_v34 )
{
v8 = &数组_v34;
do
printf("%c", *v8++);
while ( *v8 );
}
printf("\n");
}
printf("%s", &破解程序累计用时_字符串); // 输入破解时间
v10 = clock();
printf("%.2f", (double)v10 / 1000.0);
printf("%c", 195);
printf("%c", 235);
printf("\n");
system("pause");
return 0;
} |