龙空技术网

软件逆向:IDA静态分析

binge 85

前言:

眼前我们对“逆向解析app”大体比较珍视,兄弟们都想要学习一些“逆向解析app”的相关内容。那么小编同时在网络上汇集了一些关于“逆向解析app””的相关资讯,希望同学们能喜欢,咱们快快来学习一下吧!

上篇文章《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##软件逆向##软件破解##二进制艺术大师#

标签: #逆向解析app