IDAPython详细版(二)

六:操作数

可以使用idc.get_openrand_typed(ea,n)得到操作数的类型。ea是地址,n是索引

这里有8种不同类型的操作数类

0_void 如果一个指令木有任何操作数它将返回0

0_reg 如果一个操作数是一个普通的寄存器将返回此类型。这个值在内部表示为1.

o_mem 如果一个操作数是直接内存引用,它将返回这个类型,这个值在内部表示为2.这种类型是有用的在date段查找引用。

o_phrase 这个操作数被返回则这个操作数包含一个基本的寄存器或者一个索引寄存器,这个值在内部表示为3.

o_displ这个操作数被返回则 操作数包含寄存器和一个位移值 这个位移值是一个整数,例如ox18。这是常见的当一条指令访问在一个结构体中。在内部,它表示为4的值。

o_for 这个操作数不是很常见当逆向x86或者x86_64 时 它是用来寻找操作数的访问立即数远地址的,它在内部表示为6。

o_near 不是很常见,寻找近地址 内部表示为7。

举个粒子:

当逆向可执行文件的内存dump时,操作数不能被识别为偏移

seg000:00BC1388 push 0Chseg000:00BC138A push 0BC10B8hseg000:00BC138F push [esp+10h+arg_0]seg000:00BC1393 call ds:_strnicmp

push 0bc10b8h是一个内存偏移量。如果我们将其改为数据类型,我们会看到字符串偏移量。如果要自动化,如下:

idc.get_inf_attr(INF_MIN_EA) 获得调用最小地址

idc.get_inf_attr(INF_MAX_EA)  获得调用最大地址

idc.op_plain_offset(ea, n, base)  将操作数转化为偏移量  第一个参数是地址,第二个参数n是操作数索引,第三个参数base是基地址

min = idc.get_inf_attr(INF_MIN_EA)max = idc.get_inf_attr(INF_MAX_EA)# for 每个已知函数for func in idautils.Functions():flags = idc.get_func_attr(func, FUNCATTR_FLAGS)# 跳过 library 和 thunk 函数if flags & FUNC_LIB or flags & FUNC_THUNK:continuedism_addr = list(idautils.FuncItems(func))for curr_addr in dism_addr:if idc.get_operand_type(curr_addr, 0) == 5 and (min < idc.get_operand_value(curr_addr, 0) < max):idc.OpOff(curr_addr, 0, 0)if idc.get_operand_type(curr_addr, 1) == 5 and (min < idc.get_operand_value(curr_addr, 1) < max):idc.op_plain_offset(curr_addr, 1, 0)

七:基本块

基本块是木有分支的直线代码序列,有一个单入口点和一个单出口点组成。

在分析程序的控制流时,基本块非常用。在使用函数的图分解视图时,通常可以观察到rda对基本块的表示。使用基本块进行分析的一些值得注意的粒子是 用于识别循环或者控制流混淆哦。当一个基本块将控制权转移到另一个块时,下一个块称为后继承块,前一个块称为predecessors。

.text:00401034 push esi.text:00401035 push edi.text:00401036 push 0Ah ; Size.text:00401038 call ds:malloc.text:0040103E mov esi, eax.text:00401040 mov edi, offset str_encrypted.text:00401045 xor eax, eax ; eax = 0.text:00401047 sub edi, esi.text:00401049 pop ecx.text:0040104A.text:0040104A loop: ; CODE XREF: _main+28↓j.text:0040104A lea edx, [eax+esi].text:0040104D mov cl, [edi+edx].text:00401050 xor cl, ds:b_key ; cl = 0.text:00401056 inc eax.text:00401057 mov [edx], cl.text:00401059 cmp eax, 9 ; index.text:0040105C jb short loop.text:0040105E push esi.text:0040105F push offset str_format.text:00401064 mov byte ptr [esi+9], 0.text:00401068 call w_vfprintf.text:0040106D push esi ; Memory.text:0040106E call ds:free.text:00401074 add esp, 0Ch.text:00401077 xor eax, eax ; eax = 0.text:00401079 pop edi.text:0040107A pop esi.text:0040107B retn.text:0040107B _main endp

