前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于反编译的搜索

代码混淆—android被反编译的两种解决方案 -zou_12345-ChinaUnix博客 Chinaunix首页 |  论坛 |  问答 |  博客 登录 | 注册 博文 博主 私人消息() 系统消息() 好友请求() 通知管理() zou_12345的ChinaUnix博客 暂无签名 【原创评选】12-02月原创博文评选 2013第三季度“ChinaUnix博客之星”评选 2014中国数据库技术大会 首页 |  博文目录 |  关于我 zou_12345 博客访问: 111902 博文数量: 115 博客积分: 927 专家积分: 180--> 博客等级: 大尉 技术积分: 820 用 户 组: 普通用户 注册时间: 2011-04-13 17:50 文章分类 全部博文(115) android(9) java(93) 未分配的博文(13) 文章存档 2013年(16) 2013年07月(9) 2013年03月(1) 2013年01月(6) 2012年(22) 2012年05月(8) 2012年04月(3) 2012年02月(5) 2012年01月(6) 2011年(77) 2011年12月(14) 2011年11月(33) 2011年10月(6) 2011年09月(5) 2011年08月(1) 2011年06月(2) 2011年05月(3) 2011年04月(13) 我的朋友 yuansy dodba flw prolj 梦洋love 华仔desi yinliudo 清爽之梦 vanjun20 最近访客 still_wa int2e beijiwei cu博客助 云少嘎嘎 feng1988 夜夜魅 XylDll 疲惫小耳 订阅 推荐博文 ·解决Oracle锁表 ·正视心中野兽是与孩子共处的... ·NSLOOKUP使用及DNS污染检测... ·perl使用socket 发送二进制数... ·Linux内核设计与实现(17)--设... 热词专题 ·《linux设备驱动开发详解》读... ·linux头文件说明 ·破解TOM密码 ·文本编辑器的思考 ·修改grub2 代码混淆—android被反编译的两种解决方案 2013-07-10 17:40:59 分类: Android平台 最近在做一些android的项目,对apk文件能够被反编译这一情况有点头大,就花了点时间,研究了下关于apk被反编译的一些解决方法。 Java的字节码一般是非常容易反编译的,而android采用java编写,生成的apk安装文件实际上就是一个压缩格式,后缀改为.zip,解压 缩,再借用其他工具就能被反编译出来,目前android程序所谓的去广告版、汉化版都是通过反编译修改源码再编译发布的。为了能对源代码就行一些必要的 保护,我们可以对编译好的class文件进行混淆处理。这里我使用了两种解决方案,不过都是通过ProGuard来实现的。ProGuard的就是一个混 淆器。混淆器通过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,对代码进行压缩,优化和混淆。混淆后的结果是一个比较小的.apk文件,该文件 比较难进行逆向工程。 ProGuard是一个SourceForge上非常知名的开源项目。官网网址是:http://proguard.sourceforge.net/ 方案一: 目前android SDK工具集里面已经自带有ProGuard代码混淆,不过,ProGuard混淆默认没有启动,我们可以通过添加一行配置打开混淆。创建新的 Android工程时,如果在工程目录看到了ProGuard的配置文件proguard.cfg,说明你的工程已经加入了ProGuard,这时候只需 要打开project.properties文件,在文件最后加入下面红色部分。 [plain] view plaincopy # This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system use, # "ant.properties", and override values to adapt the script to your # project structure. # Project target. target=android-4 <span style="color:#ff0000;">proguard.config=proguard.cfg 这样,ProGuard就启动了,在打包生成apk的时候变会自动进行代码混淆及优化。通过下面的方式导出,并添加android签名就可以直接发布了。 对该APK进行反编译,打开产生的jar包可以看到,多了好多a、b、c之类的类文件。说明混淆结果已经成功。 关于proguard.cfg的配置 稍微深入想一下混淆后的结果,会发现如果一些提供给外部的类、方法、变量等名字被改变了,那么程序本身的功能就无法正常实现。那么Proguard如何知道哪些东西是可以改名,而哪些是不能改变的呢? 这个就是靠proguard.cfg文件来进行配置的。Android工程中默认自动生成的proguard.cfg已经针对Android的一般情况进行了配置,我们打开这个配置文件。内容大概如下: [java] view plaincopy -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、Application、Service、BroadcastReceiver、 ContentProvider、BackupAgentHelper、Preference和ILicensingService的子类。因为这些子 类,都是可能被外部调用的。 另外,它还保留了含有native方法的类、构造函数从xml构造的类(一般为View的子类)、枚举类型中的values和valueOf静态方法、继承Parcelable的跨进程数据类。 在实际的一个工程项目中,可能Google自动生成的配置不能胜任我们的混淆工作。所以,我们往往需要自己编写一些ProGuard配置。这方面的资料在官网的Manual -> Usage里有详细说明。做android的同学可以研究一下。 方案2: 通过将比较敏感的包导出为.jar格式,然后再将混淆过的.jar文件导入原来的工程中作为第三方类库进行调用。 先导出自己工程里面的包为.jar格式,例如为Demo.jar。下图: 之后,在官网下载ProGuard,然后找到ProGuard/lib/proguard.jar文件。新建文件夹,将ProGuard.jar和Demo.jar放到同一个目录,打开命令行,定位到这个文件夹,执行下面的命令。 [plain] view plaincopy java -jar proguard.jar -injars Demo.jar -outjars MyDemo.jar -libraryjars D:android/android-sdk/platforms/android-8/android.jar -printmapping sdk.map -keep "public class * {public *;}" 具体参数的作用,大家查一下官方文档吧。 文件下载地址(ProGuard 及下面的反编译工具):点击打开链接 附:android反编译方法。 1、将要反编译的APK文件后缀改为.zip,解压。得到如下图文件。 2、取出classes.dex文件,拷贝至dex2jar目录。 3、在dex2jar目录运行下列命令行:dex2jar.bat classes.dex,回车。 4、会发现该目录生成了classes.dex.dex2jar.jar文件 5、使用jd-gui.exe打开该文件,便可得到反编译的源码。下图: 管理员在2009年8月13日编辑了该文章文章。 --> --> 阅读(396) | 评论(0) | 转发(0) | 0 上一篇:vlc_android中获取视频播发状态 下一篇:如何用Android webview播放HTML5 video标签(转载) 相关热门文章 基于postfix邮件解决方案... Android开发系列(四) TabVie... mysql-mmm 安装配置 ICT Expo2014,香港国际资讯科... switch module Android之开发环境搭建 Android自定义View的实现... 不用vs和cygwin!Eclipse+cdt... MTK6577---解压system.img 如何导出微信聊天记录... 一个简单的shell脚本问题... 网站如何做图片的防盗链功能呢... 如何将printf输出的字符(含有... 嵌入式linux wifi移植 libert... ? ? {?} 是否是对的 ,这么... 热门推荐 --> 给主人留下些什么吧!~~ 评论热议 请登录后评论。 登录 注册 关于我们 | 关于IT168 | 联系方式 | 广告合作 | 法律声明 | 免费注册 Copyright 2001-2010 ChinaUnix.net All Rights Reserved 北京皓辰网域网络信息技术有限公司. 版权所有 感谢所有关心和支持过ChinaUnix的朋友们 京ICP证041476号 京ICP证060528号