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

Posted

技术标签:

【中文标题】如何将代码注入现有的 Apk?【英文标题】:How to inject code into an existing Apk? 【发布时间】:2014-11-20 10:17:58 【问题描述】:

我知道这可以反编译和重新编译 apk。我看到了这个帖子:Injecting code into APK 之前,但是我想要的不是反编译或逆向工程

就我而言,我只想制作一些使用与游戏手柄兼容的触摸事件的游戏。我见过一些公司做这样的事情并让安卓游戏与他们的游戏手柄兼容。 不幸的是,我没有找到将一些代码注入现有 apk 的解决方案。

所以我的问题是:

有没有办法对 apk 进行一些更改(更改游戏应用程序中的触摸和按键事件)并在其中添加一些代码而不影响真正的源代码?

【问题讨论】:

嗅嗅,闻起来像黑客入侵...... 如果你看到我提到的帖子,你会发现一些大公司这样做。@injecteer 【参考方案1】:

对于像这样简单的事情,您只需要 baksmali/smali。只需将单个调用插入到您的自定义类的程序集中,您就可以用 Java 编写其余部分。

反编译/重新编译很少奏效,无论如何对于这种情况来说都是多余的。使用 smali 甚至适用于混淆的应用程序,尽管一些应用程序会自行计算完整性检查,并且如果修改会拒绝运行。

【讨论】:

这似乎是个好主意,但你能解释一下如何做到这一点吗? @锑 能否推荐一个在自定义类中对程序集进行单一调用的示例。 @Antimony 有没有办法将smali 单一方法注入我的java console 应用程序? 桌面 java 应用不使用 dex。为此,您需要一个普通的 java 类文件编辑器。 @Antimony,如果您认为您的答案可以为新手和有经验的学习者提供更好的背景,那么这就是您要走的路。引用 SO 的生活方式 (***.com/help/how-to-answer),“简洁是可以接受的,但更全面的解释更好。”和“鼓励链接到外部资源”。【参考方案2】:

为此,首先你将这个 apk 反编译成源代码 用于反编译 apk 的目的如下

第 1 步:

创建一个新文件夹并复制您要解码的 .apk 文件。

现在将此 .apk 文件的扩展名重命名为 .zip(例如,从 filename.apk 重命名为 filename.zip)并保存。现在你可以访问 classes.dex 文件等了。在这个阶段你可以看到 drawables 而不是 xml 和 java 文件,所以继续。

第 2 步:

现在将这个 .zip 文件解压到同一个文件夹(或 NEW FOLDER)中。

下载 dex2jar (https://code.google.com/p/dex2jar/downloads/detail?name=dex2jar-0.0.9.15.zip&can=2&q=) 并将其解压到同一文件夹(或 NEW FOLDER)。

将 classes.dex 文件移动到 dex2jar 文件夹中。

现在打开命令提示符并将目录更改为该文件夹(或 NEW FOLDER)。然后编写 d2j-dex2jar classes.dex 并回车。您现在在同一文件夹中拥有 classes_dex2jar.jar 文件。

下载java反编译器(http://jd.benow.ca/),双击jd-gui,点击打开文件,从那个文件夹打开classes.dex.dex2jar文件:现在你得到类文件了。

通过 src 名称保存所有这些类文件(在 jd-gui 中,单击 File -> Save All Sources)。在这个阶段,您获得了 java 源代码,但 .xml 文件仍然无法读取,所以继续。

第 3 步:

现在打开另一个新文件夹

放入你要解码的.apk文件

下载最新版本的 apktool (https://code.google.com/p/android-apktool/downloads/detail?name=apktool1.5.2.tar.bz2&can=2&q=) 和 apktool 安装窗口 (https://code.google.com/p/android-apktool/downloads/detail?name=apktool-install-windows-r05-ibot.tar.bz2&can=2&q=)(都可以从同一个链接下载)并将它们放在同一个文件夹中

下载framework-res.apk并放在同一个文件夹下(不是所有的apk文件都需要这个文件,但也无妨)

打开命令窗口

导航到APKtool的根目录并输入以下命令:apktool if framework-res.apk

apktool d myApp.apk(其中 myApp.apk 表示您要解码的文件名)

现在您在该文件夹中获得了一个文件夹,并且可以轻松读取 apk 的 xml 文件。

第 4 步:

这不是任何步骤,只需将两个文件夹(在本例中为两个新文件夹)的内容复制到单个文件夹

并更新源代码...

【讨论】:

几乎所有这些步骤都是最不有效和最可靠的方法。无论如何,反编译/重新编译很少是答案。 能否给我你提到的下载链接。 @Akhil 我已经完成了第 1 步和第 2 步,但我在第 3 步中遇到了一些问题。首先我找不到 framework-res.apk 下载链接。然后我继续没有那个apk,但是我得到了一个文件夹,里面有很多.smali文件,没有xml文件。 @Akhil 为什么要更改文件扩展名?这完全没有任何作用

以上是关于如何将代码注入现有的 Apk?的主要内容,如果未能解决你的问题,请参考以下文章

将代码注入 APK

防止现有的 CSS 样式化注入的 HTML/CSS

将jar库注入apk应用

带你开发一款给Apk中自动注入代码工具icodetools(开凿篇)

带你开发一款给Apk中自己主动注入代码工具icodetools(开凿篇)

如何将特定于构建的配置注入 APK?