逆向工程与IDA使用入门
在进行逆向工程分析时,IDA(Interactive DisAssembler)是一个非常强大的工具,它可以帮助我们将机器代码反编译为更易读的伪C代码。为了高效使用IDA进行分析,特别是对复杂的二进制文件进行逆向,需要一些必要的准备和基本操作熟悉。
准备工作
首先,你需要确保安装了以下环境和插件:
- Python 3.8.x:确保安装了正确版本的Python,并配置好环境变量,以便与IDA和相关插件兼容。
- LazyIDA:这是一个非常有用的插件,可以简化IDA的使用体验。你可以从GitHub下载并安装。
- Keypatch:这是另一个重要插件,依赖于
keystone-engine
,它可以帮助你在IDA中方便地进行汇编代码的修改。使用pip install keystone-engine
来安装依赖库。
基本操作
- 图形与文本模式切换:通过按下
空格键
可以在IDA中快速切换图形视图和文本视图,帮助你更好地理解代码结构。 - 窗口切换:使用
Tab
键可以在IDA的不同窗口间进行切换,如十六进制数据窗口和反汇编窗口。 - 字符串表:按下
Shift + F12
或通过菜单View -> Open subview -> Strings
可以打开字符串表,这是分析代码时非常重要的一步,可以帮助你快速定位感兴趣的字符串,并反向查找它们在代码中的引用。
高效分析技巧
- 快速查找:使用
Ctrl + F
可以在表格或代码中快速查找内容。 - 编辑十六进制数据:在IDA的Hex View中,可以右键进行编辑并应用更改。
- 交叉引用:点击符号名变为黄色,然后按
X
键可以展示所有对该符号的引用,帮助你更好地理解代码的调用关系。
具体案例分析
通过实际案例,如Base64编码函数的逆向工程,我们可以看到如何通过IDA分析并确认代码的功能。在这种情况下,sub_140008780
函数是一个标准的Base64编码实现。通过分析函数的结构和操作,你可以快速确认其功能并进行相关操作。
使用准备
安装python3.8.x版本,lazyida,keypatch
pip install keystone-engine
基本使用
按空格键,转换图形模式或者文本模式
光标定位,tab转换窗口
shift +f12 得到字符串表
view --> open subview --> strings
字符串表 ----》找到字符串(不一定全) --》 找到开源库 ---》逆向代码
CTRL + f 快速查找表格内容
IDA 数据窗口 Hex-View 右键编辑 十六进制数据 ---》右键 应用更改 --》麻烦
IDA 交叉引用
单击符号名---》变成黄色----》按下X---》展示所有引用
最后一次点击某view---》查表----》返回到刚才的某view
快速找到感兴趣的代码
字符串查找
重命名 N ----》有良好的命名习惯
追踪username 的编码过程,右键可修改显示或者隐藏类型转换
例如第二个函数可以解释成base64编码
__int64 __fastcall sub_140008780(__int64 a1, __int64 a2, int a3)
{
int v4; // [rsp+24h] [rbp+4h]
int v5; // [rsp+44h] [rbp+24h]
int v6; // [rsp+44h] [rbp+24h]
int v7; // [rsp+44h] [rbp+24h]
int v8; // [rsp+44h] [rbp+24h]
int v9; // [rsp+44h] [rbp+24h]
int v10; // [rsp+44h] [rbp+24h]
unsigned __int8 v11; // [rsp+64h] [rbp+44h]
unsigned __int8 v12; // [rsp+64h] [rbp+44h]
j___CheckForDebuggerJustMyCode(&unk_14015000E);
v4 = 0;
v5 = 0;
while ( v4 < a3 )
{
*(a2 + v5) = off_14013F000[0][(*(a1 + v4) >> 2) & 0x3F];
v6 = v5 + 1;
v11 = (16 * *(a1 + v4)) & 0x30;
if ( v4 + 1 >= a3 )
{
*(a2 + v6) = off_14013F000[0][v11];
v7 = v6 + 1;
*(a2 + v7++) = 61;
*(a2 + v7) = 61;
v5 = v7 + 1;
break;
}
*(a2 + v6) = off_14013F000[0][(*(a1 + v4 + 1) >> 4) & 0xF | v11];
v8 = v6 + 1;
v12 = (4 * *(a1 + v4 + 1)) & 0x3C;
if ( v4 + 2 >= a3 )
{
*(a2 + v8) = off_14013F000[0][v12];
v9 = v8 + 1;
*(a2 + v9) = 61;
v5 = v9 + 1;
break;
}
*(a2 + v8) = off_14013F000[0][(*(a1 + v4 + 2) >> 6) & 3 | v12];
v10 = v8 + 1;
*(a2 + v10) = off_14013F000[0][*(a1 + v4 + 2) & 0x3F];
v5 = v10 + 1;
v4 += 3;
}
*(a2 + v5) = 0;
return a2;
}
小总结,进去函数之后是复杂的c语言代码,可以直接扔给gpt反馈。
可以确认是base64,并且没有魔改
快捷键h ,进制转换
快捷键r,字符转换
IDA背景颜色修改
关闭,可以选择打包数据库,压倒一个文件里面