最近遇到了须要改动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文件难度较大

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

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

反编译后得到的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" alt="">

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

资源下载点这里^^

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

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

    Android基础新手教程--1.10 反编译APK获代替码&资源 标签(空格分隔): Android基础新手教程 本节引言: "反编译Apk".看上去好像好像非常高端的样 ...

  2. 大富豪APK安卓客户端的反编译修改和重新打包

    大富豪APK安卓客户端的反编译修改和重新打包 修改安装我们需要几个工具 DFH_3.4.X  (用于修改客户端) dnsPy        (用于修改.dll文件) 大富豪加解密.exe  ( 用于加 ...

  3. Android学习笔记_44_apk安装、反编译及防治反编译

    一.APK安装 1.首先需要AndroidManifest.xml中加入安装程序权限: <!-- 安装程序权限 --> <uses-permission android:name=& ...

  4. Android安全测试(二)反编译检测

    1.测试环境 SDK: Java JDK, Android SDK. 工具: 7zip, dex2jar, jd-gui 2.操作步骤 第一步:把apk改后缀名为zip 第二步:将zip文件解压,得到 ...

  5. APK中java代码反编译

    Android APK中的Java代码可以被反编译到什么程度主要看APK的加密程度. 第一种情况:无混淆无加密无加壳.直接利用Dex2jar和JD-GUI可把源码从APK里抠出来,代码逻辑清晰,基本上 ...

  6. Android库分析工具(崩溃反编译)

    [时间:2016-07] [状态:Open] [关键词:android, 动态库,静态库, 编译,crash,addr2line] 本文主要整理Android编译系统中可用的库分析工作,可作为后续代码 ...

  7. Android反编译工具的用法

    Android的APK文件时可以反编译的,通过反编译我们就能查看到大体的代码,帮助学习.反编译仅仅提供的是学习的方式,禁止使用该技术进行非法活动. 其实就是两个命令: 1:运行(WIN+R)-> ...

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

    本文具体介绍了怎样反编译一个未被混淆过的Android APK,改动smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk不管输入什么样的username和password都能 ...

  9. Android APK反编译详解(附图)

    转载自http://blog.csdn.net/sunboy_2050/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而 ...

随机推荐

  1. scikit-learn使用方法

    1.支持向量机 #_*_ coding:utf-8 _*_ from sklearn import datasets from sklearn import svm #装载内部测试数据集 digits ...

  2. ie,360浏览器出现无法打开网页(包括本地html)的解决方法

    有一天,编写网页照例打开chrome,ie,360等浏览器,发现ie,360均无法打开本地网页,输入百度,也无法打开,从没遇到过这种情况,通过百度,找了几种方法,没解决, 后来,看到有一种原因可能是浏 ...

  3. HDU——1982Kaitou Kid - The Phantom Thief (1)(坑爹string题)

    Kaitou Kid - The Phantom Thief (1) Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/327 ...

  4. outline:0与outline:none区别

    outline:0与outline:none的效果完全一样,用哪个都行,为了少写几个字,提倡用outline:0.具体区别如下: 出处: https://stackoverflow.com/quest ...

  5. Manjaro中源码安装gcc7.1

    刚刚gcc 7.1也出来了,想在使用熟悉的linux下试试,特记录如下: 准备必要的系统环境:(升级系统到最新,安装必要的工具) pacman -Syyu                        ...

  6. linux 目标文件调试

    前言如果普通编程不需要了解这些东西,如果想精确控制你的对象文件的格式或者你想查看一下文件对象里的内容以便作出某种判断,刚你可以看一下下面的工具:objdump, nm, ar.当然,本文不可能非常详细 ...

  7. LeetCode OJ--ZigZag Conversion

    https://oj.leetcode.com/problems/zigzag-conversion/ 将字符串Z形字排列后,再重新一行一行输出. 可以找到每一行字符位置的规律,然后填充进去. 敲代码 ...

  8. Codeforces 696E ...Wait for it...(树链剖分)

    题目链接  ...Wait for it... 考虑树链剖分. 对于树上的每个点开一个set,记录当前该节点上所有的girls. 每个节点初始的权值为set中的最小值. 询问的时候每次在路径上寻找最小 ...

  9. 第一章 “我要点爆”微信小程序云开发之项目建立与我的页面功能实现

    第一章 “我要点爆”微信小程序云开发之项目建立与我的页面功能实现 开发环境搭建 使用自己的AppID新建小程序项目,后端服务选择小程序·云开发,点击新建,完成项目新建. 新建成功后跳转到开发者工具界面 ...

  10. JVM 常量池

    最近正好在研究这个问题,题主问题本身是有问题的,在JDK7中HotSpot的常量池是放在Java Heap中,并非题目中的native memory中.在JDK6中是放在Perm Space.题主可以 ...