Reko user’s guide

Reko是一个二进制可执行文件的反编译器。它接受输入的一个或多个二进制可执行文件,然后反编译成高级语言。它可以在GUI shell中被交互地使用,作为一个命令行项目,或在你的项目中作为一个.NET目录。

这篇指南假设 你已经熟悉了 机器语言 或者 你正在处理的二进制文件 的汇编语言。如果你使用的是流行的CPU,对于这两个内容网上有大量的指南。你也应该已经稍微熟悉编译器的工作原理;或许,你已经切换了 -S or /FA 开关,并查看过结果的汇编语言了。

1. Installation

笔者注:已经在上一篇提过。内容基本一致。除了增加了非windows系统如何使用安装包。(因为笔者没有这个需求所以没有翻译,之后涉及非Windows系统的均以引用原文的形式提供)

On non-Windows machines, we recommend downloading the output of the AppVeyor continuous integration (CI) build https://ci.appveyor.com/project/uxmal/reko/build/artifacts. The zip file for the GUI client is called WindowsDecompiler-xxxxx.zip while the CLI client is called CmdLine-xxxx.zip. Unpack either of these zip files in a directory on your machine. No further installation or configuration is necessary, provided you have Mono 5.10 or later installed. It may be convenient for you to add the directory into which you installed Reko into your PATH environment variable.

2. Running the GUI client

在Windows中,安装包会在开始菜单栏添加一个 “Reko decompiler” 快捷方式,你可以点击它打开图形界面。

On non-Windows systems, you will need to execute the program WindowsDecompiler.exe as follows:

mono WindowsDecompiler.exe

打开GUI客户端后,你可以参考GUI.md文档开始工作。


笔者注:笔者打算直接用GUI,因此先插入一段GUI的使用说明。(即GUI.md文档的翻译)

2.1 Reko 反编译器 GUI 指南

这篇指南会让你熟悉Reko的图形化界面,并让你知道怎样用它分析和反编译二进制项目。

当你打开GUI客户端时,你会看到下图:

屏幕区域被区分成顶部的命令和菜单栏,左边的项目概览(详情见project browser),底部的查找和诊断区域。

2.1.1 加载二进制文件

Reko开始于一个空项目。二进制文件的分析从将它添加到项目中(使用菜单栏命令File > Open) 开始。Reko会尝试确定这个文件是什么二进制文件格式。常见的格式,比如MS-DOS或EXE会被自动加载;它们的内部结构会被从头到尾地分析加载(will be traversed),加载结果会在左侧的项目概览中中展现出来。

2.1.2 加载未知格式的二进制文件

一些可执行文件是Reko不支持的格式(只是目前不支持! 目前! )。如果你尝试加载他们,Reko会显示Open Binary File对话框。

你接下来要提供Reko为了理解这个二进制文件所需要的缺失信息。最起码,你必须提供与这个二进制文件中的机器码一致的处理器结构processor architectureNote: 如果你想要处理一种格式的二进制文件或者处理器结构,但是Reko现在不支持,请在Github上提交issue create an issue

2.1.3 加载含不完善的元数据的二进制文件

一些二进制文件会包含不完善的元数据。例如,一个MS-DOScom文件包含x86 机器码,以没有组织的字节块的形式存储。没有文件头或者其他任何的告诉Reko这个内容是可执行的线索。其次,com文件的扩展名也被CP/M使用,这意味着这个文件的内容既可能是Intel 8080的机器码,也可以是Zilog Z80的机器码。因为这个冲突,用户必须通过Open Binary File对话框选择合适的文件格式,去解决这个冲突:

2.1.4 加载外部元数据文件

Reko支持加载额外的元数据去协助反编译过程。这样的元数据文件包含象征意义的和类型的信息,可以补充被反编译的二进制文件的机器码。想要加载一个元数据文件,请使用菜单栏命令File > Add metadata file...

2.1.5 添加 script 文件

用户定义文件 scripts可以被用于去自定义Reko的反编译过程。想要创建一个新的script文件file,请使用菜单栏命令File > New script file...。已经存在的文件可以使用File > Add script file...命令添加到项目中。Scripts可以使用Reko的文本编辑器查看和编辑。

