最近遇到了须要改动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. iOS AFNetWorking中block执行完后再执行其它操作

    需求:同时进行两次网络请求,网络请求是异步的,在网络请求成功后进行其它的操作.两个网络请求是这样,一个网络请求中block执行完之后,再进行其它操作,也是一样的原理,只是这时候不需要线程组了,只需要信 ...

  2. No change while using CSS <form target="blank">

    I want to open another Window when I use <form> to request a query. So I used target="bla ...

  3. 马士兵hadoop第四课:Yarn和Map/Reduce配置启动和原理讲解(转)

    马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作 马士兵hadoop第三课:java开发hdfs 马士兵hadoop第 ...

  4. 百万级日活 App 的屏幕录制功能是如何实现的

    Android 从 4.0 开始就提供了手机录屏方法,但是需要 root 权限,比较麻烦不容易实现.但是从 5.0 开始,系统提供给了 App 录制屏幕的一系列方法,不需要 root 权限,只需要用户 ...

  5. XML 增、删、改和查的实例【转】

    原文发布时间为:2008-08-10 -- 来源于本人的百度文章 [由搬家工具导入] 原文地址:http://www.cnblogs.com/skylaugh/archive/2006/12/18/5 ...

  6. 头条PC端的鼠标经过图片放大效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Intent显示启动与隐式启动

    Android的Acitivity启动大致有两种方式:显式启动与隐式启动.下面分别介绍: 1.显示启动: 清单文件注册Activity <activity android:name=" ...

  8. MinGW 使用和创建 DLL 应注意的问题

    MinGW 是 GCC 的 Windows 版本,稳定版已经到了 4.5.2,功能和性能上很好,感觉不比 Microsoft 自家的 VC 差啊.但是 MinGW 下使用和创建 DLL 倒是要特别注意 ...

  9. hdu 5461(分类讨论)

    Largest Point Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  10. es6 Number.isFinite()、Number.isNaN()、Number.isInteger()、Math.trunc()、Math.sign()、Math.cbrt()、Math.fround()、Math.hypot()、Math 对数方法

    ES6在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法,用来检查Infinite和NaN这两个特殊值. Number.isFinite()用来检查 ...