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 0Ch
 
seg000:00BC138A push 0BC10B8h
 
seg000: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:
 
    continue
 
  dism_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, ecx
 
seg000: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 = 2
 
   teb_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。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

空间域图像增强之直方图均衡的python代码实现——冈萨雷斯数字图像处理

原理 直方图&#xff1a; 图像的直方图是一个图像中像素强度值分布的图表。 对于灰度图像&#xff0c;直方图展示了每个灰度级出现的频率。 直方图均衡步骤&#xff1a; 计算累积分布函数&#xff08;CDF&#xff09;&#xff1a;首先&#xff0c;计算图像的直方图&#xff0…

案例分析——如何优化跨境直播网络

跨境直播 风口已至 这些年越来越多商家加入直播带货行列&#xff0c;各种玩法日渐成熟。而TikTok作为当前国外最火爆的直播平台&#xff0c;不少卖家都会定期做TikTok直播引流&#xff0c;但时常会面临着远程访问导致直播画面模糊、卡顿掉线、延迟高&#xff0c;甚至可能限流黑…

如何使用 Python、Node.js 和 Go 创建基于 YOLOv8 的对象检测 Web 服务

1. 介绍 这是有关 YOLOv8 系列文章的第二篇。在上一篇文章中我们介绍了YOLOv8以及如何使用它&#xff0c;然后展示了如何使用 Python 和基于 PyTorch 的官方 YOLOv8 库创建一个 Web 服务来检测图像上的对象。 在本文中&#xff0c;将展示如何在不需要PyTorch和官方API的情况下…

LeetCode(38)外观数列⭐⭐

「外观数列」是一个整数序列&#xff0c;从数字 1 开始&#xff0c;序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列&#xff1a; countAndSay(1) "1"countAndSay(n) 是对 countAndSay(n-1) 的描述&#xff0c;然后转换成另一…

【LeetCode】20. 有效的括号(Deque的Stack用法)

今日学习的文章链接和视频链接 leetcode题目地址&#xff1a;20. 有效的括号 代码随想录题解地址&#xff1a;代码随想录 题目简介 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效…

阿里云服务器 使用Certbot申请免费 HTTPS 证书及自动续期

前言 Certbot是一款免费且开源的自动化安全证书管理工具&#xff0c;由电子前沿基金会&#xff08;EFF&#xff09;开发和维护&#xff0c;是在Linux、Apache和Nginx服务器上配置和管理SSL/TLS证书的一种机制。Certbot可以自动完成域名的认证并安装证书。 一、 安装软件 1.1…

C语言编译器(C语言编程软件)完全攻略(第一部分:什么是编译器?)

介绍常用C语言编译器的安装、配置和使用。 一、什么是编译器&#xff1f; 我们平时所说的程序&#xff0c;是指双击后就可以直接运行的程序&#xff0c;这样的程序被称为可执行程序&#xff08;Executable Program&#xff09;。在 Windows 下&#xff0c;可执行程序的后缀有…

时代变革,亿发进销存引领批发业转型:从‘瞎盲’到高效盈利

2024年&#xff0c;许多传统批发老板们忙得不可开交。抱怨生意难做、年关难熬。 有些老板为了降低成本&#xff0c;开除了一两个店员&#xff0c;结果却发现自己要同时盯着店&#xff0c;又得亲自开单&#xff0c;一天中至少有10个小时被拴在店里&#xff0c;就是为了减少支出…

准博士生教你如何阅读论文

AI方向如何阅读论文 绪论会议整理一篇论文的主要结构AbstractIntroductionRelated WorkApproach(framework名称亦可)ExperimentsImplementation detailsResultsAblation StudyDiscussion Conclusion 如何阅读多篇论文怎样读/写related work怎样读approach结语 绪论 作为一位工…

Linux系统安全

作为一种开放源代码的操作系统&#xff0c;linux服务器以其安全、高效和稳定的显著优势而得以广泛应用。 账号安全控制 用户账号是计算机使用者的身份凭证或标识&#xff0c;每个要访问系统资源的人&#xff0c;必须凭借其用户账号 才能进入计算机.在Linux系统中&#xff0c;提…

