前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

软件逆向:IDA静态分析

qiguaw 2025-01-13 17:09:54 资源文章 32 ℃ 0 评论

上篇文章《x64dbg插件Scylla脱壳修复》已经详实的介绍了软件保护壳如何进行内存dump和IAT修复。完成上操作后,软件的保护壳被剥离,接下来的工作就可以对程序进行逆向分析了。

软件逆向分析少不了静态分析和动态调试分析的组合。这篇文章介绍下软件逆向静态分析。

有些简单的程序借助强大的静态分析工具基本上能还原出编程语言逻辑,有编程经验的可以很快弄清楚这些代码的用意。

通过《外壳扫描器》的简单指纹特征扫描,可以根据编译器来推断出程序类型,根据编译器描述,原生的PE程序,可以使用IDA进行反编译和静态分析。(如果是.net程序要使用dnspy工具)。

程序运行如下,根据图标和UI风格判断是MFC程序。

可以看出这个是一个逆向练习CrackMe程序,用来锻炼逆向工作者的逆向分析能力的。

输入名字和随意一组注册码,测试如下。

0x01 如何使用IDA

在程序上鼠标右键打开右键菜单,使用IDA pro(32位)打开。

一通确认过后,IDA会自动分析程序,当分析完毕之后会停留在start函数上。

0x02 IDA强大的F5功能。

这篇文章的重心是介绍IDA静态分析,如何定位注册算法这里不做赘述。简单的提示下可以通过导入函数MessageBoxA函数交叉引用很快定位到验证逻辑。

以下是注册码验证汇编代码逻辑。

读懂这些汇编需要专业知识,大部分程序员是看不懂汇编的。

不要气馁如果新手看不懂汇编,可以试一试IDA的F5插件,在汇编窗口中直接按F5神奇的一幕出现了。汇编代码直接被翻译成了C代码。

int __thiscall sub_401C20(_DWORD *this)
{
  unsigned int v2; // kr14_4
  CHAR *v3; // edi
  int v4; // eax
  signed int v5; // esi
  signed int v6; // edi
  int v8; // esi
  int *v9; // edi
  int v10; // eax
  DWORD Type; // [esp+10h] [ebp-608h] BYREF
  DWORD cbData; // [esp+14h] [ebp-604h] BYREF
  HKEY phkResult; // [esp+18h] [ebp-600h] BYREF
  int v14; // [esp+1Ch] [ebp-5FCh] BYREF
  char v15; // [esp+20h] [ebp-5F8h] BYREF
  char v16; // [esp+24h] [ebp-5F4h] BYREF
  char v17; // [esp+28h] [ebp-5F0h] BYREF
  int v18[4]; // [esp+2Ch] [ebp-5ECh] BYREF
  CHAR String[500]; // [esp+3Ch] [ebp-5DCh] BYREF
  char Str[500]; // [esp+230h] [ebp-3E8h] BYREF
  char Buffer[500]; // [esp+424h] [ebp-1F4h] BYREF

  memset(String, 0, sizeof(String));
  memset(Buffer, 0, sizeof(Buffer));
  memset(Str, 0, sizeof(Str));
  sub_411207(String, 100);
  sub_411207(Buffer, 100);
  strcpy(Str, String);
  _strrev(Str);
  strcat(String, Str);
  RegOpenKeyA(HKEY_LOCAL_MACHINE, aSoftwareMicros, &phkResult);
  Type = 1;
  cbData = 256;
  RegQueryValueExA(phkResult, ValueName, 0, &Type, (LPBYTE)Str, &cbData);
  Type = 1;
  strcat(String, Str);
  cbData = 256;
  RegQueryValueExA(phkResult, aRegisteredowne, 0, &Type, (LPBYTE)Str, &cbData);
  strcat(String, Str);
  v2 = strlen(String) + 1;
  sub_4016E0(v18);
  memset(&String[v2 - 1], 0, 0x4Cu);
  v3 = &String[v2 + 75];
  *(_WORD *)v3 = 0;
  v3[2] = 0;
  v4 = 64 - (v2 & 0x3F);
  String[v2 - 1] = 0x80;
  if ( v4 <= 7 )
    v4 += 64;
  v5 = v4 + v2;
  v6 = 0;
  for ( *(int *)((char *)&v18[2] + v4 + v2) = 8 * strlen(String); v6 < v5; v6 += 64 )
    sub_401700(&String[v6], v18);
  v18[0] = LOWORD(v18[0]);
  if ( sscanf(Buffer, "%lx%lx%lx%lx", &v14, &v15, &v16, &v17) != 4 )
    return sub_4100A8(this, Text, Caption, 0x30u);
  v8 = 0;
  v9 = &v14;
  do
  {
    sub_401B90(v9, 195936478 / (v8 + 80));
    ++v8;
    ++v9;
  }
  while ( v8 < 3 );
  v10 = 0;
  while ( *(int *)((char *)&v14 + v10 * 4) == v18[v10] )
  {
    if ( ++v10 >= 4 )
      return sub_4100A8(this, aManYouReGoodEn, aWelcome, 0x40u);
  }
  return sub_4100A8(this, aBetterLuckNext, Caption, 0x30u);
}

详实的API调用过程,参数,甚至将数字翻译成了宏。某些算法细节也描述的明明白白的。


如何关注作者,字节系列搜索binge即可,抖音号:binge_code

#binge##调试工具##IDA静态分析##黑客技术##hacker##软件逆向##软件破解##二进制艺术大师#

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表