Android Apk的反编译与代码混淆
一、反编译
1.获取工具:
既然是反编译,肯定要用到一些相关的工具,工具可以到这里下载,里面包含三个文件夹,用于反编译,查看反编译之后的代码;
其实这两工具都是google官方出的,也可在google code上下载 dex2jar,apktool;
2-1.反编译获取Java源代码:
将要反编译的apk文件后缀改为zip并解压,得到classes.dex,它就是java文件编译再通过dx工具打包而成的,将classes.dex复制到apk2java目录下的dex2jar-0.0.9.9文件夹;在命令行下进入dex2jar-0.0.9.9文件夹,输入命令:dex2jar.bat classes.dex,会生成一个jar文件classes_dex2jar.jar,用工具包中jdgui工具即可查看代码;
2-2.反编译获取程序的源代码和图片、XML配置、语言资源等文件:
打开apk2java文件夹,进入apktool1.4.1,里面有三个文件aapt.exe,apktool.bat,apktool.jar;
在命令行下定位到apktool1.4.1文件夹,输入命令:apktool.bat d abc123.apk abc123;后两个参数分别是apk所在位置,反编译后代码存放位置;下面是我反编译QQ得到的AndroidManifest.xml文件的内容,输入命令为:apktool.bat d c:\qq.apk c:\qq;
2-3.将反编译出来的文件重新打包:同样,在apktool1.4.1文件夹下,输入命令:apktool.bat b c:\qq c:\\qq表示需要重新打包的文件所在的位置;
等待生成,生成的文件在qq/dist文件夹下,当然,这个程序是不能使用的,因为没有签名;关于签名后面会有讲述;
3.图形化反编译:
在工具包中,还有一个文件夹Androidfby,里面包含两个图形化反编译工具,其本质上就是对dex2jar和apktool两个工具进行了一层包装,使之有一个图形化的操作界面;
二、代码混淆
前面说了反编译,我们当然不希望我们的应用被别人反编译,所以就得在打包的时候进行代码混淆,这样的包也可反编译出代码,但是代码的可读性很低,从而达到保护代码的目的;
在我们新建的项目中,都有一个proguard-project.txt文件,默认里面是没有任何配置的,只有一些说明性的注释文字;我们就是能过它,来进行代码混淆的,首先需要为该文件添加需要混淆的代码说明;
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * {
native <methods>;
} -keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet);
} -keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
} -keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
} -keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
最后,在project.properties文件中,添加对proguard-project.txt文件的引用:proguard.config=proguard-project.txt
1。当程序中有使用第三方jar包时,常常需要过滤掉反射的R文件及jar包,以及防止读取jar包是出现读取错误、防止因为警告导致打包不成功等等问题;
-keep class **.R$* { *; } 过滤R文件
- 打开命令行窗口,进入jdk文件夹下面的bin目录,输入命令:keytool -genkey -v -keystore android.keystore -alias android.keystore -keyalg RSA -validity 20000
- 接下来会让输入一个keystore文件的属性配置,输入合法的属性就行,最后会让确认信息是否正确,输入y,创建keystore完成;
- 对未签名的程序进行签名:jarsigner -verbose -keystore appkey.keystore -signedjar c:\test_signed.apk c:\test_unsign.apk your_alias
- 进入apk所在文件目录:jarsigner -verbose -keystore appkey.keystore -storepass xoxopassword -signedjar test_signed.apk -digestalg SHA1 -sigalg MD5withRSA test_unsign.apk your_alias
Android Apk的反编译与代码混淆的更多相关文章
- android apk 防止反编译技术第四篇-对抗JD-GUI
又到周末一个人侘在家里无事可干,这就是程序员的悲哀啊.好了我们利用周末的时间继续介绍android apk防止反编译技术的另一种方法.前三篇我们讲了加壳技术(http://my.oschina.net ...
- 转: android apk 防止反编译技术(1~5连载)
转: android apk 防止反编译技术 做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习. ...
- android apk 防止反编译技术第一篇-加壳技术
做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习.现在将最近学习成果做一下整理总结.学习的这些成 ...
- android apk 防止反编译技术第二篇-运行时修改字节码
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
- android apk 防止反编译技术第三篇-加密
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
- android apk 防止反编译技术第二篇-运行时修改Dalvik指令
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
- Android Apk的反编译和加密
这几天在上海出差,忙里偷闲学习了一下Apk的反编译工具的基本使用.下面就简单介绍一下如何将我们从网上下载的Apk文件进行反编译得到我们想要获得的资源文件和源码. Android的应用程序APK文件说到 ...
- 实现android apk反编译后代码混淆
通常情况下我们需要对我们开发的android代码进行混淆,以免代码在反编译时暴露敏感信息及相关技术代码: 反编译测试工具:onekey-decompile-apk-1.0.1. 在高级版本的adt创建 ...
- android APK反编译及代码混淆
反编译.查看源代码,需要用到两个工具:dex2jar 和 jdgui dex2jar(google code) jdgui(google code),最新版本请见 官方 操作很简单,步骤如下: 1.将 ...
随机推荐
- git 取消commit
git如何撤销上一次commit操作 1.第一种情况:还没有push,只是在本地commit git reset --soft|--mixed|--hard <commit_id> git ...
- react组件性能
一.渲染原理 二.性能优化 三.Immutable在性能优化中的作用
- VIN码识别/车架号OCR识别:快速占领汽车后市场数据入口
大数据时代,企业在数据入口方面的竞争越来越激烈,这种对于入口级的大数据“争夺战”,让很多企业在数据挖掘和收集的技术方面开始加快更新速度. 在当前IT行业激烈竞争环境之下,对于入口产品的控制成为了大数据 ...
- selenium自动化之显式等待和EC(expected_conditions)模块
很多人都有这种经历,selenium脚本当前运行没问题,过了一段时间再运行就报错了,然后过几天又好了.其中的原因估计60%的人都知道,是因为元素加载这块有问题.通常的解决方案就是加上sleep或者隐式 ...
- RedHat/CentOS利用iso镜像做本地yum源
在这里用iso或者光盘做本地yum源的方法是差不多的,只是用光盘的话Linux系统会自动挂载,用iso镜像的或需要手动挂载,这里就说挂载iso的方法吧. (1) 创建iso存放目录和挂载目录 mkdi ...
- Python面向对象-访问限制
在Class内部,可以有字段,方法和属性,而外部代码可以通过直接调用实例变量的方法来操作数据, (1)私有普通字段 比如对于下面的Student类,name字段可以在外面通过对象进行直接访问: cla ...
- 实用的ES6特性
1. 函数参数默认值 不使用ES6 为函数的参数设置默认值: function foo(height, color) { var height = height || 50; var color = ...
- PSP1123
PSP时间图: 类型 任务 开始时间 结束时间 净时间 中断时间 日期 开会 开会 16:17 16:50 33 0 20171027 开会 开会 17:00 17:22 22 0 20171028 ...
- [离散化]人潮最多的時段( Interval Partitioning Problem )
範例:人潮最多的時段( Interval Partitioning Problem ) 一群訪客參加宴會,我們詢問到每一位訪客的進場時刻與出場時刻,請問宴會現場擠進最多人的時段. 換個角度想,想像會場 ...
- Java中I/O流之处理流类型
节点流:一个管道直接连接到数据源上面: 处理流:套在别的管道上面的管道: 处理流类型: [注]:在字符流中的OuPutStreamReader写错了,应该是:OutputStreamWriter