1、需要的工具
apktool、ida、il2cppDumper、ApkSignTools
2、说明
如果是mono打包的,不管是apk还是exe,都可以直接拿到直接从包内拿到 Assembly-Csharp.dll,只要开发者没有对这个文件进行加密,都可以轻松用 ILSpy 或 dnSpy 进行反编译看到代码和内部逻辑,修改起来也非常简单。我推荐用dnSpy,个人感觉它更加美观、强大、方便,修改代码后保存一下即可生效。但如果是IL2CPP方式出包的,就比较麻烦了。
3、具体步骤(IL2CPP方式)
(1)apk 解压
也可以把apk后缀改成zip来解压,推荐用apktool,后面重新打包也要用它。需要下载 apktool.bat 和 apktool.jar,将它们放在同目录下。要把下载好 apktool 的jar包改成没有版本号的名称:apktool.jar
apktool.bat 的内容如下(java路径位置不一样的话要修改一下):
@echo off
setlocal
set BASENAME=apktool_
chcp 65001 2>nul >nul
set java_exe=java.exe
if defined JAVA_HOME (
set "java_exe=%JAVA_HOME%\bin\java.exe"
)
rem Find the highest version .jar available in the same directory as the script
setlocal EnableDelayedExpansion
pushd "%~dp0"
if exist apktool.jar (
set BASENAME=apktool
goto skipversioned
)
set max=0
for /f "tokens=1* delims=-_.0" %%A in ('dir /b /a-d %BASENAME%*.jar') do if %%~B gtr !max! set max=%%~nB
:skipversioned
popd
setlocal DisableDelayedExpansion
rem Find out if the commandline is a parameterless .jar or directory, for fast unpack/repack
if "%~1"=="" goto load
if not "%~2"=="" goto load
set ATTR=%~a1
if "%ATTR:~0,1%"=="d" (
rem Directory, rebuild
set fastCommand=b
)
if "%ATTR:~0,1%"=="-" if "%~x1"==".apk" (
rem APK file, unpack
set fastCommand=d
)
:load
"%java_exe%" -jar -Xmx1024M -Duser.language=en -Dfile.encoding=UTF8 -Djdk.util.zip.disableZip64ExtraFieldValidation=true -Djdk.nio.zipfs.allowDotZipEntry=true "%~dp0%BASENAME%%max%.jar" %fastCommand% %*
rem Pause when ran non interactively
for %%i in (%cmdcmdline%) do if /i "%%~i"=="/c" pause & exit /b
使用 apktool 进行解压
apktool d 要解压的apk名称
(2)使用IL2CppDumper反编译
打开 il2cppDumper.exe,选择解包后的包中的 ibil2cpp.so 和 global-metadata.dat 文件,就会开始反编译了。也可以用目录来指定输出目录,默认是 il2cppDumper 的目录。
Il2CppDumper.exe libil2cpp.so文件路径 global-metadata.dat文件路径 输出目录路径
完成后会得到这些文件:
在 dump.cs 这个文件会把代码中的类、方法、字段列出来;il2cpp.h 是生成的cpp
的头文件,从头文件里我们也可以看到相关的数据结构;script.json 以json
格式显示类的方法信息;string.json 以json
的格式显示所有的字符串信息;DummyDLL 里可以看到很多dll
,其中就有Assembly-CSharp.dll
,我们可以使用ILSpy或DNSpy
对其进行反编译。此时得到的只是方法名、字段名等,还没有得到代码的内部逻辑。
(3)使用 IDA 获得代码的内部逻辑
IDA安装:当下防盗链默认文件!当下软件园 www.downxia.com
安装后根据 ibil2cpp.so 的位数来使用 ida 对应的32位exe后64位exe来打开 ibil2cpp.so,并耐心等待它的解析。解析完成后,此时看到的代码很难看懂,需要先转换为伪代码。
首先在之前生成的 dump.cs 文件中检索你想要研究的函数或字段的名称,然后根据检索到的内容上方的地址(有RVA,Offset,VA 三个值,使用RVA的就行)到 ida 中按G,输入地址即可跳转到对应代码位置。
按f5可以看到伪代码,通过研究伪代码找到想要修改的数据,用鼠标选择这个数据,可以在当前伪代码窗口下面(红色矩形里的,此时选中的1)看到对应的数据地址,通过这个地址返回之前的代码窗口,按G继续定位到数据的位置;同样用鼠标选中(就是红色矩形#1那里)想修改的数据,跳转到 Hex 窗口查看对应的16进制表示的值,复制那行;然后用能查看16进制的文本编辑器打开 ibil2cpp.so,查找到刚刚复制的内容(注意要看前面地址是否对应)并进行修改(把1改为0),最后也可以重新去看看 ida 的伪代码是否改变了。
ida 详细使用方法可以参考:【教程】使用 IDA Pro + 010 Editor 反编译和修改 so 文件,让你轻松玩转逆向工程!-阿里云开发者社区 (aliyun.com)
(4)重新打包和签名
修改好 ibil2cpp.so 后,就可以重新打包了。apksignertools 详细使用教程和安装:【精选】Android 新版v2签名&渠道包工具_android v2签名 推广码-CSDN博客
% 打包 %
apktool b 包的路径 -o apk路径
% 生成秘钥,使用java自带的工具,密码可以都设置为123456,组织名、地区名等随意,国家名为“CN” %
keytool -genkeypair -alias roland.keystore -keyalg RSA -validity 500000 -keystore roland.keystore
% zipalign对齐,解决多渠道写入问题 %
zipalign -v 4 需要签名的apk路径 对齐后的apk生成路径
% V1签名,使用java自带的工具 %
jarsigner -verbose -keystore roland.keystore -signedjar 签名后的apk名称 要签名的apk名称 roland.keystore
% V1 & V2签名 %
java -jar apksigner.jar sign --ks 你的密钥 --ks-key-alias 别名 --ks-pass pass:密钥密码 --key-pass pass:别名密码 --out 签名后的apk路径 待签名的apk
% 检测签名状态 %
java -jar apksigner.jar verify -v my.apk
4、补充
如果按 F5 没反应,需要先右键点击 代码 ,再点击 创建函数,此时再按 F5 就可以看到伪代码了。