0%

ida_help

[TOC]

IDA_Pro使用技巧总结

IDA常见命名意义

sub 指令和子函数起点
locret 返回指令
loc 指令
off 数据,包含偏移量
seg 数据,包含段地址值
asc 数据,ASCII字符串
byte 数据,字节(或字节数组)
word 数据,16位数据(或字数组)
dword 数据,32位数据(或双字数组)
qword 数据,64位数据(或4字数组)
flt 浮点数据,32位(或浮点数组)
dbl 浮点数,64位(或双精度数组)
tbyte 浮点数,80位(或扩展精度浮点数)
stru 结构体(或结构体数组)
algn 对齐指示
unk 未处理字节
IDA中有常见的说明符号,如db、dw、dd分别代表了1个字节、2个字节、4个字节

ida python

https://www.hex-rays.com/products/ida/support/idapython_docs/
idaapi模块负责访问核心IDA API
idc模块负责提供IDA中的所有函数功能
idautils模块负责提供大量实用函数,其中许多函数可以生成各种数据库相关对象的python列表

指定judg函数的0-181范围的字节异或0xc

judge=0x600B00
for i in range(182):
addr=0x600B00+i
byte=get_bytes(addr,1)#获取指定地址的指定字节数
byte=ord(byte)^0xC
patch_byte(addr,byte)#打patch修改字节

在菜单栏中file–>script file,加载python脚本

IDA 详细插件

https://github.com/onethawt/idaplugins-list

Keypatch

heap-viewer 方便查堆

https://github.com/danigargu/heap-viewer

findcrypt-yara 查找加密

FRIEND

Flexible Register/Instruction Extender aNd Documentation
https://github.com/alexhude/FRIEND
重新打开 IDA,点击Edit–>Plugins就可以看到FRIEND插件了。
/Users/shellcodepanda/Documents/panda/ida_about/ida_plugin/FRIEND/Configurations/AArch64_armv8arm_k.xml
导入后,选择自己想要文档化的内容,并勾选下面三个勾,允许做处理器扩展、允许显示提示、允许显示函数概要。点击 OK。

C++filt

可以用于显示出c++中复杂的重载后的函数名称

strip

可用于elf去符号,去符号后仍然保持正常功能但增加了逆向的难度,出题恶人必备

比较插件

ida bindiff 补丁比较情况

BinDiff是二进制文件的比较工具,可帮助漏洞研究人员和工程师快速找到反汇编代码中的差异和相似之处。
使用BinDiff,您可以识别并隔离供应商提供的修补程序中的漏洞修复程序。您还可以在同一二进制文件的多个版本的反汇编之间移植符号和注释,或使用BinDiff收集代码被盗或专利侵权的证据。

IDA 对比 F5 显示差异 diaphora

Diaphora,最先进的免费开源二进制文件对比工具。
Diaphora是一个IDA插件,用来帮助二进制文件对比。他和其他的比较工具很类似,有一个著名的开源工具就叫做Zynamics BinDiff。还有其他的开源工具,比如DarunGrim或者是TurboDiff。但是从实际使用结果上来看,这些Diaphora能够进行更多的操作,并且能够更好地识别效果。它是在SyScan 2015期间发布的。
通过bindiff或者diaphora来对比不同是ida数据库,以获取函数的特征也是种很好的方法,这种方法在平时分析静态链接的程序也很有用。

签名比较

idb2pat.py+sigmake制作签名
idb2pat.py是火眼公司FireEye Labs Advanced Reverse Engineering团队编写的脚本,代码在GitHub上开源,该脚本主要通过CRC16的方式来计算每个函数块的特性,从而来识别不同的函数。这点也和IDA官方对签名文件的说明相符合,参见IDA F.L.I.R.T. Technology: In-Depth。

Rizzo插件生成数据库识别

关于rizzo,可以参看GitHub上的介绍Rizzo,同样也是一种对ida数据库进行保存然后提取信息进行对比的工具,收录于devttys0的ida脚本目录中。自己也进行了测试,速度还可以。
Create function signatures that can be shared amongst different projects. There are multiple sets of signatures that are generated:

脚本扩展Sark

Sark, (named after the notorious Tron villain,) is an object-oriented scripting layer written on top of IDAPython to provide ease of use, as well as additional tools for writing advanced scripts and plugins.

https://sark.readthedocs.io/en/latest/Installation.html

/usr/local/bin/pip.bak install -U git+https://github.com/tmr232/Sark.git@IDA-6.x#egg=Sarks

