导航:首页 > 源码编译 > go二进制反编译

go二进制反编译

发布时间:2025-05-21 03:51:30

‘壹’ GO delve(dlv)调试工具笔记及实操

本文详细记录了使用Linux下的delve调试工具在调试Go代码时的常用操作和指令。通过这些工具和指令,无论是对应用进行调试还是追踪源码,都能获得高效且精准的体验。以下是一些关键点:

在使用Go版本1.16.8和delve版本1.7.2进行调试时,首先需要确保已正确安装delve。

常见的dlv指令包括:

1. 断点管理:通过`break`设置断点,使用`toggle`进行断点的启用或禁用,`clear`或`clearall`用于删除断点。

2. 程序执行与调试:`attach`用于调试阻塞程序,例如HTTP服务器;`exec`用于调试编译后的可执行文件。

在调试时需注意,使用`-v`选项进行`go build`时,编译器可能会进行优化,导致内联函数在断点调试时无法进入函数体。为避免这种情况,可使用`-gcflags "-N -l"`参数。

3. `test`指令用于调试单元测试,要求测试代码在`GOPATH`路径下。

4. `help`指令提供帮助信息,`debug`指令从主包的`main.go`开始调试,需确保相关包位于`GOPATH`内。

使用`case1`和`case2`进行`attach`和`exec`操作分别针对阻塞程序和可执行文件调试。`case3`和`case4`分别展示了帮助信息和从主包开始的调试。

`case5`中的`test`指令演示了如何调试单元测试。

在调试过程中,`case6`的`version`指令用于查看dlv版本,`case7`的`break`指令用于设置断点,`case8`的`breakpoints`命令打印当前所有断点状态。

当断点设置后,执行`case10`的`continue`命令将程序执行到下一个断点,而`case11`的`toggle`命令则用于断点的启用或禁用。

断点调试时,`case12`的`continue`命令可用于执行程序直至下一个断点,而`case13`的`next`命令则用于执行一行代码。`case14`的`restart`命令允许从主包开始重新执行程序,而`case15`的`step`命令则用于执行一行代码,特别是当遇到函数调用时。

在遇到需要查看函数内部执行流程的情况,`case16`的`step-instruction`命令特别有用,它允许执行单个机器指令,特别是在对汇编代码进行调试时。

当需要从当前函数返回,`case17`的`stepout`命令能够帮助直接跳出当前函数。

使用`case18`的`args`命令可查看当前函数的输入参数值,而`case19`的`display`命令则允许用户监控变量在执行过程中的变化。

`case20`的`locals`命令用于打印当前函数的局部变量,有助于理解变量的初始状态。`case21`的`print`命令则用于打印特定变量或表达式,进行简单的测试。

`case22`的`set`命令允许用户设置变量值,这对于调试边界条件或追踪代码中的异常情况尤为重要。

`case23`的`vars`命令用于打印全局变量,适用于自己的全局变量或了解运行时的内部状态。`case24`的`whatis`命令则用于查询变量类型。

`case25`的`disassemble`命令用于反编译代码,适用于追踪源码逻辑或深入理解Go底层实现。反编译过程中的常见问题和解决方法可以在特定的文档或资源中找到。

`case26`的`exit`命令用于结束调试会话。

`case27`的`funcs`命令用于查看所有方法,方便追踪特定包或方法的调用情况。

`case28`的`help`命令能够提供任何指令的使用说明。

`case29`的`list`命令用于查看代码执行位置,帮助用户理解当前调试过程的上下文。

文章鼓励调试者分享更多实用的dlv指令,以丰富调试工具的使用经验和技巧。

‘贰’ 应该怎样学习java顺序是什么

不知道Java 学习顺序的话,我提供你一条学习线路图!

按照视频学习的过程中,学习方法也是很重要的!一定要记得勤记笔记,整理程思维导图,方便后续复习方便。

第一部分:JavaSE:Java语言最基本的一套库

学习JavaEE或JavaME之前,JavaSE是必学的。

* Java开发环境搭建

* Java基础语法

* 面向对象

* 数组

* 异常

* 集合

* 线程

* IO流

* 反射机制

* 注解Annotation

* 网络编程

第二部分:数据库 【MySQL + JDBC】

* 只要学习编程,数据库是一定要学习的,是一门公共的学科。

* java、C、python、C#等程序员都需要学习数据库。

* 数据库产品很多: MySQL、Oracle、SqlServer、DB2......

* 我们动力节点数据库课程包括:MySQL + Oracle

