各类语言所用逆向工具汇总
C/C++:.exe
是什么
逆向考察的主力区域,也是传统逆向的唯一文件类型,除了此类型的介绍了动调,其他仅介绍了静调。
怎么做
OD(32位):动态调试的代表,下断点,修改某段代码执行,等等,主要用于理解程序执行步骤
- 替代,界面和使用方式和OD基本相同
- x32dbg,x64dbg(支持64位程序)
- IDA(有32位和64位版):静态调试汇编代码,可以生成伪代码(下同),是exe反汇编的主力
python:.py .pyc
例题
- buu-buu-[GWCTF 2019]pyre,wp:http://poilzero.sipc115.club/index.php/archives/65/
是什么
和java类似python也是一门半解释半执行的语言,.py后缀的python源码可以理解为全解释的解释型代码,而python编译器可以将.py后缀的代码(也就是日常所说的python代码)编译成字节码,然后再执行代码内容。也就是说转换为字节码是每次运行py文件必不可少的步骤,因此,如果直接运行字节码无疑会提高编译运行速度,在python中的.pyc就是保存字节码的文件。
- .py文件:直接写的python代码
- .pyc文件:python代码转换为字节码后的文件
怎么做
而对于逆向而言,使用一个库就可以进行对pyc代码的逆向了,经过学习,选择uncompyle
进行逆向,使用pip
或conda
指令安装皆可。注意:uncompyle库是跨版本的,因此python2和3的使用没有差异,python2.7使用的是uncompyle2
,python3.x使用的是uncompyle6
,指令安装会自带安装对应版本。常用指令如下
- 以python3举例对应
uncompyle6
安装
pip install uncompyle
- liunx下
git clone https://github.com/rocky/python-uncompyle6
然后进入下载的目录python setup.py install
- conda镜像库暂时没有
uncompyle
所以conda install
不行
反编译(忘了指令也可以
uncompyle6 --help
)uncompyle6 原文件路径.pyc > 保存的文件路径.py
指令记忆
- compyle:v.编译,其中含有com-聚集-编译成字节码所以更集成,-py- python专属,-le 编译了速度快了乐了,com-py-le
- un-:反,un-compyle,反编译
java: .jar .class
例题
- buu-java逆向,wp:http://poilzero.sipc115.club/index.php/archives/62/
是什么
前置知识点学习了:
- 这篇博客 https://www.cnblogs.com/gzgb/p/7388536.html
- 和一些百科与实践
java是一门半解释半执行的语言,.java后缀的java源码可以理解为全解释的解释型代码,而javac编译器可以将.java后缀的代码(也就是日常所说的java代码)编译成java虚拟机可以直接使用的半编译的代码后缀为 .class,因为java虚拟机每次在运行 .java文件的时候都需要经历javac这一步,因此将java代码提前编译成javac文件无疑会提高代码编译执行速度。
- .java文件:直接写的java原代码
- .jar文件:将一系列.java文件和一些配置文件集合的一个文件夹封装成文件的形式,提高项目集成度,类似php的.phar文件
.class文件:将java原代码使用javac编译产生的字节码(jdk环境中默认安装javac编译器)
javac 文件路径.java
javap -c -verbose 文件路径.class
(javap不自带)
怎么做
回到正题,而作为ctf逆向来说直接阅读字节码显然是不现实,我们可以使用更为方便的官方的一些软件来直接反编译呈现代码。
经过查询,最为方便的要数JD-GUI
项目地址:http://java-decompiler.github.io/
因为没有java项目开发或者学习经验,因此直接采用集成度更高的
JD-GUI
。如果有相关经验的,可以采用相关的插件来使自己的编辑器支持这些功能也是可以的。
android:.apk .dex .jar
例题
- buu-findit
是什么
安卓底层是java,但是又有一套自己的规范,安卓本身相当于一个框架,基于java制作的框架。
相当于jq和js,bootstrap和css,scrapy和python的关系等等。而apk本质是一个.zip的压缩包,类似java的jar,php的phar,直接修改后缀就可以得到这个文件夹实际的目录了,这个操作和使用javap -c -verbose 文件路径.class
把jar文件还原成目录的形式是一样的。在apk这个压缩包里面有个xxxxxx.dex
文件,这个文件就是保存源码的文件,其他的可以简单理解为用于给android这个框架识别的配置文件,而在.dex文件中,可以使用专门的工具还原java的jar文件,这个就是真正的源码所在地。
- .apk:封装.dex文件和其他一些android这个框架的配置文件(需要改成.zip后缀解压缩 手动解包)
- .dex:储存.jar文件和其他一些更核心的配置文件(需要使用dex2jar.bat解包)
- .jar:封装java代码的一个打包文件(需要使用JD-GUI解包和反汇编)
怎么做
一般流程如下
.apk--(.zip解压缩)-->.dex--(dex2jar.bat)-->.jar--(JD-GUI)-->java代码
回到正题,逆向来说
- 手动解包,修改.apk文件后缀改成.zip后直接解压缩就可以了
在解压缩的文件里面找到.dex文件,下载解压缩
dex2jar
项目文件后- 让cmd进入
d2j-dex2jar.bat
所在目录 - 在cmd中输入指令
d2j-dex2jar.bat .dex文件路径
- 注意版本问题dex2jar支持的最新版本为35(https://blog.csdn.net/lonewolf521125/article/details/89095783)
- 让cmd进入
dex2jar
项目地址:http://sourceforge.net/projects/dex2jar/
JD-GUI
项目地址:http://java-decompiler.github.io/
unity C# net
例题
- buu-[BJDCTF2020]hamburger competition:http://poilzero.sipc115.club/index.php/archives/83/
是什么
是一个基于第三方C#库(unity和net)的C#程序
怎么做
- 主程序文件在:
.\Managed\Assembly-CSharp.dll
需要使用net反汇编软件能更好的反汇编,使用经典的 dnSpy反编译工具(IDA也可以不过难理解不少),打开
- 其中的{}分类下才是代码内容,其他的是一些第三方库的内容或者是生成的配置代码
One comment
好棒 学习一下