配色

https://blog.csdn.net/LPWSTR/article/details/78409727
https://github.com/zyantific/IDASkins
IDA的Edit菜单的Plugins子菜单中即可找到SkinPlugin选项,点击后在窗口中选择合适的主题
https://github.com/0xItx/ida_nightfall 汇编指令的颜色同一修改为了蓝色。

Data Visualization Plugin for IDA Pro

https://github.com/patois/IDACyber

bap-ida-python

bap也不是很出名哇
https://github.com/BinaryAnalysisPlatform/bap-ida-python

win_tools

PE tools:

是一组用于分析Windows系统中正在运行的进程和可执行文件的工具

ida watch

右键AddWatch或直接按Insert键,插入一个寄存器v0,注意大小写;
插入时我们需要指定变量的类型,如(String)v1,(char *)v2,(int)v3等形式类似于C++里的类型强转。这样我们才可以看到寄存器的值。

ida调试Dalvik显示局部变量
(Object*)v2
(String)v2
(char*)v2
(int)v2

比较二进制

/Users/shellcodepanda/Documents/panda/ida_about/ida_plugin/ida比较工具/diaphora_1.2.4_python2_ida_695_to_73/diaphora.py
导入后,选择生成sqlite 或者选择另一个进行比较,选择Use slow heuristics. 会比较好点。

ida7.0 中文

IDA string window显示中文 Options -> Stings -> Unicode C-style(16 bits)
ctrol+F5 会导出所有F5 文件 这样搜索中文?

IDA反编译会出现问题IDA sp-analysis failed 不能F5

http://bbs.pediy.com/thread-140002.htm
http://blog.csdn.net/dj0379/article/details/8699219
https://reverseengineering.stackexchange.com/questions/3197/fixing-the-stackpointer-in-ida-when-exception-handlers-are-used
http://blog.csdn.net/zhangmiaoping23/article/details/43492641
1.花指令patch

分析之后不难发现不能F5的原因,就在于跳转.
一个函数里面的一个跳转在未知的情况下会出现不能F5.

.text:00401675 pop ebp
.text:00401676 pop esi
.text:00401677 pop ecx
.text:00401678 retn
.text:00401678 sub_4015ED endp ; sp-analysis failed
.text:00401642 mov eax, offset loc_40164A
.text:00401647 jmp eax
用OD打开之后 改掉代码在保存,然后重新用IDA打开 F5就可以了,sp-analysis failed 也就消失了.
在OD里直接改成 JMP 40164A
  1. 413238:positive sp value has been found

    那我们就去找413238这个地址的地方,提示是说sp指针的值没有被找到,说明是这里出错了,那么就去修改sp的值,修改方法如下:

    也可以使用快捷键 Alt+K
    3.xxx: can analysis failed

    就尝试着把报错的地址的汇编语句改一哈,改成nop,就可以解决问题

IDA显示 thumb

下断要减1 thumb指令
用IDA反汇编NDK程序的时候 发现很多程序都会反汇编错误,那是因为IDA在对 ARM反汇编的时候模式不正确。因为在动态调试 的时候,IDA并没有去解析elf模块中的一些信息,
造成了模块信息丢失并且反汇编就会出现错误。 这时我们可以通过更改段寄存器的值来更改反汇编模式,
如下图,按 “ALT+G”会出现如下窗口,把 Value 的 0x00 改为 0x01
0为ARM 1为 thumb

IDA 快捷键_配置

ctrl+w:保存ida数据库
ctrl+s:选择某个数据段,直接进行跳转
ctrl+鼠标滚轮:能够调节流程视图的大小

配置IDA
一、ida.cfg
SHOW_AUTOCOMMENTS 表示是否自动生成汇编指令的注释
GRAPH_SHOW_LINEPREFIXES 表示是否在流程控制视图中显示地址
VPAGESIZE 表示内存调整参数,当处理非常大的输入文件时,IDA可能报告内存不足而无法创建新数据库,在这种情况下增大该参数,重新打开输入文件即可解决问题
OPCODE_BYTES 表示要显示的操作码字节数的默认值
INDENTATION 表示指令缩进的距离
NameChars 表示IDA支持的变量命令使用的字符集,默认是数字+字母还有几个特殊符号,如果需要添加就改变该参数
二、idagui.cfg
这个文件主要配置默认的GUI行为,键盘的快捷键等,这个很少需要修改,不做过多介绍。感兴趣的可以自己打开该文件观察,并不难懂,改改快捷键还是很容易的
三、idatui.cfg