* Oracle:银行、政府使用oracle的较多。

* MySQL:互联网公司、一般企业使用MySQL较多。

* Oracle我们是提供视频的。课堂上不讲。

* 我们课堂上讲MySQL。

* Java语言链接数据库:JDBC

第三部分:WEB前端

* 系统结构:B/S【Browser/Server】 C/S【Client/Server】

* WEB是网站的意思。WEB前端是:网站当中的页面。

* WEB前端程序是运行在浏览器当中的。

* HTML5 + CSS3 + JavaScript(JS)

* WEB前端也有很多框架:

- jQuery

- Bootstrap

- Vue

- NodeJS

- AugularJS

- RectJS

- LayUI

- EasyUI

.....

第四部分:JavaWEB

* Servlet

* JSP

* AJAX(是JavaScript的一部分语法,专门做页面局部刷新)

第五部分:JavaWEB项目

* 做一个B/S结构的项目,将WEB前端和JavaWEB内容做一个整合练习。

* 其实到这里为止,所有的系统都可以做了。但是用的技术很Low。没有用框架。

‘叁’ Borland Delphi 6.0 - 7.0 编写的EXE程序如何修改

推荐几个工具试试!【Resource Hacker】Resource Hacker 可以用来:
1. 查看 Windows 32 位和 64 位可执行和相关文件的资源 (*.exe、*.dll、*.cpl、*.ocx、*.msstyles 等等),在已编译和反编译的格式下都可以。
2. 提取 (保存) 资源为文件 (*.res) 格式,可作为二进制,或作为反编译过的资源脚本或图像。
图标、位图、指针、菜单、对话、字符串表、消息表、加速器、Borland 窗体和版本信息资源都可以完整地反编译为其各自的格式,不论是作为图像还是作为 *.rc 文本文件都可以。
3. 修改 (替换) 可执行文件的资源。
图像资源(图标、指针和位图)可以被相应的图像文件(*.ico, *.cur, *.bmp)、*.res 文件、甚至是另一个 *.exe 文件所替换。
对话、菜单、字符串表、快捷键和消息表资源脚本(以及 Borland 窗体)可以通过使用内部资源脚本编辑器被编辑和重新编译。
资源也可以被某个 *.res 文件所替换,只要替换的资源与其是同一类型并且有相同的名称即可。
4. 添加 新的资源到可执行文件。
允许一个程序支持多种语言,或将自定义图标或位图(公司的标识等)添加到程序的对话中。
5. 删除 资源。大多数编译器添加了应用程序永远都不会用到的资源到应用程序中。删除这些不使用的资源可以减小应用程序的体积。下载地址: http://www.hanzify.org/?Go=Show::List&ID=2442 【DeDe V3.50.02 】 DeDe,着名的DELPHI反编译工具,3.5版本,多语种(含中文)界面,支持到D7版本,反编译结果虽然是汇编级,不过效果已经非常不错了下载地址1: http://www.2ccc.com/article.asp?articleid=49下载地址2: http://down.csdn.net/source/1744006下载地址3: http://www.anqn.com/delphi/76/3331.shtml

‘肆’ 一次简单的golang栈溢出

逻辑分析

通过IDA工具分析,确认为Golang语言编写的简易shell程序。动态运行后发现该程序需要证书才能正常运行。

逆向工程步骤开始,由于IDA反编译功能在Golang中效果不佳,最佳策略是分析汇编代码。Golang函数调用约定与标准约定有所不同,传入参数的寄存器依次为:AX,BX,CX,DI,SI,R8,R9,R10,R11。

定位到报错字符串"Cert Is A Must"出现的地址0x4C1FC0,该函数负责将报错字符串从只读数据段(rodata)移动到.data段(.bss)区域。通过字符串交叉引用,找到解析用户输入的函数,地址为0x4C1900。该函数会检查全局变量qword_5D1128是否为0,以及输入是否满足特定条件,不满足会触发报错。

使用gdb进行动态调试,将断点设置在解析函数的开始,观察到rax寄存器指向的是一个由空格分隔的字符串数组,rbx则是数组长度。因此,绕过报错的关键在于输入格式为"cert"加上任意字符串。

接着分析到"Missing parameter"错误,用户输入的第一部分为"cert"时,程序会判断输入长度是否大于3。输入长度为4,进入右边逻辑块,检查是否为"cert"还是"echo"。若输入为"cert"且长度为3,会触发"Missing parameter"报错。

