逆流而上——泛谈对二进制可执行程序的静态反编译

2023-10-27

欢迎对本blog相关主题感兴趣的团体或单位转载相关文章,但转载时请注明出处。谢谢! 

 

一、概述

首先应该声明的是,这里讨论的反编译是针对二进制可执行程序进行的静态反向编译操作。虽然对于类似Java Bytecode和MSIL的虚拟机中间代码的反编译与这里讨论的内容有很大相关,但本文还是强调所针对的对象,即编译为本地机器指令码的反编译操作。另外,文中提到的方法主要还是针对过程式语言,比如C和Fortran等,对于面向对象语言编写的程序进行反编译来说,路还有很长。

其实很长一段时间内,有着相当数量的人怀疑反编译的可行性。毕竟编译器在对程序代码进行操作的时候丢弃了大量的源代码信息,例如程序变量名称、高级数据类型声明信息(结构体、数组、类等等)。因此,严格意义上来说,试图从可执行程序逆向恢复出100%的源代码形式是不太可能的。但是反编译的历史几乎和编译理论研究的历史相当,按照澳大利亚昆士兰大学相关描述的说法,第一个反编译器出自1960年。其实从某个角度来讲,当今世界比较前沿的反编译研究更多集中在两个方面:一是对可执行程序进行语义化;一是针对某种相对更高级的语言形式(通常是C语言)进行特性恢复。

二、可执行程序的语义化

首先谈谈语义化操作。我们知道机器在执行程序的时候只能够识别文件中存在的二进制指令,但我们也得承认,对二进制指令进行分析和操作是相当繁琐的。通常的软件逆向分析方法主要基于反汇编操作,即根据体系结构手册中的指令格式描述,将二进制指令一一映射到该体系结构的汇编指令。在某些研究文

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

