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文件难度较大
以下为文章所用资源的截图:
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的改动实例】的更多相关文章
- Android基础新手教程——1.10 反编译APK获代替码&资源
Android基础新手教程--1.10 反编译APK获代替码&资源 标签(空格分隔): Android基础新手教程 本节引言: "反编译Apk".看上去好像好像非常高端的样 ...
- 大富豪APK安卓客户端的反编译修改和重新打包
大富豪APK安卓客户端的反编译修改和重新打包 修改安装我们需要几个工具 DFH_3.4.X (用于修改客户端) dnsPy (用于修改.dll文件) 大富豪加解密.exe ( 用于加 ...
- Android学习笔记_44_apk安装、反编译及防治反编译
一.APK安装 1.首先需要AndroidManifest.xml中加入安装程序权限: <!-- 安装程序权限 --> <uses-permission android:name=& ...
- Android安全测试(二)反编译检测
1.测试环境 SDK: Java JDK, Android SDK. 工具: 7zip, dex2jar, jd-gui 2.操作步骤 第一步:把apk改后缀名为zip 第二步:将zip文件解压,得到 ...
- APK中java代码反编译
Android APK中的Java代码可以被反编译到什么程度主要看APK的加密程度. 第一种情况:无混淆无加密无加壳.直接利用Dex2jar和JD-GUI可把源码从APK里抠出来,代码逻辑清晰,基本上 ...
- Android库分析工具(崩溃反编译)
[时间:2016-07] [状态:Open] [关键词:android, 动态库,静态库, 编译,crash,addr2line] 本文主要整理Android编译系统中可用的库分析工作,可作为后续代码 ...
- Android反编译工具的用法
Android的APK文件时可以反编译的,通过反编译我们就能查看到大体的代码,帮助学习.反编译仅仅提供的是学习的方式,禁止使用该技术进行非法活动. 其实就是两个命令: 1:运行(WIN+R)-> ...
- 实例具体解释:反编译Android APK,改动字节码后再回编译成APK
本文具体介绍了怎样反编译一个未被混淆过的Android APK,改动smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk不管输入什么样的username和password都能 ...
- Android APK反编译详解(附图)
转载自http://blog.csdn.net/sunboy_2050/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而 ...
随机推荐
- LSU——1116 Necklace(尺取)
1116 Necklace 通过率:5/23 难度系数:0时间限制:1000ms 内存限制:32000KB java 两倍. 介绍 Little King has a beautiful pearl ...
- BZOJ3930 [CQOI2015]选数 【容斥】
题目 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研 ...
- mysql监控指标
1.最大连接数监控 show VARIABLES like "max_connections"; //最大连接数 show global status like 'Threads_ ...
- CodeForces 97D. Robot in Basement
time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standa ...
- 【NOIP2016练习】T2 花花的聚会 (树形DP,倍增)
题意: 花花住在 H 国.H 国有 n 个城市,其中 1 号城市为其首都.城市间有 n 1 条单向道路.从任意一个城市出发,都可以沿着这些单向道路一路走到首都.事实上,从任何一个城市走到首都的路径是唯 ...
- c#.NET的事件与委托例子
原文发布时间为:2008-07-25 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...
- java面试复习
1.jvm虚拟机 https://www.cnblogs.com/dingyingsi/p/3760447.html https://blog.csdn.net/qq_41701956/article ...
- luogu 1327 数列排序 & 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J题 循环节
luogu 1327 数列排序 题意 给定一个数列\(\{an\}\),这个数列满足\(ai≠aj(i≠j)\),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? ...
- gcc 编译时 库链接
gcc -l参数和-L参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把 ...
- 快充 IC BQ25896 的 Dynamic Power Management
Spec 更正: 上面紅色框框應該還要再增加一個 ILIM pin 硬體所設定的 input current limit, 也就是說 input current limit 最多可以從這 3 個 IL ...