以上函数分为三个块,异或从0x40104a开始。0x401050是异或的关键点。

ea = 0x0401050
f = idaapi.get_func(ea)
fc = idaapi.FlowChart(f, flags=idaapi.FC_PREDS)
for block in fc:             #这个函数的所有块print("ID: %i Start: 0x%x End: 0x%x" % (block.id, block.start_ea,block.end_ea))if block.start_ea <= ea < block.end_ea:print(" Basic Block selected")successor = block.succs()  #包含后续地址的生成器for addr in successor:print(" Successor: 0x%x" % addr.start_ea)pre = block.preds()  #包含前身地址的生成器for addr in pre:print(" Predecessor: 0x%x" % addr.end_ea)if ida_gdl.is_ret_block(block.type):  #返回块print(" Return Block")
>>> Successor: 0x40104a
>>> ID: 1 Start: 0x40104a End: 0x40105e
>>> Basic Block selected
>>> Successor: 0x40105e
>>> Successor: 0x40104a
>>> Predecessor: 0x40104a
>>> Predecessor: 0x40105e
>>> ID: 2 Start: 0x40105e End: 0x40107c
>>> Predecessor: 0x40105e
>>> Return Block

每个块包含以下属性:

id:函数中每块都有一个唯一索引,从0开始

type:有以下类型

    • fcb_normal:表示普通块,内部为0
    • fcb_indjump:是否以间接跳转结束,内部为1
    • fcb_ret:返回块,内部为2
    • fcb_cndret:是否为条件返回,内部为3
    • fcb_noret:无返回块,内部为4
    • fcb_enoret:不属于函数且没有返回的块,内部为5
    • fcb_extern:外部普通块,内部为6
    • fcb_error:通过函数结束来传递执行的块,内部为7
  • start_ea:基本块开始地址
  • end_ea:基本快结束地址
  • preds:一个函数,它返回一个包含所有前身地址的生成器
  • succs:一个函数,它返回包含所有后续地址的生成器。

     

八:结构

在编译过程中,结构布局,结构名称和结构类型将会被删除。

重构结构和正确标记结构成员可以极大帮助逆向过程。

下面是x86 shellcode中常见的代码片段。

完整代码遍历器结构包含 线程环境块(TEB) 和 进程环境快(PEB) 来找到kernell32.dll的基地址。

seg000:00000000 xor ecx, ecxseg000:00000002 mov eax, fs:[ecx+30h]seg000:00000006 mov eax, [eax+0Ch]seg000:00000009 mov eax, [eax+14h]

shellcode的下一步是遍历PE文件,查找window api。

由于要解析所有不同结构,除非对结构偏移量进行标记,否则很容易丢失。

使用下列代码标注对应结构名称:

idc.add_default_til 加载 类型库(TIL), TIL是IDA自己的c/c++格式头文件。它包含结构、枚举、联合和其他数据类型的定义。在IDA中可以通过shift+F11打开。idc.add_default_til会返回加载状态。

在TIL加载后,使用import_type将TIL各个定义导入带IDB中。

idc.import_type(idx, type_name),第一个参数是type的索引,每一个类型都有一个所以和id。-1代表这类型应该将该类型添加到IDA导入类型的末尾。

idc.get_struc_id 获得结构id

idc.op_stroff(ea, n, strid, delta)   偏移地址处增加名字。

第一个参数是包含将要被标记的偏移量的指令的地址(ea)。第二个参数是操作数,在下面的例子中,因为我们想要更改mov eax, fs:[ecx+30h]中的0x30标签,我们需要为第二个参数传递一个值1。第三个参数是类型id,第四个参数通常是0.

status = idc.add_default_til("ntapi")if status:idc.import_type(-1, "_TEB")idc.import_type(-1, "PEB")idc.import_type(-1, "PEB_LDR_DATA")ea = 2teb_id = idc.get_struc_id("_TEB")idc.op_stroff(ea, 1, teb_id, 0)ea = idc.next_head(ea)  #获得下一个指令地址peb_ldr_id = idc.get_struc_id("PEB_LDR_DATA")idc.op_stroff(ea, 1, peb_ldr_id, 0)ea = idc.next_head(ea)idc.op_stroff(ea, 1, peb_ldr_id, 0)