逆流而上——泛谈对二进制可执行程序的静态反编译 的相关文章

  • Fortran 95 数组中具有一维变量的二维数组

    我想在代码中将一些内容存储在二维数组中 然后想扫描该数组 有N 1 行 第一个索引的数量 比如说i 在数组中 然而 对于给定值i 数量j尽管我知道最大可能值 但值不是固定的j 说它是N 2 我当然可以创建大小的数组 N 1 N 2 来存储我
  • 包含声明

    我不明白的重要性CONTAINSFortran 90 中的声明 例如 PROGRAM BLABLA IMPLICIT NONE INTEGER i j k i 1 j 1 k 1 PRINT i j k CALL ABC i j k PRI
  • ctags 和 Fortran 的接口

    我想知道如何让 ctags 使用 Fortran 中的接口 例如 INTERFACE SOME ROUTINE MODULE SOME ROUTINE A MODULE SOME ROUTINE B END SOME ROUTINE 因此
  • 在 Fortran 中写入现有文件而不覆盖

    我有一个由 Fortran 程序编写的现有文件 已格式化 我想在文件开头添加几行 我们的想法是在不复制原始文件的情况下完成此操作 我可以在文件末尾添加一行 open 21 file myfile dat status old action
  • 使用泰勒展开式计算正弦的程序不起作用?

    我正在尝试编写一些代码 使用泰勒展开计算 sin 0 75 的值 并打印每次迭代 直到使用展开计算的值与使用 Fortran 的内在 sin 函数计算的值之间的绝对差为小于1E 6 这是我的代码 program taylor implici
  • 与 gfortran 和 gcc 静态链接的混合语言

    我有一些用 C 和 Fortran 编写的代码 我想将其编译成静态链接的可执行文件 如果我动态编译代码 使用 fno underscoringgfortran 的选项 一切正常 但是 我想将其链接到 so文件中 静态链接大部分需要的库 然后
  • 现代 Fortran:无标签的输出格式

    我正在寻找一种不使用标签来指定输出格式的方法 为了理解我的意思 用标签 write 1001 icount x y 1001 format i5 f5 2 e12 3 没有标签应该是我放的format i5 f5 2 e12 3 在 wri
  • Intel Fortran 错误 #6633:实际参数的类型与虚拟参数的类型不同

    对于可能在这里提出这样一个基本问题 我深表歉意 我是使用英特尔 Fortran 编程的新手 所以我认为在这种情况下 我不知道有一些东西丢失或组织错误 如果有人能在这方面帮助我 我将不胜感激 问题是我在编译代码时看到以下错误 而我相信我已经声
  • 在 Fortran 95 中按值传递参数

    如何在调用函数参数时保留其值而不创建新变量 这就是 如何按值传递参数 在此示例代码中 program what implicit none integer a b c d a 1 b 2 c 3 print a b c d f val a
  • 使用 MPI 派生数据类型

    我正在学习 Fortran 中的 BCASTing 数据类型 并且有一个代码可以从终端获取两个值并将它们显示在每个进程上 对于整数 整数和整数 实数类型的组合 value1 value2 这是有效的 但是对于整数 实数 8 的组合 它会失败
  • 大多数编译器都会优化 MATMUL(TRANSPOSE(A),B) 吗?

    In a Fortran program I need to compute several expressions like M v MT v MT M M MT etc Here M and v are 2D and 1D arrays
  • 将派生类型中的指针分配给 Fortran 中相同类型中的目标

    我想在包含在同一派生类型中的派生类型中分配一个指针 下面的代码给了我下面的错误 这是怎么回事 我该如何解决这个问题 24 zoos i tigers 1 gt zoos i animals 1 1 1 Error Expected boun
  • 在 Fortran 90 中,是否必须事先声明数组维度?

    是否有必要在任何其他代码之前声明数组维度 例如 我编写了以下简化的示例代码 PROGRAM mytest IMPLICIT NONE INTEGER i j k mysum Let array c be a k by k 2 array D
  • 不确定 openmp 循环中应该共享或私有什么

    我有一个更新矩阵 A 的循环 我想将其设为 openmp 但我不确定哪些变量应该共享和私有 我本以为只有 ii 和 jj 就可以工作 但事实并非如此 我想我也需要在某个地方进行 OMP ATOMIC UPDATE 该循环仅计算 N 和 N
  • 在 Fortran 中读取行数已知但每行条目数未知的数据文件

    如何读取包含已知行数但每行中的条目数未知的数据文件 例如如果我的数据文件包含类似的内容 1 3 4 5 6 7 8 9 1 3 5 6 4 5 6 7 8 3 5 6 7 8 4 5 7 8 即三行 但每行中的数据未知 有一次我需要来自一行
  • FORTRAN 写()

    在开始之前 我必须先声明一下 我是 FORTRAN 的新手 我正在维护 1978 年的一段遗留代码 它的目的是从文件中读取一些数据值 处理这些值 然后将处理后的值输出到另一个文本文件 给出以下 FORTRAN 代码 INTEGER NM S
  • 如何包装 fortran write 语句

    我想包装 fortran写语句 http software intel com sites products documentation doclib stdxe 2013 composerxe compiler fortran lin 在
  • 关于for循环中的fortran continue语句的问题

    我正在分析 Fortran 代码并有一个简单的问题 我想知道下面代码中 100 和 200 处的 继续 语句的作用 它会增加 i 和 j 计数器吗 如果是这样的话 不会if not flg 那么条件包含flg循环中 flg 的 最后一个值
  • 如何在 Fortran 90 中迭代包含数字、单词和空格的字符串?

    文件说明 STL文件由以下部分组成 solid
  • 指定 gfortran 应该在其中查找模块的目录

    我目前基于模块来编译程序 例如主程序foo这取决于模块bar 如下 gfortran c bar f90 gfortran o foo exe foo f90 bar o 当foo f90 and bar f90位于同一目录中 如何指定 g