;:在反汇编后的界面中写下注释
/ :在反编译后伪代码的界面中写下注释
\:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多

ctrl+shift+w:拍摄IDA快照
由于IDA不提供撤销的功能,如果你不小心按到某个键,导致ida数据库发生了改变,就得重新来过,所以要记得在经常操作的时候,加上快照:file–>take database snapshot
加完快照后,会生成一个新的ida数据库文件,本质上是有点像另存的操作
生成 b00ks_20200411145256.i64

windows–>reset desktop: 可以恢复初始ida布局

u:undefine,取消定义函数、代码、数据的定义

内存快照
创建完函数后,再将sub_401030函数重命名为reg_modify_401030,方便标记。然后,就到了本章重点,点击Debugger -> Take memory snapshot,就可以拍摄内存快照了。
拍完快照后,就无需在使用调试了,直接断开远程调试功能。断开远程后,因为拍摄了内存快照,所以off_40E000这些动态变量还是保留着之前的赋值,这就是内存快照的功能,相当于你不用在虚拟机里给样本解密/脱壳,就能直接通过内存快照分析解密/脱壳后的样本。

函数调用图
菜单栏中:view–>graphs–>Function calls(快捷键Ctrl+F12)

导入C语言声明的结构体
实际上,IDA有提供一个更方便的创建结构体的方法,就是直接写代码导入
在View–>Open Subviews–>Local Types中可以看到本地已有的结构体,在该窗口中右击insert
可以添加新的结构体:

ida调试
F7 单步步入,遇到函数,将进入函数代码内部
F8 单步步过,执行下一条指令,不进入函数代码内部
F4 运行到光标处(断点处)
F9 继续运行
CTRL+F2 终止一个正在运行的调试进程
CTRL+F7 运行至返回,直到遇到RETN(或断点)时才停止.

ALT+M 添加标签 记录位置
ctrol+M 查看标签
IDA ctrol F5 可以导出 函数名和 伪C代码
对光标处
C 解析为代码
D 解析为数据
A 解析为ASCII码字符串
U 解析为未定义的内容
ALT+T 搜索文本字符串
ALT+B 搜索十六进制字节序列

64位参数会在函数中存在两个参数! IDA中看到4个参数,改参数

signed int replace_GetRawKBSync_sub_1D060(long long a1, int a3_11, id *a4) IDA 中会有4个参数。

IDA 脚本 调用函数

http://www.hexblog.com/?p=113

Appcall.set_appcall_options(0x0)
api_dlopen = Appcall.proto(LocByName("_dlopen"),"void *__cdecl dlopen(const char *path, int mode);")
#print "api_dlopen = %x\n",hex(api_dlopen)
Message("Load ssl kill\n")
remote_sslkill_path = "/Users/panda/Documents/Github/ssl-kill-switch2/layout/SSLKillSwitch.framework/Versions/A/SSLKillSwitch"
api_dlopen(remote_sslkill_path, 1)
RefreshDebuggerMemory()

ida静态分析

IDA  静态分析
ar_38= -0x38
var_30= -0x30
var_28= -0x28
var_20= -0x20
var_18= -0x18
var_10= -0x10 注意这里是 - not +
STP X10, X11, [SP,#0xB0+var_60] 看这里 [SP,#0xB0+var_60] = x10 [SP,#0xB0+var_58]=x11
STP X9, X8, [SP,#0xB0+var_70]
。。。。
STUR X0, [X29,#var_18]
LDUR X8, [X29,#var_8]
LDUR X2, [X29,#var_18]
LDR X0, [SP,#0xB0+var_58]
LDR X1, [X0] ; decodeMachOHeader
MOV X0, X8
BL _objc_msgSend

android

导入ida看符号

$JADX_CONSOLE --output-dir-src java_dir app-release/classes.dex
python $make_sig -d java_dir -o method_sig.txt
IDA use py /Users/shellcodepanda/Documents/android_tools/ida_idc_py/jni_helper.py

dash ``ida_xxxx

先使用ida打开要分析的程序,等ida自动分析完成,本脚本会根据jni的调用的偏移值在ida中创建两个枚举类型,支持F5插件,
然后扫描用户的函数,根据汇编指令自动分析jni调用点,添加注释,如果遇到无法识别的指令,可以在偏移上面按m键手动设置。
如果未成功自动识别,请按m手动设置。
使用ALT+fn+F7 {ida_jni_path}

iOS

111

macos

222

参考

IDA Pro7.0使用技巧总结