Android对apk源码的修改--反编译+源码修改+重新打包+签名【附HelloWorld的修改实例】

近期遇到了需要修改apk源码的问题,于是上网查了下相关资料,编写了HelloWorld进行修改看看可行性,经过实验证明此方案可行,并且后来也成功用这个方法对目标apk进行了修改,只不过需要修改的部分比HelloWorld复杂些,但是只要了解下smali也能进行相关的修改,下面讲下具体的步骤,文中所用到的资源会在文章的结尾给出,感兴趣的可以下载试试。

首先介绍下要用到的工具:

jdk:这个不用多说了

baksmali:把classes.dex转为为smali文件的工具

dex2jar:classes.dex转为jar包的工具

jdgui:阅读jar文件的工具(分linux和windows版本,资源中一并给出)

smali:把smali文件编译打包为classes.dex的工具

其中关于baksmali和smali可以看下谷歌的介绍http://code.google.com/p/smali/(现在需要翻墙)

dex2jar和jdgui不是必须的,只是用来查看源码的,因为直接看smali文件难度较大

下面为文章所用资源的截图:

反编译后得到的dex文件以及转为jar包后都无法进行修改,只能把dex文件转化为smali文件进行修改,然后再编译打包为dex文件,替换掉原有apk中的dex文件,然后对apk进行签名,这样就完成了对apk源码的修改,具体步骤如下:(以下操作是在linux下进行,windows可能会略有差异)

1.解压apk文件,获取classes.dex并拷贝到资源根目录(使用zip或其他解压工具即可)

2.使用baksmali工具将classes.dex转为smali文件,在命令行定位到资源根目录并执行:

java -jar baksmali-2.0.3.jar
-x classes.dex

执行完后会在当前目录下生成out目录,目录结构跟源码相同,在对应目录下查找对应的smali文件

3.使用dex2jar工具把dex转为jar文件,拷贝classes.dex到资源目录下的dex2jar-0.0.9.15目录下,把命令行定位到该目录并执行:

./dex2jar.sh classes.dex
 (windows:dex2jar.bat classes.dex)

执行完后会在当前目录下生成classes_dex2jar.jar文件,然后可以通过jdgui进行查看

4.使用jdgui工具查看HelloWorld的源码,根据不同的系统打开资源目录下对应的jdgui工具,然后把第3步生成的classes_dex2jar.jar文件拖到工具中,效果如下:

5.修改对应的smali文件,下面看看对应的smali文件的部分截图:

其中荧光笔画出部分就是需要修改的地方,在这个例子中就修改为"hello world!modify success",保存文件

6.使用smali-2.0.3.jar工具把smali文件转为dex文件,把命令行定位到资源根目录并执行:

java -jar smali-2.0.3.jar -o classes.dex out

执行完后会生成并替换掉根目录下的classes.dex文件,这样就修改成功了

7.把新生成的classes.dex文件替换到原来的apk文件里(使用压缩工具)

8.使用签名工具对apk进行签名,把apk拷贝到资源根目录下的sign_tool目录,把命令行定位到该目录并执行:

java -jar signapk.jar platform.x509.pem platform.pk8 HelloWorld.apk Signed.apk

执行完后会在该目录下生成Signed.apk文件,这个文件就是最终的文件了

9.卸载原来的HelloWorld,安装第8步中生成的Signed.apk文件,运行效果如下图:

最后,讲讲我在实际修改中的一点小技巧:我想在目标apk的某些地方添加日志,选择了toast的方式,但是直接编写太难,所以就在这个HelloWorld上添加了一句toast,然后在对应的smali文件里查看生成的代码,然后copy到目标apk相应的文件里进行测试,包括后来的switch语句也都是这样来分析的,下面看看打印toast的smali语句吧(在实际案例中可能需要修改变量名,因为可能跟上下文的变量名冲突)

const-string v0, "this is a test"

    const/16 v1, 0x3e8

    invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v0

    invoke-virtual {v0}, Landroid/widget/Toast;->show()V

资源下载点这里^^

时间: 2024-08-24 03:54:02

Android对apk源码的修改--反编译+源码修改+重新打包+签名【附HelloWorld的修改实例】的相关文章

apk应用的反编译和源码的生成