如果在script的执行过程中出现了意外,可以双击Diagnostic标签中的error查看堆栈踪迹。双击堆栈帧可以将文本编辑器移动到script相应的行。

script文件的控制台输出可以在output标签页中查看。

笔者注:翻译太累了,笔者决定接下来只翻译比较难看的部分。和关键的使用部分。

2.1.6 The project browser项目概览

Once a binary file is loaded, Reko displays an overview概览 of its contents in the project browser, located on the left side of the screen. Any metadata元数据 found in the file or supplied by the user is displayed there. 最重要的元数据之一是 the sections节 or segments段 of the file.

2.1.7 The memory viewer内存查看器

项目概览中有很多的item可供选择. Selecting a section in the project browser 将会定位到 section在内存中的起始位置 and 展示十六进制内存信息:

The memory viewer shows a part of the 被加载的项目的内存. The display is divided into 上边, which shows 十六进制内存信息, and 下边, which shows 同位置的 disassembly汇编. 十六进制内存信息的上面 is 导航栏 which allows 快速导航至二进制文件的不同部分. 右边 is a "heat map"热度地图, which displays data in memory.

当特定的像素被选择后,导航栏和热度地图都会更新内存查看器. 此外,导航栏可以分别用"+“和”-"键放大和缩小, or by 鼠标滚轮.

笔者注:这个功能我没有用成功,没找到±键,用鼠标滚轮也不行,不知道怎么回事。

2.1.8 Finding byte patterns找字符模式

Reko supports searching for byte patterns, complete with regular expression support. To search, use the Edit > Find... menu command:

搜索模式是字节,指定为十六进制数字对。 模式“0F”匹配任何出现的字节“0x0F”。 通过连接十六进制数字对形成更长的搜索模式。 空格被忽略:模式42 424242 匹配相同的字节序列0x42, 0x42

??可用来替代任意字节。The search pattern C3 ?? will match the bytes 0xC3, 0x00, 0xC3, 0xAA and 0xC3, 0xFF but not 0xC2, 0x00.

*可用来匹配0个或更多字节。Thus, C3 90* will match the byte patterns 0xC3, 0xC3, 0x90, 0xC3, 0x90, 0x90 and so on.

+可用来匹配1个或更多字节。Thus, C3 90+ will match the byte patterns 0xC3, 0x90 and 0xC3, 0x90, 0x90, but not 0xC3, 0x49.

搜索模式可以用括号组合起来。The pattern (AA BB)+ will match the bytes sequences 0xAA, 0xBB, 0xAA, 0xBB, 0xAA, 0xBB, 0xAA, 0xBB, 0xAA, 0xBB, 0xAA, 0xBB and so on.

模式的替代可以被 | 符号指定。The pattern C3 | 90 matches either the byte 0xC3 or 0x90. 可以在方括号 [] 中指定字节范围。The pattern [00-03] will match the bytes 0x00, 0x01, 0x02, or 0x03.

确定好搜索模式后点击 OK 执行搜索。The search results are displayed in the Search results tool window at the bottom of the Reko window. 双击搜索结果会在内存映射中导航到该位置。

2.1.9 Finding strings查找字符串

查找看起来像编码的 ASCII 字符串的字节序列是一项常见任务。 要搜索字符串,请使用 View > Find strings... 菜单命令打开 Find possible strings 对话框。


3. 运行命令行客户端

在Windows中,假如Reko的安装目录已经在你的环境变量PATH中了,你就可以如下所示运行Reko命令行:

decompile some_binary_file.exe

On non-Windows machines, assuming the Reko installation directory is in your PATH variable you need to prefix the command line above with mono:

mono decompile some_binary_file.exe

命令行客户端有很多选项,可以通过使用 --help 开关运行程序来显示。命令行客户端的使用 详见此处

4. 使用 Reko 作为逆向工程库

如果您熟悉编程,则可以直接访问 Reko 对象模型。 例如,如果你想写出程序中所有已知过程的名称和地址,你可以这样写:

using Reko;
using Reko.Core; class DumpProcedures {
public static int Main(string [] args) {
var dec = DecompilerDriver.Create();
if (!dec.Load("myfile.exe"))
return -1;
dec.ScanPrograms();
foreach (var program in dec.Project.Programs) {
foreach (var entry in program.Procedures) {
Console.Write("Address {0}, procedure name {1}", entry.Key, entry.Value);
}
}
}
}