随机推荐

  • Java学到什么程度才能叫精通?

    把下面这些内容掌握以后 你就可以自诩精通Java后端了 1 计算机基础 这部分内容是计算机相关专业同学的课程 但是非科班的小伙伴 譬如在下 就需要花时间恶补了 特别 是计算机网络 操作系统 数据结构这三门课程 至于编译原理 个人大概懂一点就
  • 段页式存储及分段分页优缺点分析,对比(王道考研_操作系统)

    分段分页优缺点分析 段页式管理 将进程按照逻辑模块分段 再将各段分页 再将内存空间分为大小相同的页框 最后将各个页装入各个内存块中 基本分段存储管理 与分页相比 离散分配时所分配的地址空间的基本单位不同 定义 进程的地址空间 按照程序的自身
  • STL中常用的排序算法

    merge 以下是排序和通用算法 提供元素排序策略 merge 合并两个有序序列 存放到另一个序列 例如 vecIntA vecIntB vecIntC是用vector
  • Git 版本回退与前进(03)

    现在 你已经学会了修改文件 然后把修改提交到Git版本库 现在 再练习一次 修改readme txt文件如下 Git is a distributed version control system Git is free software
  • 理解attention的image to caption(图片的文字描述)

    更多查看 https github com B C WANG AI Storage 4 1 理解attention的image to caption 图片的文字描述 4 1 1 一 一个简单模型 Encoder 使用预训练的CNN进行fin
  • flex局部的知识总结(转载)

    版权声明 本文为CSDN博主 Coralpapy 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net Coralpapy article details 120
  • 用limma包的voom方法来做RNA-seq 差异分析

    用limma包的voom方法来做RNA seq 差异分析 大家都知道 这十几年来最流行的差异分析软件就是R的limma包了 但是它以前只支持microarray的表达数据 考虑到大家都熟悉了它 它又发了一个voom的方法 让它从此支持RNA
  • Python-绘制七段数码管

    SevenDigitsDrawV2 py import turtle time def drawGap 绘制数码管间隔 turtle penup turtle fd 5 def drawLine draw 绘制单段数码管 drawGap t
  • vue踩坑填坑(四):在vue单页中修改title

    由于在vue单页应用中title只设定在入口文件index html 如果切换路由 title怎么更换 在路由router中设置meta path chooseBrand component resolve gt require compo
  • 数据链路层简介

    1 数据链路层的基本概念 数据链路层在物理层提供服务的基础上向网络层提供服务 其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层 其主要作用是加强物理层传输原始比特流的功能 将物理层提供的可能出错的物理连接改造成为逻辑上
  • Python 保存数据的方法(4种方法)

    Python 保存数据的方法 open函数保存 使用with open 新建对象 写入数据 这里使用的是爬取豆瓣读书中一本书的豆瓣短评作为例子 import requests from lxml import etree 发送Request
  • 无线连接打印服务器,如何用旧电脑架设无线网络打印服务器

    如何用旧电脑架设无线网络打印服务器 由会员分享 可在线阅读 更多相关 如何用旧电脑架设无线网络打印服务器 4页珍藏版 请在人人文库网上搜索 1 如何用旧电脑架设无线网络打印服务器在工作中 单位需要打印的文件还是不少的 可是笔记本电脑连接一个
  • input框限输入数字并保留两位小数

    先把非数字的都替换掉 除了数字和 obj value obj value replace d g 保证只有出现一个 而没有多个 obj value obj value replace 2 g 必须保证第一个为数字而不是 obj value
  • iOS上架及ipa包上传到AppStore

    概述 由于苹果的机制 在非越狱机器上安装应用必须通过官方的Appstore 开发者开发好应用后上传Appstore 也需要通过审核等环节 AppCan作为一个跨主流平台的一个开发平台 也对ipa包上传Appstore作了支持 本文从三个流程
  • 通过canvas实现将html的某些元素转为png图片

    有时候我们需要把html或者某些html元素转换为图片 并且支持下载 下面是学习之后的总结 希望能给大家带来帮助 所需插件库 html2canvas js canvas2image js base64 js 资源地址 链接 https pa
  • 蛇形矩阵(完全)

    画 n阶蛇形方阵 比如如图是5阶方阵 5条对角线 1 2 6 7 15 3 5 8 14 16 4 9 13 17 22 10 12 18 21 23 11 19 20 24 25 解题思路 1 分为上三角和下三角 上三角的思路是同蛇形矩阵
  • 训练自己的ai模型(一)学习笔记与项目实操

    ai模型大火 作为普通人 我也想做个自己的ai模型 训练自己的ai模型通常需要接下来的的六步 一 收集和准备数据集 需要收集和准备一个数据集 其中包含想要训练模型的数据 这可能需要一些数据清理和预处理 以确保数据集的质量和一致性 二 选择和
  • clash设置代理后内网访问慢及访问不到问题

    配置忽略代理的ip及域名即可 在 config clash文件夹下新建 proxyIgnoreList plist文件 如果不知道 config clash在哪的 可以通过打开本地文件夹来定位 然后在新创建的文件内写入要忽略代理的域名及ip
  • 链表与节点

    链表 java中通过 node next 表示 node的下一个节点 同理 node next next 表示 node后的第二个节点 通过链表这种数据结构 可以实现许多奇妙的组合 这里我通过接口的方式 把重要的方法进行了封装 虽然只有三个
  • 逆流而上——泛谈对二进制可执行程序的静态反编译

    欢迎对本blog相关主题感兴趣的团体或单位转载相关文章 但转载时请注明出处 谢谢 一 概述 首先应该声明的是 这里讨论的反编译是针对二进制可执行程序进行的静态反向编译操作 虽然对于类似Java Bytecode和MSIL的虚拟机中间代码的反