【Android 应用开发】 Android APK 反编译 混淆 重编译

来源:互联网 发布:淘宝详情页素材 编辑:程序博客网 时间:2024/04/29 11:53

反编译工具 : 总结了一下 linux, windows, mac 上的版本, 一起放到 CSDN 上下载;

-- CSDN 下载地址 : 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. octopus@octopus:~/decompiler$ tree -L 2  
  2. .  
  3. ├── linux  
  4. │   ├── apktool  
  5. │   ├── dex2jar-0.0.9.15  
  6. │   └── jd-gui  
  7. ├── mac  
  8. │   ├── apktool  
  9. │   ├── dex2jar-0.0.9.15  
  10. │   └── jd-gui-0.3.5.osx.i686.dmg  
  11. ├── windows  
  12. │   ├── apkTool  
  13. │   ├── dex2jar-0.0.9.15  
  14. │   └── jd-gui.exe  
  15. └── 源码  
  16.     └── apktool-source.zip  
  17.   
  18. 10 directories, 4 files  





一. 反编译 至 Java 源码 



1. 工具介绍


dex2jar 简介 : 将 .dex 或者 .class 后缀文件转换成 .jar 文件;

-- 最新版本 : 目前最新版本 0.0.9.15;

-- 官方地址 (需要翻墙) : http://code.google.com/p/dex2jar/ ;

-- 下载地址 (需要翻墙) : http://code.google.com/p/dex2jar/downloads/list;


jd-gui 简介 : 使用该工具可以查看 .jar 中的 java 代码;

-- 官网地址 : http://jd.benow.ca/ ;



2. 反编译过程 



(1) Ubuntu 系统反编译


a. 获取 .dex 后缀文件 : 修改 apk 文件后缀, 获取 class.dex 文件;


b. 执行反编译 : 将 classes.dex 拷贝到 dex2jar 目录下, 执行 ./d2j-dex2jar.sh classes.dex 命令;

-- 执行结果 : 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. octopus@octopus:~/decompiler/linux/dex2jar-0.0.9.15$ ./d2j-dex2jar.sh classes.dex   
  2. dex2jar classes.dex -> classes-dex2jar.jar  

c. jd-gui 中查看源码 : 将 classes-dex2jar.jar 文件拖入 jd-gui 中, 查看源码;




3. 混淆代码


注意 : 如果不使用签名文件进行打包的话, 直接从 eclipse 中拷贝的文件是无法混淆的;


(1) 配置混淆文件 


编辑 progard.cfg : 

-- 文件内容 : 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. -optimizationpasses 5  
  2. -dontusemixedcaseclassnames  
  3. -dontskipnonpubliclibraryclasses  
  4. -dontpreverify  
  5. -verbose  
  6. -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  
  7.   
  8. #组件相关的类不进行混淆, 保留  
  9. -keep public class * extends android.app.Activity  
  10. -keep public class * extends android.app.Application  
  11. -keep public class * extends android.app.Service  
  12. -keep public class * extends android.content.BroadcastReceiver  
  13. -keep public class * extends android.content.ContentProvider  
  14. -keep public class * extends android.app.backup.BackupAgentHelper  
  15. -keep public class * extends android.preference.Preference  
  16. -keep public class com.android.vending.licensing.ILicensingService  
  17.   
  18. # 所有类中的 native 方法不混淆  
  19. -keepclasseswithmembernames class * {  
  20.     native <methods>;  
  21. }  
  22.   
  23. # 对全部类的指定方法的方法名不进行混淆  
  24. -keepclasseswithmembers class * {  
  25.     public <init>(android.content.Context, android.util.AttributeSet);  
  26. }  
  27.   
  28. #对全部类的指定方法的方法名不进行混淆  
  29. -keepclasseswithmembers class * {  
  30.     public <init>(android.content.Context, android.util.AttributeSet, int);  
  31. }  
  32.   
  33. # 保留 Activity 子类  
  34. -keepclassmembers class * extends android.app.Activity {  
  35.    public void *(android.view.View);  
  36. }  
  37.   
  38. # 对枚举类型enum的全部类的下面指定方法的方法名不进行混淆  
  39. -keepclassmembers enum * {  
  40.     public static **[] values();  
  41.     public static ** valueOf(java.lang.String);  
  42. }  
  43.   
  44. # 实现了 Parcelable 序列化接口的类不混淆  
  45. -keep class * implements android.os.Parcelable {  
  46.   public static final android.os.Parcelable$Creator *;  
  47. }  


-- project.properties 配置混淆文件 : 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. target=android-19  
  2. proguard.config=proguard.cfg  



(2) 打包 apk 文件 (创建新的 keystore)