通过分析,发现输入应为"cert"后面跟任意长度的字符串,长度至少为4。动态调试后发现输入的第二部分长度应为9,并且与特定字符串"nAcDsMicN"匹配,才能通过验证。若匹配,程序进入cert解析函数,将输入的第三部分及其长度作为参数。

解析函数执行rc4和base64处理后,与字符串“JLIX8pbSvYZu/WaG”比较,相同则输出成功提示,并将全局变量qword_5D1128赋值为1。通过分析得出,输入第三部分应为"S33UAga1n@#!",输入完整格式为"cert nAcDsMicN S33UAga1n@#!",将qword_5D1128赋值为1后,绕过cert验证,实现正常交互。

分析汇编逻辑发现,除了ls、cat、whoami、cd、echo命令外,其他命令如chdir、ls -al、print等直接调用系统函数。其中,echo命令存在栈溢出漏洞,因为参数处理函数在0x4C1854附近,且参数存储在栈上,与返回地址的距离仅为0x200多,从而可以构造payload进行ROP攻击。

总结,遇到Golang逆向或pwn问题时,应首先阅读汇编代码,边调试边伪代码,逐步理解程序逻辑,最终发现和利用漏洞。此过程展示了从报错分析、函数调用、输入格式到漏洞利用的完整流程。

‘伍’ 怎么让 IDA 的 F5 支持一种新指令集

在逆向工程领域,IDA Pro是广受赞誉的反汇编和调试工具,它支持多种主流指令集,为开发者和安全研究人员提供了强大的分析能力。然而,某些特殊的指令集,如VMP指令集,可能不在IDA支持列表中。本文介绍一种方法,通过简单步骤扩展IDA以支持新指令集,缓解新指令集无反编译器的困境。方法并非原创,而是基于前辈的文章和材料总结,旨在帮助想在IDA中实现未知指令集反编译的朋友。

对于IDA处理处理器模块与Ghidra插件,IDA虽然允许用户开发特定架构的处理器模块,但无法利用其反编译功能,且编写特定架构处理器模块的过程复杂,参考资料少。相比之下,Ghidra是一款优秀的开源反编译器,用户通过插件形式添加新指令的反编译器。例如,已有插件实现Ghidra中反编译WASM模块。然而,编写Ghidra插件仍是一项复杂任务,参考资料不多,不在本文限定的“IDA”范围内。

WebAssembly(WASM)是一种流行底层指令集,主要运行在浏览器环境,也有在终端或嵌入式设备应用。一般开发者使用编译型语言如C/C++、Rust、Go开发WASM上层程序,使用LLVM将其编译为WASM模块。因此,WASM的IDA反编译方法具有代表性。目前,IDA Pro 8.4仍不支持WASM反编译,但有资料表明,IDA Pro能够反编译WASM模块。实现方法是使用wasm2c程序,将WASM模块转换为等价的C语言低级表示形式,使用GCC/CLANG编译,最后使用IDA分析最终产物。这种方法通过将WASM转换为C语言,使得IDA可以进行反编译。

在IDA中实现新指令集反编译时,wasm2c将WASM模块转换为等价的C语言形式,但这种形式的可读性较差。因此,需要使用C语言编译器优化编译结果,以适应IDA的指令集识别。这种方法实现了让IDA支持未知指令集的效果,但美中不足的是,wasm2c的转换结果可能未将内存访问以原生C语言形式表示,导致内存访问在IDA反编译结果中以函数形式呈现。对于这种情况,可以设计转换器,将指令集以函数单位转换为等价的C语言表示形式,从而快速实现未知指令集的IDA反编译器。

以WASM反编译为例,这种方法在实际应用中已经取得成功。例如,对QWB S5 VM指令集的直接转换成x64汇编,并使用IDA进行反编译,迅速发现了程序漏洞。这种转换方法在短时间内使IDA支持未知指令集,代码实现仅需3小时,代码行数在300行左右。类似的实践例子还包括栈机反编译、控制流与正确性、复杂表达式处理等,展示了该方法在不同指令集上的应用效果。

综上所述,通过将未知指令集转换为IDA能够识别的指令集,如x86或ARM,然后使用wasm2c转换为C语言,最后通过C语言编译器优化并使用IDA进行反编译,可以实现让IDA支持新指令集。这种方法适用于WASM等指令集的逆向,也能在其他小众指令集上取得成功。尽管这种方法在短时间内可以实现初步探索逆向,但要开发成熟的反编译器,仍需根据实际情况编写Ghidra反编译插件或从零开发反编译。