Unity之摄像机

一、摄像机类型 1.1 透视摄像机 透视摄像机有近大远小的效果&#xff0c;与我们在现实中看到的效果相同。所以当两个同样大小的物体到摄像机的距离不同时我们看到的大小也会不同。Unity的3D项目中默认使用的就是透视摄像机。 1.2 正交摄像机 正交摄像机没有近大远小的效果&am…

Linux 修改主机名称并通过主机名称访问服务器

一、命令提示符简介 当我们打开终端的时候&#xff0c;我们要输入命令的左边就是命令提示符&#xff0c;如下图&#xff0c;接下来介绍下他们分别代表什么含义 1、root 和 xhf 表示的是当前登录的用户名称。 2、node2 表示的当前的主机名称。 3、~ 表示的是当前的目录 4、# 表示…

BIND DNS 自定义zabbix监控

一、DNS统计计数器 Bind9可以使用rndc stats 命令将相关DNS统计信息存储到工作目录下&#xff0c;默认位置在&#xff1a; statistics-file "/var/named/data/named_stats.txt"; 每当名称服务器执行rndc stats命令&#xff0c;都会统计在统计信息文件最后附加一…

paddlehub 文本检测使用

PaddleHub负责模型的管理、获取和预训练模型的使用。 参考&#xff1a;https://github.com/PaddlePaddle/PaddleHub/tree/develop/modules/image/text_recognition/chinese_text_detection_db_server import paddlehub as hub import cv2 # from utils import cv_show import…

Charles的基础使用教程【Mac】

目录 1.安装 2.抓取https请求的前置操作 2.1安装证书&#xff1a; 2.2、SSL代理设置 3.Charles初识 1.安装 官网Charles下载安装即可&#xff0c;没有什么需要注意的地方 2.抓取https请求的前置操作 2.1安装证书&#xff1a; 未安装证书是这样的&#xff1a; 上述我们可…

BUUCTF--gyctf_2020_borrowstack1

这是一题栈迁移的题目&#xff0c;先看看保护&#xff1a; 黑盒测试&#xff1a; 用户可输入两次内容&#xff0c;接着看看IDA中具体程序流程&#xff1a; 我们看到溢出内容只有0x10的空间给我们布局&#xff0c;这显然是不足以我们布置rop的。因此肯定就是栈迁移了。迁到什么地…

React 入门 - 01

本章内容 目录 1. 简介1.1 初始 React1.2 React 相关技术点1.3 React.js vs Vue.js 2. React 开发环境准备2.1 关于脚手架工具2.2 create-react-app 构建一个 React 项目工程 1. 简介 1.1 初始 React React JS 是 Facebook 在 2013年5月开源的一款前端框架&#xff0c;其带来…

Camtasia2024录屏软件简单实用的4K录制视频软件

Camtasia是一款功能强大的屏幕录制软件&#xff0c;适用于Windows和Mac操作系统。它具有简单的操作界面和丰富的编辑功能&#xff0c;coco玛奇朵可以让你轻松录制和编辑屏幕视频。Camtasia还支持添加文字、图像、动画等元素&#xff0c;同时提供了丰富的特效和滤镜功能&#xf…

Python中的类以及对象 与 self关键字的介绍

Python中的类 类的定义 在Python中,类是一种用户定义的复杂数据类型 类提供了一种组织代码和数据的方式,用来创建现实世界对象的蓝图 一个类,是由成员变量(属性)和函数(类的方法)组成的 |------成员属性 类------||------类的方法定义格式 class Teacher: #-----类名de…

打工人的2.0时代,只需要一副AR眼镜!

在数字化时代&#xff0c;工业行业中的生产效率如何得到提升&#xff1f;工业AR眼镜或许是一个不错的选择。不过工业AR眼镜真的可以协助员工处理工作中所遇到的各种问题吗&#xff1f;我们以制造业、医疗行业、船舶业的不同从业者为例&#xff1a; 假如你是一名制造业从业者&am…