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/(如今须要FQ)

dex2jar和jdgui不是必须的。仅仅是用来查看源代码的,由于直接看smali文件难度较大

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVjaGVycg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

反编译后得到的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文件,执行效果例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVjaGVycg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

最后,讲讲我在实际改动中的一点小技巧:我想在目标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-10-08 07:28:49

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

Android基础新手教程——1.10 反编译APK获代替码&资源

Android基础新手教程--1.10 反编译APK获代替码&资源 标签(空格分隔): Android基础新手教程 本节引言: "反编译Apk".看上去好像好像非常高端的样子,事实上不然,就是通过某些反编译软件.对我们的APK进行反编译,从而获取程序的源代码,图片,XML资源等文件.不知道你有没有这样做过,看到一个别人的一个APP界面做得非常精美,或者你看上别人的图片素材,简单点的,我们能够下载别人的APK.然后改下后缀名,改成xxx.zip.然后解压: 笔者随便解压了一个AP

Android基础入门教程——1.10 反编译APK获取代码&资源

Android基础入门教程--1.10 反编译APK获取代码&资源 标签(空格分隔): Android基础入门教程 本节引言: "反编译Apk",看上去好像好像很高端的样子,其实不然,就是通过某些反编译软件,对我们的APK进行反编译,从而获取程序的源代码,图片,XML资源等文件:不知道你有没有这样做过,看到一个别人的一个APP界面做得很精美,或者你看上别人的图片素材,简单点的,我们可以下载别人的APK,然后改下后缀名,改成xxx.zip,然后解压: 笔者随便解压了一个APK:

Android APK文件的逆向反编译

APK是Android Package的缩写,即Android安装包(APK).APK是类似Symbian Sis或Sisx的文件格式.通过将APK文件直接传到Android模拟器或Android手机中执行即可安装.APK文件和sis一样,把android sdk编译的工程打包成一个安装程序文件,格式为apk. APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Dalvik VM executes的简称,即Android Dalvik执行程序,

Android APK XML解析与反编译方法

APK中的XML为何不能直接打开,是否只是简单的二进制文件,难道被加密了?为什么AXMLPrinter2反编译的时候竟然报错了,如何解决? java.lang.ArrayIndexOutOfBoundsException: 128 at android.content.res.StringBlock.getShort(StringBlock.java:231) at android.content.res.StringBlock.getString(StringBlock.java:91) at

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

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

APK中java代码反编译

Android APK中的Java代码可以被反编译到什么程度主要看APK的加密程度. 第一种情况:无混淆无加密无加壳.直接利用Dex2jar和JD-GUI可把源码从APK里抠出来,代码逻辑清晰,基本上做到可复用,只是资源文件的引用需要计算一下. 第二种情况:混淆.通常是利用Proguard做的防护.因为是对jar做的不可逆混淆(除非有mapping),因此不能还原成原来的代码.但是代码结构,代码逻辑一致,只要花长时间对代码进行梳理一样可找准核心代码,解密方法跟第一种一致. 第三种情况:加密.这里

Android反编译工具的用法

Android的APK文件时可以反编译的,通过反编译我们就能查看到大体的代码,帮助学习.反编译仅仅提供的是学习的方式,禁止使用该技术进行非法活动. 其实就是两个命令: 1:运行(WIN+R)->CMD,定位到apktool文件夹,输入以下命令:apktool.bat d -f  CMCC.apk  CMCC 2:定位到dex2jar.bat所在目录,输入dex2jar.bat   classes.dex 下面进行详细的讲解: 我们所用到的工具: apktool 作用:资源文件获取,可以提取出图片

实例具体解释:反编译Android APK,改动字节码后再回编译成APK

本文具体介绍了怎样反编译一个未被混淆过的Android APK,改动smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk不管输入什么样的username和password都能够成功进入到第二个Activity. 有时难免要反编译一个APK.改动当中的若干关键推断点,然后再回编译成一个全新的可用的apk,这全然是可实现的. 若要完毕上述工作,须要以下工具,杂家后面会把下载链接也附上.这些软件截止本文公布时,经过杂家确认都是最新的版本号. 1.APK-Multi-Toolv

Android APK反编译详解(转)

转自:http://blog.csdn.net/ithomer/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程. 在此郑重声明,贴出来的目的不是为了去破解人家的软件,完全是一种学习的态度,不过好像通过这种方式也可以去汉化一些外国软件.   本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubuntu 12.04 x86_x