这是下面b站大佬的笔记(转发)
录播链接
b站:https://www.bilibili.com/video/BV1ca411C7HZ
百度网盘:链接:https://pan.baidu.com/s/14o04bVkqCw9t_tNJdT8pgg?pwd=wkuh 提取码:wkuh
Java
常用工具
jadx-gui(反编译
jd-jui(反编译
jclasslib(patch
等等
下载地址:建议github或者52破解
目前的jd-jui(v1.6.6)和旧版本的jadx-gui(v1.2.0),都不能应用于java17,所以建议去github下载最新的release

jclasslib的主要作用就是编辑class文件
Andriod
安卓逆向入门
参考链接
把一个apk文件解压之后,大致能看到如下几个部分

有的时候也可能是像下面这样,多出来了lib和assets

META-INF:存放签名文件,是开发者最后release打包的时候进行的签名,以防止apk被二次打包
res:一般用来存放xml和图标
assets:存放图片等资源
lib:存放动态链接库(如JNI,Java Native Interface
classes.dex:安卓上的可执行程序,安卓逆向99%的时间要研究的东西,如有多个是因为每个dex里最多存放65535个方法,而项目的方法数超出了这个数量,所以被分成多个保存
AndroidManifest.xml:配置清单,存放对于此app的一些配置,如程序入口点之类(编译后的,也就是说这个文件不可以直接阅读,但是可以通过jeb反编译
resources.arsc:资源索引文件,包含语言包,汉化的话一般是反编译这个文件
接下来我们来看一下这个AndroidManifest.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<manifest android:versionCode="1" android:versionName="1.0" package="com.example.findit" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21"/>
<application android:allowBackup="true" android:debuggable="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme">
<activity android:label="@string/app_name" android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
安卓逆向工具
dex2jar:把classes.dex转化为classes.jar,从而使用jadx或jd-gui进行反编译
apktool:拆包打包用
AndroidKiller:据说挺好用的,但是我配置过几遍都没成功过,所以最后用了JEB
JEB(强烈推荐,非常好用
MT管理器
AXMLPrinter(反编译二进制格式下的AndroidManifest.xml,但其实后来发现apktool有相同的功能
等等
JEB入门
参考链接
界面

左上角是工程浏览器,相当于把一个apk解压缩再按照签名、字节码、资源文件来进行分类
左下角是字节码浏览器,进行逆向的时候大部分时间看的是这里
快捷键
大部分快捷键与ida是相同的,比如重命名(n)、注释(;)、交叉引用(x)、后退(esc)、跟进(双击或者enter)、反编译(tab)等
JEB调试
Jeb3.24动态安卓调试.smali使用 第一集 【入坑指南】
首先将安卓模拟器根目录bin文件夹加入到系统环境变量(之后大概率要重启一下电脑

在模拟器开发者选项中打开usb调试,并选择调试应用

在class字节码界面选择合适位置按ctrl+B打断点,然后就可以开始调试了,但是有时会显示找不到设备

如果找不到设备,可以打开一个shell,尝试下面两个指令
nox_adb.exe devices
nox_adb.exe shell am start -D -n com.example.findit/.MainActivity
//start -D -n后面换成你所调试apk的报名和入口点的类名
如何调试一个无法调试的apk
参考链接

jeb官网中专门为无法调试的apk开了一个Debugging non-debuggable apps专栏,这里演示一下第三个方法,Repackage your app

这里的思路其实主要就是在AndroidManifrst.xml中插入application android:debuggable="true",jeb也内置了这个方法,可以通过命令行调用
jeb_wincon.bat -c --makeapkdebug -- file.apk
然后就可以得到一个file_debuggable.apk,但是这个apk是没有签名的,直接拖进模拟器是安装不了的,于是我们需要用Android SDK中的apksigner来手动签名
手动签名之前我们需要用java/bin目录下的keytool这个工具来生成一个key.keystone

keytool -genkey -alias key.keystore -keyalg RSA -validity 30000 -keystore key.keystore
Keytool 选项 描述
-genkey 产生一个键值对(公钥和私钥)
-alias 键的别名。
-keyalg 产生键的加密算法。支持DSA和RSA。
-keysize 产生键的长度。如果不支持,keytool用默认值1024 bits.通常我们用2048 bits 或更长的key。
-dname 专有名称,描述谁创建的密钥。该值被用作自签名证书的颁发者和主题字段。注意你可以不在命令行指定。如果没有指定keytool会提示你(CN,
OU, and so on)。
-keypass 键的密码。 主要为了安全起见,如果没提供,keytool会提示你输入。
-validity 键的有效期,单位:天
-keystore.keystore 用于存储私钥的文件。
-storepass 私钥存储文件的密码。 主要为了安全起见,如果没提供,keytool会提示你输入。这个密码不会存储在你的shell历史记录中。
生成之后用android-sdks\build-tools目录下的apksigner.bat来给apk签名,签名时候会提示输入key.keystone的密码
.\apksigner.bat sign -ks key.keystore .\ile_debuggable.apk
但是
这种方法只能强制是一个apk变成debuggable,如果有代码中反调试的逻辑,还需要静态分析来绕过(比如Siyuan笔记的apk
apktool
# 拆包
apktool.bat d .\17.apk
# 打包
apktool.bat b 17
C#
C#逆向工具其实有很多,不过我更喜欢dnspy