‘陆’ golang生成的二进制可以反编译吗

和C/C++编译的程序一样,都是机器码,如果你能反编译C的就能反编译Go的。
可以反编译成汇编

‘柒’ 如何反编译一个MOD

第一部分 下载forge源码+建立MOD开发环境。
(1)下载forge源码
注意下载src链接的版本,不要搞错。比如,forge-1.7.10-10.13.2.1230-src.zip(以src.zip结尾)

注意到有很多下载地址,每一行是一个版本,选择适合自己的版本。
右边Downloads列有几个链接,其含义如下:
(a)Changelog——更改日志。
(b)Installer——jar格式的安装包,使用与所有平台(Win/Linux/Mac)
(c)installer-win——专属于Windows的安装包。
(d)javadoc——自动生成的java文档。
(e)src—forge源代码。
(f)universal——单纯的jar库,非安装包。
(g)userdev——面向开放者。
(2)下载之后加压缩到某个文件夹
只留下五个东西:gradle和src文件夹,build.gradle,gradlew和gradlew.bat。
其它的东西没有用,可以删除。
打开 Windows命令行,cd定位到刚才的文件。
运行:gradlew.bat setupDecompWorkspace --refresh-dependencies
等待forge反编译完成。


第二部分,BON进行反混淆。
BON全名bearded-octo-nemesis,是由immibis开放的一个MOD反混淆工具。(immibis可是MOD届大名鼎鼎的人,比如redlogic,Liquid XP,Advanced Machines等都是非常好用的模组)。
新建一个BON文件夹。
(1)下载userdev版本的forge。还是刚才上面那个地址,只不过这次下载userdev版本。
把下载到的文件放到BON文件夹。
(2)找到forge反编译之后的文件。
这个文件在C:Users{username}目录下的
.gradlecachesminecraft etminecraftforgeforge1.7.10-{forgeversion}
比如咱们这个例子就是,1.7.10-10.13.2.1230。把这个文件夹复制一份到BON文件夹。
(3)下载BON
下载到一个BON.jar文件,放到上面的文件夹内。
(4)运行。
双击BON.jar之后运行。

Forge userdev.jar:选择(1)下载的文件。
FG cache folder:选择(1)复制出来的文件夹。
然后在输入文件位置选择你想反混淆的代码,再选择要保持的输出。
操作(operation)注意选择:反混淆模组。
点击Go按钮,等待完成。
反混淆之后的代码一般以deobf结尾。
比如StevesFactoryManagerA93.jar,反混淆之后就是StevesFactoryManagerA93.deobf.jar。
这时候就可以用jd-gui无障碍的查看代码了。


第三步 反编译成源代码
如果觉得用jd-gui查看不方便的话,可以考虑用fernflower进行反编译。
fernflower是MCP官方用来发编译minecraft代码的神器,虽然没有jd-gui操作简便,但是它反编译代码的质量非常高。又是官方搭配minecraft使用,是用来反编译代码的不二之选。
如何获得fernflower?
fernflower的官方代码池,然而需要编译不方便使用。
这里提供另外两个方法:
(1)伴随MCP发布的版本。
去mcp官方网址下载,目前适用于1.7.10的是9.08版。
解压缩之后,runtime/bin目录下面,复制出来。
(2)forge提供的版本
去上面提到的.gradle/caches/minecraft目录下,有一个fernflower-fixed.jar文件。
目前尚不知道,mcp和forge版本的有啥差别。
复制到一个位置之后,打开命令行
java -jar fernflower.jar [要反编译的包] [保存位置]
反编译之后的代码,就可以用记事本直接查看。

阅读全文

与go二进制反编译相关的资料

热点内容
c语言最小编译单位有哪些 浏览:461
戴尔12代服务器什么时间上市 浏览:222
编译器调用第三方库 浏览:86
云直播需要云服务器吗 浏览:248
如何把py文件封装成app 浏览:527
中国手机怎么用香港app 浏览:847
苹果手机怎么把软件放文件夹 浏览:447
验证java环境 浏览:686
好会计用不用加密狗 浏览:115
SCUM服务器如何添加到最爱 浏览:902
普通安卓线盘是什么 浏览:55
微信lbsphp 浏览:51
Pc加密机怎么用 浏览:592
ubuntu1204命令行 浏览:68
高阶函数python 浏览:804
医保app上如何代缴 浏览:583
五十一单片机的复位什么意思 浏览:649
自研服务器是什么意思 浏览:734
php中写sql语句 浏览:977
java比php快多少 浏览:394