基于dynamorio自制反汇编小工具 instr_trace安装

news2024/11/18 13:53:25

目录

  • 概述
  • 一、下载源码
  • 二、安装dynamorio
    • 1、安装依赖
    • 2、编译
    • 3、测试安装是否成功
    • 参考截图
  • 三、安装instr_trace工具
    • 1、文件说明
    • 2、编译
    • 3、运行
  • 四、生成的文件格式说明
    • (1)mov指令(寄存器->寄存器)
    • (2)mov指令(内存->寄存器)
    • (3)mov指令(寄存器->内存)
    • (4)lea指令
    • (5)jmp指令
    • (6) cmp指令

概述

该工具可以对程序进行反汇编,然后打印出运行每个汇编时各个寄存器的值(类似于gdb单步调试,然后每一步都打印寄存器的值)。同时可以实时地打印各个分支跳转指令实际跳转的方向。

一、下载源码

这个不是dynamorio的官方仓库,是我自己fork出来的,加了自己的代码

git clone https://gitee.com/xiaolicangdao/instr_trace.git dynamorio

二、安装dynamorio

为了方便,我在WSL进行的环境配置

1、安装依赖

sudo apt-get install cmake g++ g++-multilib doxygen git zlib1g-dev

cmake版本有一定要求,如果apt安装的版本不够新,可以自己从源码安装

2、编译

$ cd dynamorio
$ mkdir build
$ cd build

# 以防有人对cmake不熟悉,提示一下注意命令后面有两个点
$ cmake ..

$ make -j

3、测试安装是否成功

$ ./bin64/drrun echo hello world

参考截图

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

三、安装instr_trace工具

1、文件说明

mytool文件下为instr_trace工具的所有内容,run.sh为参考运行脚本

2、编译

$ cd mytool/build
$ bash compile.sh

3、运行

前提:切换当前目录到dynamorio的主目录
参数解释:bash run.sh 程序 trace文件

$ bash run.sh ~/test/test ./test.asm
$ head ./test.asm # 查看文件的前10行

参考截图:
在这里插入图片描述
在这里插入图片描述

四、生成的文件格式说明

我利用dynamorio工具打印出了每条指令的源操作数、源操作数的值和目标操作数(注意没有打印目标操作数的值,因为脚本的功能不够完善),且注释的格式是我自己根据实际需要写的,并不是说非要使用这个格式。
下面挑几个例子介绍一下

(1)mov指令(寄存器->寄存器)

mov    rbp, rsp
; dst: reg: rbp(8 byte) 
; src: rsp 0x00007ffff85e7280
; 0.000000
  1. mov rbp, rsp:反汇编的指令
  2. ; dst: reg: rbp(8 byte) dst表示它是目标操作数,reg表示目标操作数是寄存器类型,rbp为具体的寄存器名称,(8byte)表示这个指令操作的数据宽度为8byte,即64bit
  3. ; src: rsp 0x00007ffff85e7280src表示它是源操作数,rsp为具体的寄存器名称,0x00007ffff85e7280为该寄存器的值(这个值显然是一个地址)
  4. ; 0.000000:是源操作数的浮点数格式,即将源操作数的值用浮点数来解释,在此处是没有意义的,因为rsp寄存器里放的并不是浮点数。

(2)mov指令(内存->寄存器)

mov    rax, qword ptr [0x00491eb0]
; dst: reg: rax(8 byte) 
; src: mem: 0x491eb0, read_sz=0x8, val=0x00000002 0x00000001
; 0.000000
  1. mov rax, qword ptr [0x00491eb0]:反汇编的指令
  2. dst: reg: rax(8 byte) :略
  3. ; src: mem: 0x491eb0, read_sz=0x8, val=0x00000002 0x00000001src表示它是源操作数,mem表示源操作数是内存类型的,0x491eb0为内存地址(单位为byte),read_sz=0x8表示该操作的数据宽度为8byte,val=0x00000002 0x00000001为该内存指向的内存的值,val宽度与前面对应,为8byte。
    注意:val的值我是按高地址到地址打印的,即0x00000002为高地址(0x491eb0+0x4),0x00000001为低地址(0x491eb0),这个可以使用gdb验证。
  4. ; 0.000000:在此处没有意义的,因为源操作数不是浮点数。

(3)mov指令(寄存器->内存)