Reko 拥有丰富的 API,可用于逆向工程。继续阅读以了解更多详情

5. Quick start

现在您已经安装完毕,是时候了解 Reko 的内容了。 如果您迫不及待了,请尝试 快速入门,或者继续阅读以更深入地了解正在发生的事情。

6. 反编译过程

编译本质上是一个有损过程。 将高级源代码程序转换为低级机器代码可执行二进制文件时,诸如复杂数据类型和注释之类的信息会丢失。 有用的反编译通常需要用户的帮助。 用户可以提供被编译器丢弃的类型信息,并为过程添加注释或给出友好名称。
用户还可以编写 scripts 来添加过程名称、注释等。

7. Loading加载

第一阶段是将二进制文件加载到内存中。 Reko 通过在二进制文件头中查找“magic numbers” 和/或 查看文件扩展名来识别二进制文件格式。 每种不同的二进制文件格式都需要不同的加载器。 一些二进制文件可能被额外打包,在进一步处理之前需要解包/解压缩。

一旦加载器将二进制文件加载到内存中,它就负责从二进制图像中收集元数据。 通常,二进制文件包含这个二进制文件适用于何种处理器体系结构的信息、一个或多个已知的可执行机器码指令的入口点,以及一些符号,这些符号将名称(甚至数据类型)与地址相关联。

这个加载器,完成后,为 Reko 提供:

  • 内存区域,就是一片字节区域。
  • 图像段,将地址与内存区域相关联。
  • 符号元数据。 符号将地址与 名称和可能的数据类型 相关联。

8. Scanning扫描

加载二进制文件后,扫描 阶段开始。扫描器提取与可执行机器代码一致的二进制文件部分,发现源指令和目标指令之间的交叉引用,并组装到程序的控制流图中。

扫描器从已知为可执行机器代码的地址开始,并开始将机器代码指令翻译成低级、与机器无关的寄存器传输语言 (register transfer language,RTL)。扫描器会跟踪机器代码中的所有潜在路径,直到找不到更多机器代码指令。每次遇到“跳转”指令或“调用”指令时,都会向程序的控制流图中添加一条边。

递归扫描通常无法找到可执行代码。这通常是因为扫描器在跟踪间接跳转或对其运行时目标的调用时遇到困难。在这种情况下,用户可以选择使用启发式过程(heuristic procedure)通过扫描递归算法遗漏的内存区域来定位更多机器代码。启发式过程通常会发现大部分剩余的机器代码并将其转换为 RTL。

最后,分析控制图以将没有分支的指令簇(clusters of non-branching instructions)收集到基本块中。互连的基本块依次收集到过程中。


笔者注:下一篇是读quickstart.md