对于反编译一直持有无所谓有或无的态度,经过昨天一下午的尝试,也有了点心得和体会: 先给大家看看编译的过程和我们反编译的过程概图吧: 如下是反编译工具的根目录结构: 三个文件夹也实际上是以下三个步骤的体现: (不知道大家发现没,我把三个目录名字都改了一下,apktool即为处理apk的工具:dex2jar即就是将dex文件处理为jar包的工具:jar2gui即就是我们将jar包内的class转换为源码的gui界面以供大家参考的工具) setp 1: 在apktool里: 打开dos框(cmd进入然

反编译源码

apk不会造假,Google签名的,如果想造假就得破解Google签名. 1. 首先直接解压一个apk,解压之后拷贝出里面classes.dex文件待用. 2. 下载dex2jar工具,解压之后打开cmd,进入解压目录,运行命令: d2j-dex2jar.bat classes.dex(上一步解压的) jarpath(反编译dex后的文件目录) example: d2j-dex2jar.bat c:\user\qting\classes.dex c:\user\qting\ 反编译之后,会得到一

对Python源码加密及反编译前后对比

关于python的加密 目前软件开发商对 Python 加密时可能会有两种形式,一种是对python转成的exe进行 保护,另一种是直接对.py或者.pyc文件进行保护,下面将列举两种形式的保护流程. 1. 对 python转exe加壳 下载最新版加壳工具,使用加壳工具直接对demo.exe进行加壳操作 2.对.py/.pyc加密 第一步,使用加壳工具对 python 安装目录下的 python.exe 进行加壳,将 python.exe 拖入到加壳工具 VirboxProtector 中,配置

Android对apk源代码的改动--反编译+源代码改动+又一次打包+签名【附HelloWorld的改动实例】

最近遇到了须要改动apk源代码的问题,于是上网查了下相关资料.编写了HelloWorld进行改动看看可行性,经过实验证明此方案可行,而且后来也成功用这种方法对目标apk进行了改动,仅仅只是须要改动的部分比HelloWorld复杂些,可是仅仅要了解下smali也能进行相关的改动,以下讲下详细的步骤,文中所用到的资源会在文章的结尾给出,感兴趣的能够下载试试. 首先介绍下要用到的工具: jdk:这个不用多说了 baksmali:把classes.dex转为为smali文件的工具 dex2jar:cla

Android N 7 【 classes.dex】反编译失败:com.googlecode.d2j.DexException: not support version.

Microsoft Windows [版本 6.1.7601]版权所有 (c) 2009 Microsoft Corporation.保留所有权利. D:\Android反编译工具[全]\2016\dex2jar-2.0\dex2jar-2.0>d2j-dex2jar.bat classes.dexdex2jar classes.dex -> .\classes-dex2jar.jarcom.googlecode.d2j.DexException: not support version.  

IDEA设置External Tools之Javap反编译字节码

通过Jdk的命令javap可以反编译查看字节码,但是在使用idea的时候一直用命令行去操作不太好操作,而且因为idea会把class码 放在target里面,经常会忘记切换目录.这个时候idea的External Tools就派上用场了. 具体操作如下,先到idea的设置界面 进入Tools >  External Tools中 添加工具,分别设置program,argument等,其中arguments中是javap的参数,具体的参数信息可以去看下help信息 之后在打开的java文件界面右键

通过反编译字节码来理解 Java 枚举

枚举的声明很简单, 像 enum Gender { Male, Female }, 其余事情就是 Java 编译器帮我们干的了,所以 enum 也就是一块语法糖.有了枚举确实是很方便,避免了传统常量的无范围性.那么编译器到底在后面做了什么呢?以及理解了这个之后我们可以怎么去使用 Java 的枚举, 下面就从这个例子说起: public enum Gender {    Male,    Female} 把上面的编译成 Gender.class, 然后用  javap -c Gender 反编译出

linux下的APK反编译软件及过程介绍

需要工具: 1.apktool apk打包工具 下载地址:http://android-apktool.googlecode.com/files/apktool1.5.2.tar.bz2 安装:直接解压即可,是一个apktool.jar文件,通过 $java -jar apktool.jar 来运行,依赖于java运行环境 2.dex2jar dex转化jar工具 下载地址:http://dex2jar.googlecode.com/files/dex2jar-0.0.9.15.zip 安装:直

实例详解:反编译Android APK,修改字节码后再回编译成APK

本文详细介绍了如何反编译一个未被混淆过的Android APK,修改smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk无论输入什么样的用户名和密码都可以成功进入到第二个Activity. 有时难免要反编译一个APK,修改其中的若干关键判断点,然后再回编译成一个全新的可用的apk,这完全是可实现的.若要完成上述工作,需要以下工具,杂家后面会把下载链接也附上.这些软件截止本文发布时,经过杂家确认都是最新的版本. 1.APK-Multi-Toolv1.0.11.zip 用它