mov    qword ptr [rbp-0x28], rax
; dst: mem: 0x7ffff85e7258(8 byte) 
; src: rax 0x0000000400000003
; 0.000000
  1. mov qword ptr [rbp-0x28], rax:反汇编的指令
  2. ; dst: mem: 0x7ffff85e7258(8 byte) dst表示它是目标操作数,mem表示目标操作数是内存类型,0x7ffff85e7258为具体的内存地址,(8byte)表示数据宽度为8byte
  3. ; src: rax 0x0000000400000003src表示它是源操作数,rax 表示源操作数的寄存器为rax,0x0000000400000003为该寄存器的值,val宽度与前面对应,为8byte。
    注意:rax 的值我也是按高地址到地址打印的,即0x00000004为rax寄存器的高地址部分,0x00000003为rax寄存器的低地址部分(即eax寄存器),这个也可以使用gdb验证。
  4. ; 0.000000:在此处没有意义的,因为源操作数不是浮点数。

(4)lea指令

lea    rdi, [rbp-0x30]
; dst: reg: rdi(8 byte) 
; src: mem: 0x7ffff85e7250, read_sz=0x0, val=0x00
; 0 double:
; 0 float:
  1. lea rdi, [rbp-0x30]:反汇编的指令,lea指令相当于c语言中的&(取地址操作)
  2. ; dst: reg: rdi(8 byte) :目标寄存器
  3. ; src: mem: 0x7ffff85e7250, read_sz=0x0, val=0x00src表示它是源操作数,mem表示源操作数为地址,然后注意read_sz=0,即它没有从内存中取数据,它只是在计算地址,即rdi=[rbp-0x30]的地址,而不是[rbp-0x30]的数据。
  4. 0 double:和; 0 float::在此处没有意义的,因为源操作数不是浮点数。

(5)jmp指令

jmp    <INVALID>
; src: 

无条件跳转指令,没有源操作数和目标操作数
关于跳转指令,可以参考跳转指令手册

(6) cmp指令

cmp 0x7ffff85e71ec(mem) 0x8 
; src: mem: 0x7ffff85e71ec, read_sz=0x4, val=0x00000004
; 0.000000
; src: (int)0x8
  1. cmp 0x7ffff85e71ec(mem) 0x8 ]:反汇编的指令,cmp指令是比较两个操作数,然后设置标志位寄存器,此处是比较内存0x7ffff85e71ec处的数据与立即数0x8
  2. ; src: mem: 0x7ffff85e71ec, read_sz=0x4, val=0x00000004:打印了地址0x7ffff85e71ec处的值

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

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

相关文章

用 Yara 对红队工具 “打标“

​前言: YARA 通常是帮助恶意软件研究人员识别和分类恶意软件样本的工具&#xff0c;它基于文本或二进制模式创建恶意样本的描述规则&#xff0c;每个规则由一组字符串和一个布尔表达式组成&#xff0c;这些表达式决定了它的逻辑。 但是这次我们尝试使用 YARA 作为一种扫描工…

ELK日志分析系统介绍及搭建(超详细)

目录 一、ELK日志分析系统简介 二、Elasticsearch介绍 2.1Elasticsearch概述 三、Logstash介绍 四、Kibana介绍 五、ELK工作原理 六、部署ELK日志分析系统 6.1ELK Elasticsearch 集群部署&#xff08;在Node1、Node2节点上操作&#xff09; 6.2部署 Elasticsearch 软件 …

Chrome 调试技巧

有时候&#xff0c;qa测试会忽然出问题&#xff0c;然后需要你刷新界面&#xff0c;按照他的操作再来一次。 下面介绍一个更好的办法。 可以让qa打开chrome里的这个选项 Pause on uncaught 是在遇到未try的错误时暂停 下面那个是在try的时候出错时暂停 chrome自动断点 是不是特…

latex subfloat出现双括号的问题

使用latex的subfloat插入子图&#xff0c;编译完以后出现双括号&#xff1a; 搞了很长时间没搞出来&#xff0c;在网上查阅资料得到&#xff0c;在加载包的部分把subfigure去掉&#xff08;不知道为什么&#xff0c;我并没有使用subfigure包啊&#xff0c;这是在头部引用中引入…

【Linux】网络基础——宏观认识计算机网络

1 计算机网络背景 网络发展 独立模式: 计算机之间相互独立; 一开始&#xff0c;计算机发明出来之后&#xff0c;一台计算机处理完的数据&#xff0c;数据会保存在软盘&#xff08;物理&#xff09;&#xff0c;通过人之间的相互通信&#xff0c;把计算机A处理完的数据存储到软…

使用frp实现多层代理

环境介绍 正文 Nmap对目标进行端口扫描 访问80端口 扫下目录 同时尝试一下爆破其它端口的服务 ftp、mysql、ssh 爆破无果&#xff0c;看一下扫描的目录 发现一个flag 重新再尝试登录ftp、mysql、ssh&#xff0c;结果还是不对 访问/index.php/login/ Think5工具尝试&#xff…

transpose代码学习

论文&#xff1a;TransPose: Keypoint Localization via Transformer Sen Yang Zhibin Quan Mu Nie Wankou Yang* School of Automation, Southeast University, Nanjing 210096, China {yangsenius, 101101872, niemu, wkyang}seu.edu.cn 下载地址&#xff1a;https://arxiv.o…

