IDA相关

IDA相关

看雪论坛搜索IDA Pro 7.7.220118 (SP1) 全插件绿色版
lazyida使用b站无名侠版本

在这里插入图片描述

pip install yara

pip install keystone==24.0.0.0

可以把ida目录里python site-package的内容复制到本机python的lib/site-packages里。

如果插件加载不出来,需要运行idapyswitch.exe,更改python版本,一般得python 3.8

1. 常用快捷键

查看

Alt+0:查看IDA输出,可以看到插件输出

Shift+F12:查看所有字符串

F5或Tab:查看C语言伪代码

Alt+T:查找Text,比如查找syscall

ctrl+F:搜索函数,字符串等

空格:切换图形视图&汇编视图

/:在反编译后伪代码的界面中写下注释

x:对着某个函数、变量按该快捷键,可以查看它的交叉引用

修改

n:改变量名或函数名

y:改变量类型

alt+k:修改sp指针

R:ascii码转字符

A:字符串的开头按下,则这段内存被解释成字符串

C:一段内存解释成代码

U:取消定义

p:在一段代码开头按下,创建函数

调试

F2:设置普通软件断点

右键->edit breakpoint 可设置硬件断点

F9:运行直到输入/断点/结束

F8:单步跳过

F7:单步步入

F4:运行到光标处

结构体

shift+F9 开结构体窗口

insert/delete 添加/删除结构体

d 添加结构体成员或切换结构体成员类型(db,dw,dd,dq)

a 添加结构体成员或切换结构体成员类型为数组

* 添加结构体成员或切换结构体成员类型为数组(允许数组成员为结构体类型)

n 结构体成员重命名

u 对最后一个结构体成员使用可删除该成员,对其它结构体成员使用则转为未定义类型

在这里插入图片描述

2. idapython使用

Settings->show All

在这里插入图片描述

show interpreter paths

在这里插入图片描述

在这里插入图片描述

import idc
v8=[]
addr1=0x6021C0
print(idc.here())
for i in range(36):
	v8.append(idc.get_wide_byte(addr1+4*i))
print(v8)

直接翻车

在这里插入图片描述

不过在ida里可以执行

在这里插入图片描述

functionCode
获取IDA界面地址
取当前地址idc.here() 或 idc.get_screen_ea()
获取最小地址(可以使用的)ida_ida.inf_get_min_ea()
获取最大地址(可以使用的)ida_ida.inf_get_max_ea()
获取所选范围的起始地址idc.read_selection_start()
获取所选范围的结束地址idc.read_selection_end()
获取地址的数值
以1字节为单位获取地址处的值idc.get_wide_byte(addr)
以2字节(字)的单位获取idc.get_wide_word(addr)
以4字节的单位获取idc.get_wide_dword(addr)
以8字节的单位获取idc.get_qword(addr)
判断是否是字节ida_bytes.is_byte
得到运行断点之前的寄存器的值ea=get_reg_value(“eax”)
修改指令数值
修改addr地址的值为value.每次修改1个字节ida_bytes.patch_byte(addr,value)
每次修改2个字节ida_bytes.patch_word(addr,value)
每次修改4个字节ida_bytes.patch_Dword(addr,value)
每次修改8个字节ida_bytes.patch_Qword(addr,value)
修改寄存器的值set_reg_value(value, “eip”)
汇编指令操作
获取地址处的汇编语句idc.GetDisasm(addr) 或 idc.generate_disasm_line(addr,flags)
获取指定地址位置的操作数.参数1是地址.参数2是操作数索引.如 mov ebp,esp中: 操作数1是ebp ,操作数2是esp mov则是汇编指令不是操作数idc.print_operand(addr,index)
获取汇编操作指令(如mov、add)idc.print_insn_mnem(addr)
段操作
获取段的名字(参数为当前的地址)idc.get_segm_name(addr)
获取段的开始地址idc.get_segm_start(addr)
获取段的结束地址idc.get_segm_end(addr)
获取第一个段idc.get_first_seg(addr)
获取下一个段idc.get_next_seg(addr)
返回一个列表记录所有段的地址idautil.Segments()
函数操作
获取指定地址之间的所有函数idautils.Functions(startaddr,endaddr)
获取指定地址的函数名idc.get_func_name(addr)
获取函数的注释get_func_cmt(addr, repeatable) repeatable:0/1 0是获取常规注释 1是获取重复注释
设置函数注释idc.set_func_cmt(ea, cmt, repeatable)
弹出框框要求用户进行选择 参数则是信息idc.choose_func(title)
返回: addr 距离函数的偏移形式idc.get_func_off_str(addr)
寻找函数结尾,如果函数存在则返回结尾地址,否则返回BADADDRidc.find_func_end(addr)
设置函数结尾ida_funcs.set_func_end(ea, newend) newend:新的结束地址
设置函数开头ida_funcs.set_func_start(addr, newstart)
设置地址处的名字idc.set_name(ea, name, SN_CHECK) Ex函数也使用set_name
获取首个函数idc.get_prev_func(ea)
获取下一个函数idc.get_next_func(ea)
数据查询
查找二进制找到返回地址没找到返回-1(BADADDR)idc.find_binary(ea, flag, searchstr, radix=16, from_bc695=False)
从ea开始寻找下一个数据地址ida_search.find_data(ea, sflag)
从ea开始寻找下一个代码地址ida_search.find_code(ea, sflag)
光标跳转到ea位置(不是eip!!!)ida_kernwin.jumpto(ea)
数据校验
获取标志ida_bytes.get_full_flags(ea)
判断是否为代码ida_bytes.is_code(f) f即标志
判断是否为数据ida_bytes.is_data(f)
交叉引用
获取地址处引用位置 A调用B 对B函数地址使用此函数则找到A调用 返回列表.遍历列表则可以找出所有引用位置. 参数1是ea也就是地址,参数2告诉IDA是否跟踪这些代码.idautils.CodeRefsTo(ea, flow)
返回ea的代码引用了何处的代码. 返回一个列表idautils.CodeRefsFrom(ea, flow)
返回一个列表告诉ea位置的数据被谁引用了idautils.DataRefsTo(ea)
告诉我们ea引用了谁.idautils.DataRefsFrom(ea)
动调脚本化
在指定的地址设置断点AddBpt(long Address)
获取一个寄存器的名称GetRegValue(string Register)
设置寄存器的值SetRegValue(long Value, string Register)
运行到指定的地址,然后停下RunTo(long Address)
解决python 脚本和调试器执行流异步执行(就是说idapython和断点会在汇编执行前执行,这段代码让它在汇编执行后再执行idapython)idaapi.step_into() GetDebuggerEvent(WFNE_SUSP, -1)
获取栈内数据(这样,运行到某个位置,获取esp/rsp的值,为栈顶,通过偏移可以获取相对应的栈内地址,然后使用Byte()/ Dword()来获取相关数据)RunTo(xxx) GetDebuggerEvent(WFNE_SUSP, -1) stack = GetRegValue(“esp”)

