逆向神器之IDA的使用
1、简介
Interactive交互式的 Disassembler反汇编程序 expire到期
IDA Pro全称是交互式反汇编器专业版(Interactive Disassembler Professional)简称“IDA”,是Hex-Rays公司出品的一款交互式反汇编工具,是目前最棒的一个静态反编译软件,为众多0day世界的成员和ShellCode安全分析人士不可缺少的利器。IDA Pro具有强大的功能,但操作较为复杂,需要储备很多知识,同时,它具有交互式、可编程、可扩展、多处理器等特点,可以通过Windows或Linux、MacOS平台来分析程序, 被公认为最好的逆向工程利器之一。
IDA Pro已经成为分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。它支持数十种CPU指令集其中包括Intel x86、x64、MIPS、PowerPC、ARM、Z80、68000、c8051等等。
早期的0day表示在软件发行后的24小时内就出现破解版本,现在我们已经引申了这个含义,只要是在软件或者其他东西发布后,在最短时间内出现相关破解的,都可以叫0day。 0day是一个统称,所有的破解都可以叫0day。 0day是一种自发的网络运动而已,Warez是对破解的泛称。
软件安装包:链接:https://pan.baidu.com/s/1GKAfmtQB6IlclPIfAqHPrQ 提取码:wggb https://hex-rays.com/ida-free/#download
2、示例程序
https://www.cnblogs.com/endv/p/6847843.html
#include <stdio.h>
int main()
{
int n;
scanf ("%d", &n);
if (n > 0) {
printf("a > 0"); //后面会用IDA Pro把'a'改成'n'
} else {
printf("n < 0");
}
return 0;
}
编译成exe执行文件:g++.exe test.cpp -o test.exe
3、打开IDA软件
load a new file直接点击ok即可。
上面的颜色表示的是对不同代码块使用不同的颜色进行区分,我们可以直接点击相应的颜色块进行不同代码块的定位。 下面一行有对颜色的说明。 蓝色:表示代码段。 棕色:表示数据段。 红色:表示内核。
左边是该程序的函数表,一般默认选择_main函数。
Open exports window:打开导出窗口 Open import window:打开导入窗口 Open names window:函数和参数的命名列表 Open functions window:程序调用的所有函数窗口 Open strings window: 打开字符串显示窗口,会列出程序中的所有字符串,该窗口有助于你通过程序的运行输出逆向找出对应的代码片断。
左侧窗口为函数列表窗口,右侧窗口为IDA反汇编所得的汇编代码,最下侧窗口为文件在反汇编过程中的信息。 File:用于打开、新建、装载、保存、关闭一个文件或是数据库 Edit:用于编辑反汇编代码 Jump:用于跳转到某个位置、地址或是一个窗口 Search:用于搜索代码段、数据、错误等等 View:用于显示文件内容的显示方式 Debugger:调试器,集成在IDA中 Lumina:对元数据进行各种操作 Options:可以进行一些个性化的设置 Windows Help
4、反汇编常用功能
IDA Pro切换图形或代码模式 1、空白处 2、右键选择Text View/Graph View切换
安装完成后有32位和64位,如果需要反编译出C代码需要对应版本。
- load a new file直接点击ok即可。
- view->open subviews->strings
- ctrl+f搜索相应的字符串
- 双击搜索结果
- 选择db前面的变量右键jump to xref to operand....
- F5一键搞定反编译成C代码。
5、以反汇编kvj2534.dll为例
文件路径:D:\Github\Storage\windows\IDA\kvj2534.dll 软件版本:IDA v7.5.201028
打开ida64.exe,Load a new file。 出现三个选择题(就选择1吧): 1.Portable executable for 80386(PE)[pe64.dll] 2.MS-DOS executable(EXE)[dos64.dll] 3.Binary file
Alt+T搜索strings:ERR_BUFFER_EMPTY(还是打开view->open subviews->strings窗口搜索吧)
双击跳转到IDA View-A,选择db字段前面,然后按X
选择后按F5(查看伪代码),报错请使用ida,而不是ida64。重新来过
结果F5无法跳转到代码。。。。
6、判断一个exe文件是否使用qt语言
一看是就想到使用IDA软件进行判断,基本上没有找到qt相关的语言,找到一些windows开发相关的语言,就误认为使用的是windows的开发界面,结果这个exe文件居然能直接解压。其实在双击运行的时候这个exe文件也会解压到temp目录下面去。 直接使用7z软件解压exe,可以看见里面有很多qt组件,也可以看见很多微软相关的dll文件。 使用c语言的qt写的界面程序大约在30MB左右,python则是在70MB左右。
7、利用ida软件+hex editor Neo软件改变二进制文件变量值
https://developer.aliyun.com/article/1271409
测试文件:D:\Github\Storage\c++\ida\Linux\modify_var.c
- ida软件定位位置,界面左侧有一个 Function name 的窗口,点击右键,选择“Quick filter”,然后输入函数名字即可
- 进入 大概的变量 后,直接按 F5 键,即可将其转化为 C 语言实现的伪代码,然后就可以正常阅读
- 用鼠标选中 #2,然后切换到 Hex View-1 窗口,查看其十六进制的表示
- 用 hex editor Neo 打开 二进制 文件,用 ctrl+F 调出搜索框,选择hex,粘贴刚刚拷贝的十六进制串,定位到对应的代码
直接使用ida软件修改十六进制但是保存不了(点击编辑->修补文件->修补程序应用到输入文件),说权限不足,怀疑是不支持修改Linux的二进制文件。 https://blog.csdn.net/Onlyone_1314/article/details/108697155
8、利用ida软件改变exe文件变量值
测试文件:D:\Github\Storage\c++\ida\Windows\StudyWindowsProgram.cpp
我编译了一个exe文件,然而ida软件在选择【MS-DOS executable(EXE)[dos.dll]】时却解析不了。 后面发现选择【portable executable for 80386(PE)[pe.dll]】才成功了。
注意加载pdb文件的重要性,不加载pdb文件,那么有些函数名将会使用sub_xxxx代替,有了pdb文件就可以解析出来,如printf函数。 另外在VS软件-》项目右键-》属性-》C/C++-》优化-》优化-》已禁用(/Od)才能看见更多的自定义函数。
- ida软件定位位置,界面左侧有一个 Function name 的窗口,点击右键,选择“Quick filter”,然后输入example函数名字即可
- 进入 大概的变量42h 后,直接按 F5 键,即可将其转化为 C 语言实现的伪代码,然后就可以正常阅读
- 用鼠标选中 66,然后切换到 Hex View-1 窗口,查看其十六进制的表示
- 右键-》Edit,输入44
- 右键-》Apply changes
- 点击编辑->修补文件->修补程序应用到输入文件(Edit->Patch program->Apply patchs to input file)
9、x64dbg动态调试逆向神器
10、含金量还在上升
自己写的exe文件不清楚是否合入了自己的改动,可以通过IDA软件逆向分析,找到修改的地方,通过伪代码查看是否合入了自己的修改。
- 选择【portable executable for 80386(PE)[pe.dll]】
- 提示是否需要根据exe文件内置的符号表路径加载符号表(no将会搜索不到函数名)
- 界面左侧有一个 Function name 的窗口,点击右键,选择“Quick filter”,然后输入函数名字找到修改函数
- 按 F5 键即可看见伪代码(注意一定要加载符号表,否则可能连函数名都找不到,符号表不全伪代码也无法看清楚写的什么)
void __thiscall WaveRecorder::init_ring(WaveRecorder *this, unsigned int samples_per_sec, unsigned int frame_bytes, unsigned int frame_align)
{
unsigned __int8 *v5; // [esp+10h] [ebp-Ch]
unsigned int count; // [esp+14h] [ebp-8h]
unsigned __int8 *dst; // [esp+18h] [ebp-4h]
this->_ring_size = 500 * samples_per_sec / 0x3E800;
this->_ring_item_size = frame_bytes + 32;
count = this->_ring_item_size * this->_ring_size;
this->_ring = (unsigned __int8 *)operator new[](count);
dst = this->_ring;
v5 = &dst[count];
while ( dst != v5 )
{
memset(dst, 0, this->_ring_item_size);
*((_DWORD *)dst + 1) = frame_bytes;
*(_DWORD *)dst = dst + 32;
dst += this->_ring_item_size;
}
}
其中的500就是我需要修改的全局宏变量,被我修改成50了。
提示需要打开libusbtray.dll、SSLEAY32.dll、LIBEAY32.dll、log_base.dll文件,但是这些都不是关键,关键的还是符号表。 注意关键字,anyway打开exe文件中符号表路径,打开错误的符号表会导致伪代码是错误的,如:
// positive sp value has been detected, the output may be wrong!
void __usercall WaveRecorder::init_ring(WaveRecorder *this@<ecx>, int a2@<ebp>)
{
((void (__thiscall *)(_DWORD))this->_client->remove_event_source)(*(_DWORD *)(*(_DWORD *)(a2 - 24) + 20));
waveInClose(*(HWAVEIN *)(*(_DWORD *)(a2 - 24) + 24));
*(_DWORD *)(a2 - 16) = *(_DWORD *)(*(_DWORD *)(a2 - 24) + 28);
((void (__cdecl *)(_DWORD))unk_7B88AA)(*(_DWORD *)(a2 - 16));
*(_DWORD *)(a2 - 20) = *(_DWORD *)(*(_DWORD *)(a2 - 24) + 48);
((void (__cdecl *)(_DWORD))unk_7B88AA)(*(_DWORD *)(a2 - 20));
*(_BYTE *)(a2 - 4) = 0;
((void (__thiscall *)(int))unk_8F7890)(*(_DWORD *)(a2 - 24) + 4);
*(_DWORD *)(a2 - 4) = -1;
((void (__thiscall *)(_DWORD))loc_4397E0)(*(_DWORD *)(a2 - 24));
}
另外特别注意的是,手动加载符号表时,注意路径不能含有中文,否则会加载失败。如果符号表不匹配,会提示PDB signature and/or age does not match the input file. 有时会提示该地址无法访问,原因是IDA还没有分析到这里来,需耐心等待一段时间后再查看伪代码。