一、反编译

1.获取工具:
  既然是反编译,肯定要用到一些相关的工具,工具可以到这里下载,里面包含三个文件夹,用于反编译,查看反编译之后的代码;
  其实这两工具都是google官方出的,也可在google code上下载 dex2jarapktool

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 *;
}
  在上面的脚本文件混淆中,保留了继承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本组件以及com.android.vending.licensing.ILicensingService,并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等。(详细信息请参考android-sdk\tools\proguard\examples中的例子及注释。)
  最后,在project.properties文件中,添加对proguard-project.txt文件的引用:proguard.config=proguard-project.txt
  下面是一个代码混淆过后的apk反编译之后得到的代码,可以看出,如果给你一个这样的jar文件,你如何去读取整理它的代码?
  
 
>>延伸扩展:
1。当程序中有使用第三方jar包时,常常需要过滤掉反射的R文件及jar包,以及防止读取jar包是出现读取错误、防止因为警告导致打包不成功等等问题;
  -keep class **.R$* {   *;  }   过滤R文件
  -keep class packagename.** {*;}   过滤第三方包(packagename为第三方包的包名)
  -libraryjars libs/mmbilling.jar   防止读取第三方jar包时读取内容错误
  -dontwarn android.net.http.**   不提示读取某个包的警告
2。当混淆打包的apk文件上有bug时,我们一般所用的统计平台所收集到的错误信息也是混淆之后的代码信息,我们自身也看不明白了,这种情况下可以单独把某个类提取出来,不进行混淆;参考上面对继承了Activity的类的保留方法,对单个个别的类进行保留;
  
三、程序打包签名
  生成keystore,生成keystore有两种方式,一是在eclipse中生成,还有一种是在命令行中生成,在这里我只说在命令行中生成;
  • 打开命令行窗口,进入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
可能遇到的问题:找不到xx的证书链。xx必须引用包含专用密钥和相应的公共密钥证书链的有效密钥库密钥条目。
这个问题一般是签名的别名写错了,可以通过如下的命令查看keystore文件的别名(前提是要在jdk所在文件夹下面的bin目录);
keytool -list  -v -keystore xxxx.keystore -storepass (password密码)
 
 
 
 
 

Android Apk的反编译与代码混淆的更多相关文章

  1. android apk 防止反编译技术第四篇-对抗JD-GUI

    又到周末一个人侘在家里无事可干,这就是程序员的悲哀啊.好了我们利用周末的时间继续介绍android apk防止反编译技术的另一种方法.前三篇我们讲了加壳技术(http://my.oschina.net ...

  2. 转: android apk 防止反编译技术(1~5连载)

    转: android apk 防止反编译技术 做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习. ...

  3. android apk 防止反编译技术第一篇-加壳技术

    做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习.现在将最近学习成果做一下整理总结.学习的这些成 ...

  4. android apk 防止反编译技术第二篇-运行时修改字节码

    上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...

  5. android apk 防止反编译技术第三篇-加密

    上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...

  6. android apk 防止反编译技术第二篇-运行时修改Dalvik指令

    上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...

  7. Android Apk的反编译和加密

    这几天在上海出差,忙里偷闲学习了一下Apk的反编译工具的基本使用.下面就简单介绍一下如何将我们从网上下载的Apk文件进行反编译得到我们想要获得的资源文件和源码. Android的应用程序APK文件说到 ...

  8. 实现android apk反编译后代码混淆

    通常情况下我们需要对我们开发的android代码进行混淆,以免代码在反编译时暴露敏感信息及相关技术代码: 反编译测试工具:onekey-decompile-apk-1.0.1. 在高级版本的adt创建 ...

  9. android APK反编译及代码混淆

    反编译.查看源代码,需要用到两个工具:dex2jar 和 jdgui dex2jar(google code) jdgui(google code),最新版本请见 官方 操作很简单,步骤如下: 1.将 ...

随机推荐

  1. android学习九 对话框碎片

    1.android的对话框是异步的,对话框创建后马上执行下面的代码.好处:      a.通过实现对话框的回调方法反馈用户与对话框的交互.    b.能够在代码中清楚对话框.     2.碎片对话框基 ...

  2. 用列主元消去法分别解方程组Ax=b,用MATLAB程序实现(最有效版)

    数值分析里面经常会涉及到用MATLAB程序实现用列主元消去法分别解方程组Ax=b 具体的方法和代码以如下方程(3x3矩阵)为例进行说明: 用列主元消去法分别解方程组Ax=b,用MATLAB程序实现: ...

  3. Python中一些糟糕的语法!你遇到过吗?还知道那些?

    Python是一门语法优雅,功能强大,开发效率高,应用领域广泛的解释性语言. 其有非常多的优点,但是也并不是完美的,除了大家都知道的执行速度不够快,Python2和Python3的兼容问题,以及GIL ...

  4. TW实习日记:第16天

    前端的样式bug实在是太太太莫名其妙了,尤其是封装好的组件,一层套一层的,根本不知道是哪一层出了问题...除了改bug就是做新功能,真想吐槽一下这个项目的留言板,根本没人会用吧...这功能实在是太老旧 ...

  5. 最短路径算法(II)

    什么??你问我为什么不在一篇文章写完所有方法?? Hmm…其实我是想的,但是博皮的加载速度再带上文章超长图片超多的话… 可能这辈子都打不开了吧… 上接https://www.cnblogs.com/U ...

  6. php多进程单例模式下的 MySQL及Redis连接错误修复

    前几天写了个php常驻脚本,主要逻辑如下 //跑完数据后休息60秒 $sleepTime = 60; $maxWorker = 10; while (true) { $htmlModel = new ...

  7. vim常用命令—撤销与反撤销

    命令模式下(即按ESC后的模式) u 撤销 Ctrl r (组合键) 反撤销<后悔撤销>

  8. day21 TFRecord格式转换MNIST并显示

    首先简要介绍了下TFRecord格式以及内部实现protobuf协议,然后基于TFRecord格式,对MNIST数据集转换成TFRecord格式,写入本地磁盘文件,再从磁盘文件读取,通过pyplot模 ...

  9. oracle数据库分页原理

    Oracle数据库的rownum 在Oracle数据库中,分页方式没有MySql这样简单,它需要依靠rownum来实现.Rownum表示一条记录的行号,值得注意的是它在获取每一行后才赋予.因此,想指定 ...

  10. java—连连看-实现消除

    实现消除 1.Chess.java package Linkup; /** * 棋子封装类 * * @author laixl * */ public class Chess { // 图片的 状态 ...