可以通过idapython设置条件断点,还原映射表

在这里插入图片描述
在这里插入图片描述

远程调试

先保证主机和虚拟机之间能互相ping通

把ida文件夹里的linux_server64传到kali上,运行一下
在这里插入图片描述
ida在程序开头处打断点
在这里插入图片描述

ida的设置参考如下

在这里插入图片描述然后启动即可

参考文章

  1. IDA Lazzaro

  2. 跟着Lantern学逆向之IDA python | nuoye’s blog (nuoye-blog.github.io)

  3. IDA Python 使用总结 _sky123_

  4. richar

TI IDA(Interactive Disassembler)是一款广泛应用于逆向工程的反汇编工具,主要用于分析和调试二进制代码。它能够将机器码转换为汇编语言,使开发人员和安全研究人员能够理解程序的内部结构和逻辑。以下是对该工具的功能介绍、使用指南以及常见问题解决方法的详细说明。 ### 功能介绍 TI IDA 提供了丰富的功能来支持逆向分析工作。其主要功能包括: - **反汇编能力**:IDA 能够解析多种处理器架构的二进制代码,将其转换为可读性较强的汇编代码。 - **图形化界面**:提供了一个直观的图形用户界面,允许用户浏览函数调用图、流程图等。 - **交叉引用分析**:自动追踪并显示变量、函数之间的调用关系,有助于快速定位代码逻辑。 - **插件扩展机制**:通过插件系统,可以增强或定制 IDA 的功能以满足特定需求[^4]。 - **脚本支持**:支持 IDC 和 Python 等脚本语言编写自动化任务,提高效率。 - **调试支持**:集成了远程调试器,可以直接对运行中的程序进行动态分析。 ### 使用指南 要开始使用 TI IDA 进行逆向分析,请遵循以下基本步骤: 1. **安装与配置**:下载对应操作系统的版本,并按照官方文档完成安装过程。设置好环境变量以便于命令行访问。 2. **加载目标文件**:启动 IDA 后选择需要分析的目标二进制文件。IDA 会提示你选择正确的处理器类型及其它选项。 3. **初步分析**:IDA 自动执行初始分析阶段,在此期间它将识别出导入表、导出表、字符串以及其他重要信息。 4. **导航与探索**:利用侧边栏中的视图如 Functions window 来跳转到感兴趣的函数;使用 Graph View 查看控制流图。 5. **修改与注释**:为关键位置添加注释帮助记忆,同时也可以重命名符号以更清晰地表达意图。 6. **利用插件增强功能**:根据具体需求寻找合适的插件安装,比如 Hex-Rays 反编译器插件可生成伪C代码进一步简化理解难度。 ```python # 示例 - 使用IDAPython创建一个简单的脚本来打印所有已知函数的名字 import idautils for funcAddr in idautils.Functions(): print("0x%08X %s" % (funcAddr, idc.GetFunctionName(funcAddr))) ``` ### 问题解决 当遇到TI IDA相关的问题时,可以尝试以下几个方向来进行排查和修复: - **加载失败**:检查输入文件是否损坏或者不被当前版本支持。确保选择了正确的处理器类型。 - **性能低下**:对于非常大的文件,考虑调整内存限制参数或者关闭不必要的视图窗口。 - **无法找到预期数据**:确认是否已经启用了全面扫描模式。有时默认情况下IDA可能不会立即展示所有的信息。 - **插件冲突**:如果发现某些功能异常,则可能是由于最近安装的新插件引起的。试着禁用所有非核心插件后重启IDA再测试一遍。 - **许可证问题**:商业版IDA需要有效的许可证才能解锁全部特性。若收到授权错误消息,请核实许可证状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cllsse

富✌您吉祥

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值