Robot Framweork之UI自动化测试---AutoItLibrary封装上传文件

在实现UI自动化的过程中&#xff0c;遇到了文件上传的场景&#xff0c;涉及到Windows系统窗口&#xff0c;这就需要用到AutoItLibrary库。 一、文件上传流程 1、点击上传 2、输入文件路径&#xff0c;点击确定 二、上传功能自动化脚本 一&#xff09;点击上传 直接使用click e…

day49-Springboot

Springboot 1. Springboot简介 1.1 简介&#xff1a;Springboot来简化Spring应用开发的一个框架&#xff0c;约定大于配置 1.2 优点&#xff1a; 可以快速的构建独立运行的Spring项目&#xff1b; 框架内有Servlet容器&#xff0c;无需依赖外部&#xff0c;所以不需要达成w…

如果你也能认识并使用这个低代码平台,那真的是泰酷辣——iVX低代码平台

低代码技术起源是比较悠久的了&#xff0c;尤其是在近些年&#xff0c;随着技术的演进&#xff0c;低代码平台逐渐成为热门趋势。这些平台通过简化应用程序开发流程&#xff0c;减少手动编码&#xff0c;使非专业开发人员也能快速构建复杂应用。为我们的敏捷开发和高效生产贡献…

陪诊小程序开发:让就医更便捷、贴心的选择

随着人们生活节奏的加快和社会压力的增大&#xff0c;很多人在面临就医时会感到焦虑和困惑。而陪诊小程序的开发则为用户提供了贴心的陪诊服务。本文将介绍陪诊小程序开发的功能&#xff0c;让您了解为什么选择陪诊小程序。   1. 预约就医   陪诊小程序的开发使得用户可以随…

C++ 多文件结构和编译预处理命令

1. C程序的一般组织结构 C源程序的结构基本上都是由3个部分构成&#xff1a;类的定义、类的成员的实现和主函数。因为所编写的程序比较小&#xff0c;所以这三个部分都写在了同一个文件当中。在规模比较大的项目中&#xff0c;往往需要多个源程序文件&#xff0c;每个源程序文…

VisualStudioWindows下 远程调试

前置条件 1、调试方与被调试方&#xff0c;以下简称调试方为A&#xff0c;被调试方为B。A与B双方能相互ping通 2、B需要运行RemoteDebugger服务&#xff0c;该程序位于C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Remote Debugger下。 我这里是安装…

创建邮件服务器(小微企业)

这里写自定义目录标题 目的硬件选型&#xff1a;软件选型&#xff1a;coremail &#xff08;商业版本&#xff09;postfixumail免费开源版本新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适…

在浏览器输入 URL 回车之后发生了什么?

注意&#xff1a;本文的步骤是建立在&#xff0c;请求的是一个简单的 HTTP 请求&#xff0c;没有 HTTPS、HTTP2、最简单的 DNS、没有代理、并且服务器没有任何问题的基础上&#xff0c;尽管这是不切实际的。 大致流程说明 URL 解析 DNS 查询 TCP 连接 服务器处理请求 浏览器…

Grafana制作图表-自定义Flink监控图表

简要 有时候我们在官网的Grafana下载的图表是这样的&#xff0c;如下图 #算子的处理时间&#xff0c;就是处理数据的延迟数据抓取&#xff0c;这个的说明看下下面的文章 metrics.latency.interval: 60 metrics.reporter.promgateway.class: org.apache.flink.metrics.prometh…

react-router细节补充

一、react-router-dom v5路由信息获取 HomeHead.jsx: import React from "react"; import {Link, withRouter, useHistory, useLocation, useRouteMatch} from react-router-dom import styled from "styled-components";const NavBox styled.nava {mar…

Linux下基于Dockerfile构建镜像应用(1)

目录 基于已有容器创建镜像 Dockerfile构建SSHD镜像 构建镜像 测试容器 可以登陆 Dockerfile构建httpd镜像 构建镜像 测试容器 Dockerfile构建nginx镜像 构建镜像 概述&#xff1a; Docker 镜像是Docker容器技术中的核心&#xff0c;也是应用打包构建发布的标准格式。…

【电网技术复现】考虑实时市场联动的电力零售商鲁棒定价策略(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

动画制作选择Blender还是Maya

Blender和Maya是两种最广泛使用的 3D 建模和动画应用程序。许多经验丰富的用户表示&#xff0c;Blender 在雕刻工具方面远远领先于 Maya&#xff0c;并且在 3D 建模方面达到了相同的质量水平。对于刚接触动画行业的人来说&#xff0c;您可能会问“我应该使用 Blender 还是 Maya…