IDA反编译apk修改数据后重新打包

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 就可以看到伪代码了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值