idc.del_struc(id) 删除结构

idc.add_struc(index, name, is_union)  增加结构  第一个参数是索引,-1添加到后面,第二个参数是结构名字,第三个参数是定义的新结构是否为union,0代表不是union。

后面的待更新:(没学会自己。。。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/598894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java: 写入数据到HBase

一、添加依赖 <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.hbase</groupId><art…

Prometheus-Alertmanage钉钉实现告警

获取钉钉的webhook地址 1、注册企业钉钉 a、注册企业钉钉 浏览器打开钉钉注册页面 填入手机号码&#xff0c;填入获取到的验证码&#xff0c;点注册 填入企业资料并注册 注册成功后&#xff0c;扫描二维码下载钉钉&#xff0c;如下图&#xff1a; b、添加机器人 管理后台 因…

Modbus RTU Learn

一、传输方式 采用主从应答方式进行 帧格式 功能码对应寄存器 演示01功能码 返回数据 0F 转换成二进制 02功能码 0F 转换成二进制 03功能码 读两个寄存器 04功能码 返回数据&#xff0c;读两个寄存器 05功能码 06功能码 10功能码 响应报文

在centos上安装WordPress 及创建配置文件无反应的解决方案

一、安装Apache服务 1.直接在命令行中输入以下命令即可,顺便安装编译组件&#xff1a; yum install -y httpd yum install -y httpd-devel2.启动Apache服务和设置Apache自启&#xff1a; 1 systemctl start httpd 2 systemctl enable httpd 3.添加一个测试页面&#xff0c;…

windows安装kafka以及kafka管理工具推荐

windows安装 1.下载地址 下载地址 下载最新版本的.tgz文件解压 2.修改配置 修改config目录下的zookeeper.properties中的dataDir属性 server.properties文件中的log.dir属性 3.启动zookeeper 进入到bin\windows\下的用cmd输入zookeeper-server-start.bat ..\..\config\zo…

5款实用的Win10软件,提高工作效率

​ 大家好&#xff0c;今天我来给大家推荐5款实用的Win10软件&#xff0c;它们可以帮助你提高工作效率&#xff0c;优化系统性能。 1.视频剪辑——DaVinciResolve ​ DaVinciResolve是一款集视频剪辑、调色、特效和音频后期制作于一体的专业软件。它拥有强大的图像处理技术&a…

Minitab 18安装包下载及安装教程

Minitab 18下载链接&#xff1a;https://docs.qq.com/doc/DUnRSaml6UHRpWFdn 1.选中下载好的安装包&#xff0c;鼠标右键解压到”Minitab 18“文件夹 2.选中”f4-mini181-setup.exe“&#xff0c;鼠标右击选择“以管理员身份运行” 3.点击“确定” 4.点击“下一步” 5.勾选我接…

android 分享文件

1.在AndroidManifest.xml 中配置 FileProvider <providerandroid:name"android.support.v4.content.FileProvider"android:authorities"com.example.caliv.ffyy.fileProvider"android:exported"false"android:grantUriPermissions"true…

宝宝的听力发育进程

小宝宝听力发育进程&#xff1a; 在母亲怀孕中晚期&#xff0c;小宝宝就有了听觉&#xff1a;6个月胎儿的听力已经和成年人相当了。 ◆ 出生0-7天的小宝宝会随声音变化产生不同反应&#xff0c;当在宝宝耳边拍巴掌或摇摇铃&#xff0c;宝宝可能会有惊跳反应&#xff0c;或吓哭…

查询json数组

步骤一&#xff1a;创建表格 首先&#xff0c;我们需要创建一个表格来存储包含JSON对象数组的数据。可以使用以下代码创建一个名为 my_table 的表格&#xff1a; CREATE TABLE my_table (id INT PRIMARY KEY AUTO_INCREMENT,json_data JSON ); 上述代码创建了一个包含两个列的…

SCADE—产品级安全关键系统的MBD开发套件

产品概述 随着新能源三电、智能驾驶等新技术的应用&#xff0c;汽车中衍生出很多安全关键零部件&#xff0c;如BMS、VCU、MCU、ADAS等&#xff0c;相应的软件在汽车中的比重越来越大&#xff0c;并且安全性、可靠性要求也越来越高。ANSYS主要针对安全关键零部件的嵌入式产品级软…

stable diffusion 基础教程-提示词之艺术风格用法

展现夕阳 golden hour, (rim lighting):1.2, warm tones, sun flare, soft shadows, vibrant colors, hazy glow, painterly effect, dreamy atmosphere阴影 chiaroscuro, (high contrast):1.2, dramatic shadows, bold highlights, moody atmosphere, captivating inte…

【六大排序详解】终篇 :冒泡排序 与 快速排序

终篇 :冒泡排序 与 快速排序 1 冒泡排序1.1 冒泡排序原理1.2 排序步骤1.3 代码实现 2 快速排序2.1 快速排序原理2.1.1 Hoare版本代码实现 2.1.2 hole版本代码实现 2.1.3 前后指针法代码实现 2.1.4 注意取中位数局部优化 2.1.5 非递归版本非递归原理代码实现 2.2 特性总结 谢谢阅…

室内效果图没有质感?外国大神这6个实用技巧,带你轻松掌握!

为了创作出高级有质感的效果图&#xff0c;我们需要注意构图、颜色、布光等多种因素&#xff0c;以打造出逼真的渲染效果。不过不要担心&#xff01;今天小编带来了国外知名设计师Arch Viz Artist在油管上分享的6个实用小技巧。看完带你轻松提升室内效果图的表现力&#xff01;…

WPS/PPT插件-大珩助手免费功能更新-特殊字符

扩展特殊格式下特殊字符&#xff0c;增加200多个常用特殊字符&#xff0c;可直接点击插入。 PPT大珩助手 1.7.6 1、提供素材库功能&#xff0c;可实现一键保存素材&#xff0c;支持对选中的形状&#xff0c;支持一键替换素材&#xff0c;保留原素材的尺寸和位置&#xff0c;…

RTT打印时间戳

官方的RTT VIEWER没有打印接收时间戳的功能&#xff0c;经过查找后发现可以有以下三种打印时间戳的方法。 第三方的RTT上位机ExtraPutty自己打印 第三方的RTT上位机 码云上有一个RTT_T2的仓库&#xff0c;基于python qt包写的画面&#xff0c;通过pylink来jlink通信。 优点…

Nginx 负载均衡集群 节点健康检查

前言 正常情况下&#xff0c;nginx 做反向代理负载均衡的话&#xff0c;如果后端节点服务器宕掉的话&#xff0c;nginx 默认是不能把这台服务器踢出 upstream 负载集群的&#xff0c;所以还会有请求转发到后端的这台服务器上面&#xff0c;这样势必造成网站访问故障 注&#x…

Linux GDB 调试

文章目录 一、Qemu二、Gdbvscode 调试 三、RootFs 一、Qemu qemu 虚拟机 Linux内核学习 Linux 内核调试 一&#xff1a;概述 Linux 内核调试 二&#xff1a;ubuntu20.04安装qemu Linux 内核调试 三&#xff1a;《QEMU ARM guest support》翻译 Linux 内核调试 四&#xff1a;…

基于SSM框架和Layui框架的管理系统

计算机毕业设计&#xff1a;打造安全、高效的信息管理系统在这个数字化时代&#xff0c;信息安全和高效管理是至关重要的。为了帮助学校或机构更好地管理和保护信息&#xff0c;我们为您设计了一套功能强大的信息管理系统。该系统利用先进的技术&#xff0c;结合MD5加密&#x…

使用Go语言的HTTP客户端进行并发请求

Go语言是一种高性能、简洁的编程语言&#xff0c;它非常适合用于构建并发密集型的网络应用。在Go中&#xff0c;标准库提供了强大的HTTP客户端和服务器功能&#xff0c;使得并发HTTP请求变得简单而高效。 首先&#xff0c;让我们了解为什么需要并发HTTP请求。在许多应用场景中…