由base64加密解密程序的分析看IDA,OD的使用

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 调用了好几个函数,通过名字可以看出他们的作用,再往下单步步入调试,可以看到每步的作用。

猜你喜欢

转载自blog.csdn.net/weixin_43360152/article/details/87982674
今日推荐