- A+
注意:本站启用了缓存系统,如果你的账户登陆不了,那是因为缓存导致,刷新再登陆一次即可。如还不行,只需打开任意一篇文章,然后刷新登陆即可。声明:本站软件80%独家汉化,全网唯一,如果你发现他站有本站独家汉化软件,请举报。独家汉化软件可以转载,但严禁二发,违者一经发现永久封号。
可能是唯一通用代码c语言反编译到源码工具 Reko Decompiler v0.11.1 由 心语家园(https://www.xinyucn.cc/)独家或原创发布,你可通过右上角“私信本站”联系我们。
今天给大家介绍的是一款名叫Reko的开源反编译工具,该工具采用C#开发,广大研究人员可利用Reko来对机器码进行反编译处理。我们知道C语言程序反编译过来都是汇编语言,无法得到源码,这款可能是唯一一款可以真正得到源码的,强大到没朋友,但你得首先会编程才行。
Reko不仅包含核心反编译引擎和后端代码分析模块,而且还提供了用户友好的操作界面。目前,该工具提供了Windows GUI和ASP.NET后端。反编译引擎需要从前端获取用户的输入,可接受的输入为单独的可执行文件或反编译项目文件。Reko项目文件中还包含了代码文件的额外信息,来为研究人员的反编译操作或格式化输出提供帮助。在整个过程中,负责分析输入代码的主要是反编译引擎。
Reko的目标就是帮助用户在最小化操作交互的情况下,帮助用户完成对多种处理器架构和可执行文件格式的反编译处理。需要注意的是,很多软件许可证会禁止他人对该软件的机器码进行反编译或逆向分析,所以希望大家不要将本工具用于恶意目的。
项目地址
Reko:【GitHub传送门】
工具下载和安装
运行下列命令下载Reko:
$ git clone git://github.com/uxmal/reko.git
Windows用户
在Windows平台上,首先需要安装下列依赖组件:
.NET 5.0 (https://www.microsoft.com/net/download/dotnet-framework-runtime)
如果需要开发Reko,并使用VS2019,则必须安装VS的C#组件。
下载好MSI文件之后,直接运行安装程序即可。
非Windows用户
如果你使用的不是Windows系统,那么你首先得安装下列依赖组件:
Monov5.14.0:【传送门】
安装好mono之后,你就可以直接从整合构建服务器下载源代码,或直接构建Reko源码来使用工具了。
工具下载好并完成环境配置之后,你就可以使用一款IDE或命令行来构建Reko-decompiler.sln文件了。如果你习惯使用IDE,推荐你Visual Studio 2017或MonoDevelop v5.10及以上版本。如果你习惯使用命令行,你可以使用下列命令:
msbuild Reko-decompiler.sln
工具使用
在Windows上,安装完成后会在开始菜单里创建一个“Reko Decompiler”快捷方式,你可以直接点击图标启动Reko客户端。
在非Windows系统上,你需要使用下列命令运行WindowsDecompiler.exe:
mono WindowsDecompiler.exe
运行命令行客户端
在Windows上,假设你已经把Reko的安装目录写到了PATH环境变量里,那你就可以直接在命令行中输入下列命令来使用工具了:
decompile some_binary_file.exe
在非Windows平台上,假设你已经把Reko的安装目录写到了PATH环境变量里,那你就可以直接在命令行中输入下列命令来使用工具了:
mono decompile some_binary_file.exe
参考资料
1、 SourceForge下载点:【传送门】
2、 用户手册从:【传送门】
3、 Reko API文档:【传送门】
4、 命令行操作手册:【传送门】
Windows安装使用
1. 安装
2. 运行 GUI 客户端
在Windows中,安装包会在开始菜单栏添加一个 “Reko decompiler” 快捷方式,你可以点击它打开图形界面。
On non-Windows systems, you will need to execute the program WindowsDecompiler.exe as follows:
mono WindowsDecompiler.exe
- 1
打开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 architecture。Note: 如果你想要处理一种格式的二进制文件或者处理器结构,但是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 42 和4242 匹配相同的字节序列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
- 1
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
- 1
命令行客户端有很多选项,可以通过使用 --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)收集到基本块中。互连的基本块依次收集到过程中。
0.11.1版本更新
此维护版本提供了较小的增强和错误修复,包括:
- 更多 ARM32 重写器。
- 泛型的更多用途IntrinsicProcedures。
- SccFinder用非递归实现替换递归。
- 初步支持 Terse Executable 格式。
- 不要尝试追踪不可执行的代码。
- Ctrl+0 重置图形查看器的缩放级别
- 支持更多 PowerPC 指令
- 报告的 C 解析器问题@smx-smx
- 使 SSA 分析对堆栈变量使用位精确分析。
- 多线程鲁棒性。
它还具有一些重构和新类,为扫描器的未来重构奠定了基础:
- 的新RtlSwitch子类RtlInstruction
- 支持过程条目的平台特定模式。
本站1元=100家园币,你可以通过签到获得家园币,用来免费捐赠。
最新默认解压密码:Hoejc!xinyucn.cc 其他密码请去公众号。
如果链接丢失或未加,私信本站获取,仅对本站VIP会员开放。
请注意:微信公众号谢绝私信留言,拒绝回复。本站已在多处醒目位置注明,但是仍有网友在微信私信留言,再次声明,微信公众号不引流,不回复。
- 官方微信公众号
- 扫一扫关注微信公众号,如果你觉得本站帮到了你,请通过下面的赏字按钮捐赠本站,谢谢!
- 本站官方头条号
- 扫一扫关注官方头条号,新老用户扫描下载抖音极速版,可领取最高269元现金,每天使用都可领钱。