APK注入,重新编译android manifest

Posted

技术标签:

【中文标题】APK注入,重新编译android manifest【英文标题】:APK injection, recompiling android manifest 【发布时间】:2018-09-30 13:33:25 【问题描述】:

我想要实现的目标

将打包在apk中的AndroidManifest.xml从二进制形式反编译成普通的xml文件,编辑并重新编译成apk可接受的二进制文件。基本上我需要一个 AXML 文件的驱动程序

短背景

我正在开发一个 APK 注入项目。 我的目标是

    反汇编 dalvik 二进制文件 读取 androidManifest xml 并对其进行修改,例如更改主要活动并添加权限 重建并签署 apk 文件

我使用 apktool 来组装和反汇编 apk。但是,apk 工具仅适用于 --no-res 选项,如果使用资源对 apk 进行反汇编,则无法重新构建它。 Here's a github issue describing this bug.

问题

由于我将 apktool d --no-res app-debug.apk 分解为没有 res 标志,因此生成的 android 清单以二进制形式出现。我可以使用apktool 反汇编清单,但我无法将其组装回来。

我想做什么

我需要:

找到一种方法来反汇编清单,然后将其组装回二进制形式 想办法将apktool 与资源一起使用

到目前为止我所尝试的

用纯文本版本替换二进制AndroidManifest.xml,然后构建。 apktool 将构建。但是,将应用安装到设备失败并显示“解析包时出现问题解析错误”。 使用不同版本的apktoolv2.3.2v2.3.1v2.3.0v2.2.0v2.2.1v2.2.2 使用以下项目编译 axml:https://github.com/rednaga/axmlprinter; https://github.com/ZaratustraN/axml-parser ; https://github.com/shazam/axmlparser

免责声明

虽然 *** 是一个知识共享社区,而不是评判它的用途 - 我看到很多人在类似的问题中挑剔其他人,指控他们从事非法活动。

我的所作所为绝对合法,不会被用来剥削任何人。

【问题讨论】:

but the app does not run 然后会发生什么?它会在 LogCat 中生成任何有意义的日志吗? @MattClark 好吧,实际上它甚至没有安装,设备只是显示解析错误。我无法查明 logcat 日志。 我假设您正在使用adb install /path/to/new.apkParse error there is a problem while parsing the package 是从那个响应?好的,那么您可能看不到 LogCat 日志是有道理的,因为它将在 Android 操作系统中并且可能会被抑制。另外,当您说您“为 apk 文件签名”时,您是否使用与您第一次安装它时签名的密钥库相同的密钥库对其进行了签名?否则您将遇到签名冲突。最后,你反编译没有资源,你重新编译APK时不是也需要它们吗? 是的,签名没有问题。如果我用二进制清单重建同一个项目,一切正常。 @MattClark 澄清一下,您是想在不更改签名的情况下执行此操作,还是可以更改签名? 【参考方案1】:

安装在以下情况下会出现解析错误,看看有没有遇到过 -

签名后包的名称被更改:使用确切的名称作为 签名的包是(改为在 Manifest 中调整名称) 包裹。 在更高的 API 级别上编译:更正 API 级别 清单文件。 从 SD 卡执行包:运行(安装)apk - 手机内存中的文件或使用 adb 命令安装它。

您可以按照给定的here 手动签署您的 apk。

【讨论】:

我 100% 确定这不是签名问题。有一个东西叫做 axml,它是 android 资源的二进制 xml 标准。 Apk 必须包含这些资源,所以我不希望安装问题,因为我没有将 android xml 重新编译为 axml 类型。这个问题是关于什么的 我确定是因为我在没有反编译资源的情况下重新打包了apk,然后将它重新打包回apk并手动签名,它可以工作【参考方案2】:

我发现使用纯文本 android 清单重新打包应用程序的唯一可靠方法是直接使用 aapt 重新打包它。

aapt package -f -M ./AndroidManifest.xml -S res1/ -S res2/ ... -I android.jar -F MyProject.apk.unaligned

创建apk,然后:

aapt add -f MyProject.apk.unaligned classes.dex

将已编译的源代码添加到包中。

然后使用jarsigner对包进行签名:

jarsigner -storepass <keystore password> -keystore <keystore filename> MyProject.apk.unaligned <key name>

【讨论】:

jarsigner 已被弃用,因为它只创建 v1 签名。最好使用 Android-SDK 构建工具中的apksigner【参考方案3】:

我也遇到过类似的问题,但我很幸运遇到了Easy APK tool。

我打开了应用程序,然后导航到options -&gt; apktool 并检查了don't decode classes.dex。然后我能够成功地重新编译应用程序。

另一种选择是使用 aapt,正如 Ben 已经说过的那样,但它需要更多的知识/努力。

【讨论】:

以上是关于APK注入,重新编译android manifest的主要内容,如果未能解决你的问题,请参考以下文章

如何反编译android应用并重新打包

将代码注入 APK

如何将代码注入现有的 Apk?

Android逆向小技巧③:批量注入日志,打印目标程序执行流程

Android逆向小技巧③:批量注入日志,打印目标程序执行流程

Android 反编译Apk,修改资源,重新打包,签名发布