【笔记】reko 0.10.2 反编译工具安装和使用记录|(2) user‘s guide的更多相关文章

  1. Myecplise反编译工具安装

    我使用的是Myecplise8.5 下载jad.exe文件jad158g.win.zip:http://varaneckas.com/jad/ 下载jadeclipse插件 net.sf.jadcli ...

  2. ubuntux下apk反编译工具安装

    1,下载dex2jar工具.(http://download.csdn.net/detail/u013647453/8286693) 2,下载jd-gui工具(http://jd.benow.ca/) ...

  3. .NET反编译工具 .net Reflector_8.3.0.95 下载激活

    在网上找了很久,很多地方都没有注册机,终于机缘巧合下找到了这个有注册机的反编译工具,放于百度网盘,供大家下载 里面有包含如何破解,不过此处也多做一次解释: 注:1.记得断开网络 2.至于杀毒软件,我没 ...

  4. .net混淆、反编译工具调查

    常用的工具列表[比较常见的] 混淆器.加密 Dotfuscator VS默认带的工具,不过是个社区版 强度不大 dotNET Reactor 使用了NativeCode 和混淆的形式 Xenocode ...

  5. 转--Android资源总结(环境搭建/ 反编译工具)

    在Android发展前景相当好的情况下,本人最近搜集了一些关于Android的相关资源,当然包含以前发布的博客内容,进行了一次大整合,希望对和我一样是Android的初学者管用,如在文章中有所错误,敬 ...

  6. 反编译工具 使用.NET JustDecompile来反编译你的程序代码

    原文地址:http://www.it165.net/pro/html/201310/7383.html 前言 在项目的进行中有时会碰到需要去了解由第三方所开发的程序代码或者因为年久已经遗失原始码的程序 ...

  7. Java反编译工具Jad及插件JadClipse配置教程

    Jad是一个Java的一个反编译工具,和eclipse的插件JadClipse,二者结合可以方便的在eclipse中查看class文件的源代码. 下面介绍一下配置: 下载JadClipse,http: ...

  8. Atitit.java 反编译 工具  attilax 总结

    Atitit.java 反编译 工具  attilax 总结 1. 三大核心核心引擎——1 2. JAD  Jad  attitude推荐这个1 2.1. Jdec.2 2.2. 二. 源码开放的 J ...

  9. java反编译工具jad

    下好以后解压就可以用了,软件就只有一个exe文件和一个帮助文件.在众多的JAVA反编译工具中,有几种非常著名的工具使用了相同的核心引擎——JAD,其中主要包括:FrontEnd Plus.mDeJav ...

  10. Myeclipse 反编译工具插件

    JadClipse是java的反编译工具,是命令行执行,反编译出来的源文件可读性较高.可惜用起来不太方便.还好 找到myeclipse下的插件,叫JadClipse,安装好之后,只要双击.class文 ...

随机推荐

  1. Luogu P5298 PKUWC2018 Minimax 题解 [ 紫 ] [ 树形 dp ] [ 线段树合并 ] [ 概率 dp ]

    Minimax:线段树合并优化 dp 好题. 树形 dp 因为要求出每一个值的出现概率,首先我们可以想到一个很暴力的 dp 式子. 定义 \(dp_{i,j}\) 表示在节点 \(i\) 时,权值 \ ...

  2. RabbitMQ(九)——消息持久化

    RabbitMQ系列 RabbitMQ(一)--简介 RabbitMQ(二)--模式类型 RabbitMQ(三)--简单模式 RabbitMQ(四)--工作队列模式 RabbitMQ(五)--发布订阅 ...

  3. LeetCode 题解大全

    项目说明 LeetCode 系列题解致力于帮助程序员更好地理解和掌握算法思维,内容包含详细的解题思路分析.图文并茂的示例讲解和完整的代码实现. LeetCode 最全题解:持续更新中,欢迎 Star ...

  4. Powershell 调用cmd 运行exe、bat、jar文件

    1. 配置路径 $nginxPath = "C:\path\to\nginx" $redisPath = "C:\path\to\redis" $ruoyiAd ...

  5. Flink Watermark 不止可以用时间戳衡量

    https://mp.weixin.qq.com/s/L5PqtcmffCIq_CnUs0WS3g

  6. C#中固定编译时不确定数量的变量(相关话题fixed固定多个数组)

    以交错数组byte[][]为例. fixed无法固定byte[][],只能在编译时固定确定数量的变量. 交错数组byte[][]中的每一个byte[]可以采用GCHandle进行固定. int n = ...

  7. 『Python底层原理』--异步机制(async/await)

    在现代编程中,并发是提高程序效率的关键技术之一,它允许程序同时执行多个任务,充分利用系统资源. 本文将深入探讨 Python 中的async/await机制,从并发编程基础讲起,逐步剖析其工作原理和实 ...

  8. 【SfM】Colmap和openMVG尝试记录

    数据集来源:http://www.maths.lth.se/matematiklth/personal/calle/dataset/dataset.html Colmap与openMVG关于SfM稀疏 ...

  9. uniapp 截屏扫码

    最近开发功能遇到个需求,用户点击某个操作之后,需要截取当前屏幕内容,并扫码识别屏幕截图中的二维码,代码如下: 首先将代码抽离到外部文件中,以便复用: // 截图 export function tak ...

  10. Huawei Cloud EulerOS上安装sshpass

    下载源码 git clone https://github.com/kevinburke/sshpass.git 由于网络问题,这里我用了一个代理下载 git clone https://ghprox ...