a. 设置打包项目 : 右键点击工程 选择 Android Tools --> Export Signed Application Package 选项, 弹出以下对话框, 选择要打包的程序, 设置好后点击 Next;



b. 创建 keystore : 选择 Create new keystore, 选择一个文件, 然后设置 keystore 的用户名 和 密码;

-- Location : keystore 文件;

-- Password : 密码;

-- Confirm : 确认密码, 重新输入密码;


c. 输入 keystore 详细信息 

-- Alias : 别名;

-- Password : 别名密码;

-- Confirm : 确认密码;

-- Validity(years) : 有效期限, 推荐 25 年;

-- First and Last Name : 开发者姓名;

下面的参数可以不填写

-- Orgnizational Unit : 组织名称;

-- Orgnization : 组织;

-- City or Location : 城市;

-- State or Provience : 省 或者 州;

-- Country Code : 国家;


d. 选择 apk 文件并打包 : 点击 finish 按钮后打包完毕;



(3) 打包 apk 文件 (使用现有的 keystore 文件)


a. 选择打包的工程 : 右键点击工程, 选择 Android Tools --> Export Signed Application Package 选项;



b. 选择签名文件 : 输入签名文件密码;



c. 输入别名密码 : 



d. 打包 apk : 选择要打包的 apk 文件 : 




(4) 验证混淆效果 


反编译 : 将 apk 文件后缀改为 .zip, 之后取出 classes.dex 文件 到 dex2jar 根目录中, 执行 ./d2j-dex2jar.sh classes.dex 命令;

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. octopus@octopus:~/decompiler/linux/dex2jar-0.0.9.15$ ./d2j-dex2jar.sh classes.dex   
  2. dex2jar classes.dex -> classes-dex2jar.jar  

在 jd-gui 中查看 Java 代码 : 





二. Apktools 反编译 



1. Apktools 介绍


Apktools 简介 : 

-- 最新版本 : 2.0.0 ;

-- 官方网站 (需要翻墙) https://code.google.com/p/android-apktool/ ;

-- 新版本下载地址 : https://bitbucket.org/iBotPeaches/apktool/downloads ;

-- 老版本下载地址 (需要翻墙) : https://code.google.com/p/android-apktool/downloads/list ;


需要下载的文件 

-- apktool jar 包 : apktool1.5.2.tar.bz2

-- apktool 引导工具 (Linux) : apktool-install-linux-r05-ibot.tar.bz2

-- apktool 引导工具 (mac) : apktool-install-macosx-r05-ibot.tar.bz2

-- apktool 引导工具 (wondows) : apktool-install-windows-r05-ibot.tar.bz2



2. 反编译


将下载的文件放到一个文件中 : 



反编译 : 将 apk 文件放入上面的目录, 执行命令 ./apktool d WheelView.apk ;

-- 反编译过程 : 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. octopus@octopus:~/decompiler/linux/apktool$ ./apktool d WheelView.apk   
  2. I: Baksmaling...  
  3. I: Loading resource table...  
  4. I: Loaded.  
  5. I: Decoding AndroidManifest.xml with resources...  
  6. I: Loading resource table from file: /home/octopus/apktool/framework/1.apk  
  7. I: Loaded.  
  8. I: Regular manifest package...  
  9. I: Decoding file-resources...  
  10. I: Decoding values */* XMLs...  
  11. I: Done.  
  12. I: Copying assets and libs...  
  13. octopus@octopus:~/decompiler/linux/apktool$ ls  
  14. aapt  apktool  apktool.jar  WheelView  WheelView.apk  

-- 反编译结果 : 反编译结果都在 WheelView 目录中, res 中是相关资源文件, smali 中是 smali 汇编文件;




3. 重新编译 


重新编译命令格式 : ./apktool b apk源目录 apk文件名称;

-- 执行命令 : ./apktool b WheelView WheelView1.apk , 可以生成 WheelView1.apk 文件;

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. octopus@octopus:~/decompiler/linux/apktool$ ls  
  2. aapt  apktool  apktool.jar  WheelView  WheelView.apk  
  3. octopus@octopus:~/decompiler/linux/apktool$ ./apktool b WheelView WheelView1.apk  
  4. I: Checking whether sources has changed...  
  5. I: Smaling...  
  6. I: Checking whether resources has changed...  
  7. I: Building resources...  
  8. I: Building apk file...  
  9. octopus@octopus:~/decompiler/linux/apktool$ ls  
  10. aapt  apktool  apktool.jar  WheelView  WheelView1.apk  WheelView.apk  

转自:http://blog.csdn.net/shulianghan/article/details/41697821


0 0
原创粉丝点击