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的内容如下:

@echo off
setlocal
set BASENAME=apktool_
chcp 65001 2>nul >nulset java_exe=java.exeif 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=apktoolgoto 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 DisableDelayedExpansionrem 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, rebuildset fastCommand=b
)
if "%ATTR:~0,1%"=="-" if "%~x1"==".apk" (rem APK file, unpackset 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 就可以看到伪代码了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/160607.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车标定技术(三)--XCP协议如何支持测量功能

目录 1. 概述 2. 测量方式 -- Poll 3. 测量方式 -- DAQ 3.1 ODT概念模型 3.2 DAQ List概念 3.3 ODT 绝对编号和相对编号 3.4 静态DAQ和动态DAQ模式 (1)静态DAQ (2)动态DAQ 4.小结 1. 概述 在该系列的首篇文章汽车标定技…

layui form 中input输入框长度的统一设置

Layui.form中使用class"layui-input-inline"就可轻松将元素都放到一行,但如果元素过多,就会自动换行。那就需要手动设置input框的长度。 像这种情况: 其实只需要添加css样式就可修改了 .layui-form-item .layui-input-inline {wid…

uni-app---- 点击按钮拨打电话功能点击按钮调用高德地图进行导航的功能【安卓app端】

uniapp---- 点击按钮拨打电话功能&&点击按钮调用高德地图进行导航的功能【安卓app端】 先上效果图: 1. 在封装方法的文件夹下新建一个js文件,然后把这些功能进行封装 // 点击按钮拨打电话 export function getActionSheet(phone) {uni.showAct…

05-流媒体-RTMP协议介绍

05-流媒体-RTMP协议介绍 1.RTMP概述 RTMP是一种常见的流媒体协议,是基于TCP/IP协议模型的应用层协议,工作在TCP协议上,端口是1935。通过TCP三次握手保证传输的可靠。 2.握手 2.1 握手过程 RTMP基于传输层TCP连接后,通过RTMP握手协议来完成RTMP连接。客户端和服务端各发…

PTA 函数题(C语言)-- 阶乘计算升级版

题目title: 阶乘计算升级版 题目作者: 陈越 浙江大学 本题要求实现一个打印非负整数阶乘的函数。 函数接口定义: void Print_Factorial ( const int N ); 其中N是用户传入的参数,其值不超过1000。如果N是非负整数&#…

LeetCode:117. 填充每个节点的下一个右侧节点指针 II(C++)

117. 填充每个节点的下一个右侧节点指针 II 题目描述: 给定一个二叉树: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将…

【Qt-22】Qt乱码问题解决

最近在Qt项目中遇到TCP通信接收数据乱码的问题,很是苦恼,经过多次尝试,终于得以解决。 感谢Qt TcpSocket 传递数据乱码显示_qt中socket接受到的客户端数据显示不出来-CSDN博客 彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)_XX風的博客…

Fourier分析导论——第3章——Fourier级数的收敛性(E.M. Stein R. Shakarchi)

第 3 章 Fourier级数的收敛性(Convergence of Fourier Series) The sine and cosine series, by which one can represent an arbitrary function in a given interval, enjoy among other remarkable properties that of being convergent. This property did not escape…

解决Visual Studio Code 控制台中文乱码问题

C和CPP运行编码指定 "code-runner.executorMap": {"c": "cd $dir && gcc -fexec-charsetGBK $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt","cpp": "cd $dir && g -fexec-charsetGBK $…

虚拟机VirtualBox添加磁盘

一、创建虚拟硬盘 fdisk -l 我们新添加的磁盘/dev/sdb,还没有分区 sdb磁盘分区 fdisk /dev/sdb n 创建一个新分区 选择p添加主分区 我们把所有10GB空间都格式化为一个分区了 。 w 键入w,保存设置并退出&#x…

2023.10.31 关于 Spring 的基本概念

目录 Spring 容器 对象生命周期 IoC Spring IoC DI Spring Spring 的全称为 Spring Framework,是一个开源的 Java 应用程序框架它提供了一种综合的编程和配置模型,用于构建现代化企业级的应用程序 一句话概括 Spring 是包含了众多工具方法的 IoC …

【每日一题】重复的DNA序列

文章目录 Tag题目来源题目解读解题思路方法一:哈希表方法二:哈希表滑动窗口位运算 写在最后 Tag 【哈希表】【位运算滑动窗口哈希表】【字符串】【2023-11-05】 题目来源 187. 重复的DNA序列 题目解读 找出字符串中重复出现的字符串。 解题思路 方法…