IDA
打开IDA首先会看到那标志性的笑容
打开文件,会看到这样的界面
左边是函数界面,列出程序里定义或调用的函数;右边是程序(汇编语言)界面,可以在文本视图(text view)、图表视图(graph view)、路径视图(proximity view)之间切换。
- Hex View 十六进制窗口
- Imports 导入函数窗口
- Struceures 结构体窗口
- Exports 导出函数窗口
- Enums 枚举窗口
- Strings 字符串窗口
双击左边函数列表的main函数可以进入到main函数中,
F5可以调出伪代码。
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // eax
void *v4; // esp
int v5; // eax
int v6; // eax
int v7; // ebx
int v8; // ebx
char v10[1000]; // [esp+18h] [ebp-94A0h]
char v11[2]; // [esp+400h] [ebp-90B8h]
char Source[4]; // [esp+403h] [ebp-90B5h]
int v13[1000]; // [esp+408h] [ebp-90B0h]
char Dest; // [esp+13A8h] [ebp-8110h]
char DstBuf; // [esp+1790h] [ebp-7D28h]
char Dst[20000]; // [esp+1B78h] [ebp-7940h]
char v17[1000]; // [esp+6998h] [ebp-2B20h]
char Buffer[10000]; // [esp+6D80h] [ebp-2738h]
int v19; // [esp+9490h] [ebp-28h]
int v20; // [esp+9494h] [ebp-24h]
int v21; // [esp+9498h] [ebp-20h]
int v22; // [esp+949Ch] [ebp-1Ch]
int v23; // [esp+94A0h] [ebp-18h]
int v24; // [esp+94A4h] [ebp-14h]
int j; // [esp+94A8h] [ebp-10h]
int i; // [esp+94ACh] [ebp-Ch]
v4 = alloca(v3);
__main();
memset(Buffer, 0, 0x2710u);
memset(v17, 0, sizeof(v17));
memset(Dst, 0, 0x4E20u);
memset(&DstBuf, 0, 0x3E8u);
memset(&Dest, 0, 0x3E8u);
printf(Format);
gets(Buffer);
v22 = strlen(Buffer);
if ( v22 % 3 )
{
v19 = v22 % 3;
v22 -= v22 % 3;
memset(v10, 0, sizeof(v10));
for ( i = 0; i < v22; ++i )
v10[v24++] = Buffer[i];
for ( i = 0; i < v22; ++i )
{
v21 = Buffer[i];
itoa(v21, &DstBuf, 2);
sprintf(&Dest, "%08s", &DstBuf);
strcat(Dst, &Dest);
}
v20 = 8 * v22 / 6;
for ( i = 0; i < v20; ++i )
{
v24 = 0;
for ( j = 6 * i; 6 * (i + 1) > j; ++j )
v17[v24++] = Dst[j];
v6 = b_to_o(v17);
v13[i] = v6;
}
v23 = i;
memset(v17, 0, 0x3E8u);
memset(Dst, 0, 0x4E20u);
if ( v19 == 1 )
{
v21 = Buffer[v22];
itoa(v21, &DstBuf, 2);
sprintf(&Dest, "%08s", &DstBuf);
strcat(Dst, &Dest);
strcpy(Source, "0000");
strcat(Dst, Source);
for ( i = 0; i <= 1; ++i )
{
v24 = 0;
for ( j = 6 * i; 6 * (i + 1) > j; ++j )
v17[v24++] = Dst[j];
v7 = v23++;
v13[v7] = b_to_o(v17);
}
v13[v23] = 64;
v13[v23 + 1] = 64;
}
else if ( v19 == 2 )
{
for ( i = 1; i <= v19; ++i )
{
v21 = Buffer[v22 - i];
itoa(v21, &DstBuf, 2);
sprintf(&Dest, "%08s", &DstBuf);
strcat(Dst, &Dest);
}
strcpy(v11, "00");
strcat(Dst, v11);
for ( i = 0; i <= 2; ++i )
{
v24 = 0;
for ( j = 6 * i; 6 * (i + 1) > j; ++j )
v17[v24++] = Dst[j];
v8 = v23++;
v13[v8] = b_to_o(v17);
}
v13[v23] = 64;
}
for ( i = 0; v20 + 4 > i; ++i )
putchar(boss[v13[i]]);
}
else
{
for ( i = 0; i < v22; ++i )
{
v21 = Buffer[i];
itoa(v21, &DstBuf, 2);
sprintf(&Dest, "%08s", &DstBuf);
strcat(Dst, &Dest);
}
v20 = 8 * v22 / 6;
for ( i = 0; i < v20; ++i )
{
v24 = 0;
for ( j = 6 * i; 6 * (i + 1) > j; ++j )
v17[v24++] = Dst[j];
v5 = b_to_o(v17);
v13[i] = v5;
}
for ( i = 0; i < v20; ++i )
putchar(boss[v13[i]]);
}
return 0;
}
可以看出,在IDA反汇编的过程中
- 原程序的变量名改变,由IDA重新从v1,v2…重新命名
- 部分函数的名称不变,但有些函数会变成非原名的函数调用,比如scanf(),printf()…
OD
od打开文件
程序会自动暂停。
左边是反汇编窗口,可以查看汇编语言;右边是寄存器窗口,可以查看各种寄存器。
右键,中文搜索引擎 ->搜索ASCII
看到“请输入待加密字符串”,双击点进去
看到 call 调用了好几个函数,通过名字可以看出他们的作用,再往下单步步入调试,可以看到每步的作用。