代码混淆—android被反编译的两种解决方案

Android代码混淆及反编译apk 序言: 经常听开发提起代码混淆引起的BUG,混淆后在测试一下有没有问题,那问题来了什么是代码混淆,怎么确认代码混淆成功了,带着问题读下文吧~~ 一、代码混淆的原理 代码混淆是将程序中的代码,等价转换为难以阅读理解的行为,提高攻击者阅读理解代码的难度,提高安全性,可以有效的提高应用被逆向破解的难度 二、代码混淆的方法 1.字符串加密:对应用程序中使用的字符串进行加密,防止获取关键词定位核心业务代码 2.类名、方法名混淆:讲代码中类名,方法名,属性名替换成无意义的符号,增加代码逆向难度,这种方式也是在jav 阅读详情
最近在做一些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文件,在文件最后加入下面红色部分。

# This file is automatically generated by Android Tools.  
  1. # Do not modify this file -- YOUR CHANGES WILL BE ERASED!  
  2. #  
  3. # This file must be checked in Version Control Systems.  
  4. #  
  5. # To customize properties used by the Ant build system use,  
  6. # "ant.properties", and override values to adapt the script to your  
  7. # project structure.  
  8.    
  9. # Project target.  
  10. target=android-4  
  11. <SPAN style="COLOR: #ff0000">proguard.config=proguard.cfg</SPAN>  
# 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
proguard.config=proguard.cfg

      这样,ProGuard就启动了,在打包生成apk的时候变会自动进行代码混淆及优化。通过下面的方式导出,并添加android签名就可以直接发布了。


       对该APK进行反编译,打开产生的jar包可以看到,多了好多a、b、c之类的类文件。说明混淆结果已经成功。

关于proguard.cfg的配置

       稍微深入想一下混淆后的结果,会发现如果一些提供给外部的类、方法、变量等名字被改变了,那么程序本身的功能就无法正常实现。那么Proguard如何知道哪些东西是可以改名,而哪些是不能改变的呢?

       这个就是靠proguard.cfg文件来进行配置的。Android工程中默认自动生成的proguard.cfg已经针对Android的一般情况进行了配置,我们打开这个配置文件。内容大概如下: 

  1. -optimizationpasses 5  
  2. -dontusemixedcaseclassnames  
  3. -dontskipnonpubliclibraryclasses  
  4. -dontpreverify  
  5. -verbose  
  6. -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  
  7. -keep public class * extends android.app.Activity  
  8. -keep public class * extends android.app.Application  
  9. -keep public class * extends android.app.Service  
  10. -keep public class * extends android.content.BroadcastReceiver  
  11. -keep public class * extends android.content.ContentProvider  
  12. -keep public class * extends android.app.backup.BackupAgentHelper  
  13. -keep public class * extends android.preference.Preference  
  14. -keep public class com.android.vending.licensing.ILicensingService  
  15.   
  16. -keepclasseswithmembernames class * {  
  17.     native <methods>;  
  18. }  
  19.   
  20. -keepclasseswithmembernames class * {  
  21.     public <init>(android.content.Context, android.util.AttributeSet);  
  22. }  
  23.   
  24. -keepclasseswithmembernames class * {  
  25.     public <init>(android.content.Context, android.util.AttributeSet, int);  
  26. }  
  27.   
  28. -keepclassmembers enum * {  
  29.     public static **[] values();  
  30.     public static ** valueOf(java.lang.String);  
  31. }  
  32.   
  33. -keep class * implements android.os.Parcelable {  
  34.   public static final android.os.Parcelable$Creator *;  
  35. }  
 -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放到同一个目录,打开命令行,定位到这个文件夹,执行下面的命令。

  1. 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 *;}"  
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打开该文件,便可得到反编译的源码。下图:


Android 将类混淆成中文、混淆资源文件和反编译 ##1.配置proguard-rules.pro和module文件混淆成中文:** 在proguard-rules.pro的配置: #中文混淆 -classobfuscationdictionary ./proguard-keys.txt -packageobfuscationdictionary ./proguard-keys.txt -obfuscationdictionary ./pro... 阅读详情

相关推荐

Android反编译原理与代码混淆实战指南

在Android应用开发与安全领域,反编译与代码混淆是两个相互对立又紧密关联的核心技术。反编译是指将已编译的APK文件还原为接近原始的Java代码或Smali代码,便于逆向分析、漏洞挖掘或竞品研究;而代码混淆则是通过工具对源码进行重命名、结构优化及逻辑混淆,提升代码逆向难度,增强应用安全性。随着Android生态的快速发展,应用安全问题日益突出,尤其在金融、支付、社交等敏感场景中,防止代码被逆向分析已成为开发流程中不可或缺的一环。

weixin_42596011的博客 1429

Android 逆向工程之APK混淆处理方案分析

提供apk给到外部,外部对apk进行二次处理后重新给我们一个新apk。尝试分析源apk文件和处理后的apk文件区别,根据其中区别推测外部的混淆处理方案,尽可能还原外部对apk的处理方式。以下对处理和未处理的apk文件用新、旧apk名称表示。通过反编译工具分析可以得出外部处理的新 app 操作主要是对 dex 文件增加了垃圾代码提高主包的相似度,避免被Google识别,然后进行了混淆处理。处理 dex 利用 BlackObfuscator-GUI 等工具处理后对 apk。

qq_38794072的博客 3749

对java jar包实现混淆加密

java代码混淆器,可以混淆函数变量、类、方法名以实现代码加密,java jar 混淆 工具 反编译

Android 混淆--反编译工具具体使用步骤

1、参考文档郭霖大神的文档 https://blog.youkuaiyun.com/guolin_blog/article/details/49738023 https://blog.youkuaiyun.com/guolin_blog/article/details/50451259 工具类:csdn的资源文件上 反编译 1、将apk后缀名改成zip文件,加压会生成一个classes.dex文件。 2、...

亦然莹儿的博客 936

Vue3集成百度实时语音识别

Vue3集成百度实时语音识别

weixin_61769998的博客 548

Java 简易版 UDP 多人聊天室

【代码】Java 简易版 UDP 多人聊天室。

nmy15570188135的博客 1187

如何用 Python 实现反编译混淆后的APK

apktool:这也是一个开源工具,可以反编译 APK 文件,并提供 Smali 代码。使用 apktool 可以将 Smali 代码转换为 Java 代码,进而还原混淆前的代码。JADX:这是一个开源工具,可以将 APK 文件转换为 Java 代码,包括混淆后的代码。需要注意的是,尽管使用这些工具可以还原 APK 混淆前的代码,但由于混淆后的代码本身已经被修改和优化,因此还原后的代码可能与原始代码略有不同,需要根据实际情况进行修改和调整。安装并配置好反编译工具,比如 jadx 和 apktool。

asd2278344的博客 1673

GBASE南大通用GBase 8s数据库-从零开始的手动安装与实例配置指南

本文详细介绍了GBASE南大通用GBase 8s数据库的手动安装与实例配置全过程,包括环境准备、用户创建、安装包准备、实例创建、环境变量配置等关键步骤。通过实战经验分享和常见问题解决方案,帮助用户快速掌握GBase 8s数据库的安装与配置技巧,确保数据库稳定运行。

weixin_29209825的博客 454

安卓混淆及反编译工具

目录 安卓混淆及反编译工具... 1 Eclipse编译混淆... 2 项目文件project.properties. 2 服务器编译混淆... 2 Android.mk. 2 混淆规则... 3 Java代码的混淆... 3 Proguard混淆规则汇总... 3 Native的混淆... 4 资源文件的混淆... 4 混淆的常见配置... 4 哪些不应该混淆... 8 ...

JannaLius的博客 1186

避坑指南:ZYNQ PS端读写BRAM时容易忽略的5个配置细节(基于Vivado 2022.1)

本文基于Vivado 2022.1,总结了ZYNQ PS端读写单口BRAM时5个易被忽略的关键配置细节。内容涵盖关闭Safety Circuit以优化时序、精确匹配AXI控制器与BRAM的地址深度、注意PS端函数位宽与地址对齐、正确连接时钟复位域,并提供了实用的调试技巧与诊断代码,帮助工程师规避常见陷阱,确保数据交互稳定可靠。

net55的博客 373

AutoCAD 2024 LISP实用技巧:自定义快捷命令与高效绘图工具集

本文详细介绍了如何在AutoCAD 2024中部署和使用LISP脚本,打造高效绘图工具集。通过自定义快捷命令,如WFF(超级文字查找替换)、GQT(图层隔离)和LLTJ(智能长度统计),可大幅简化图层管理、文字编辑和测量统计等重复性操作,显著提升绘图效率。

gan8painter的博客 317

安卓反编译原理,安卓签名与应用混淆

文章摘要:本文系统介绍了安卓应用反编译、混淆与签名的技术要点。反编译部分详述了APK反编译原理、常用工具(jadx、apktool等)及使用场景;混淆章节讲解了代码混淆的作用、配置方法及自定义规则;签名环节阐述了签名原理、方案演进及生成步骤。三者共同构成了安卓应用安全防护体系,开发者可通过这些技术手段保护代码安全、防止恶意篡改。文章内容详实,包含具体操作示例和问题解决方案,对安卓开发者具有实用参考价值。

appron的博客 1070

AUTOSAR R20-11标准下载!

这是公众号的第2篇推文,粉丝数49 Document Search Classic Platform Adaptive Platform Foundation 文档截图 以为会在明天的发布会之后才上线,没想到官网现在就悄悄放出来了。 中国由于网络问题,下载速度比较慢或者会中断。 “阅读原文”提供多种下载方式,可以在线浏览,可以集中下载也可单个文档下载。 如有增减我也会及时在公众号里通知大家,不过我觉得不会变动了。 整理不宜,好东西要分...

Adaptive_AUTOSAR的博客 1890

安卓开发之代码混淆

首先在build.gradle中将代码开启混淆false->true。Java层代码上上混淆,对抗反编译,jadx及jeb。看了一眼代码混淆的看不清楚了,估计用jeb才可以稍微看清楚点逻辑。在打包apk的时候有两种模式debug|release。debug调试模式release发布版本。so层上ollvm代码混淆,vmp加固等。今天我们这里说一下java代码混淆,记录一下,方便以后使用。众所周知,一般安卓开发,......

Codeooo 博客 1万+

符合DO-178C和DO-331的机载软件研制体系

DO-178C的核心要求软件开发生命周期:DO-178C定义了软件开发的生命周期过程,包括需求获取、设计、实现、验证和确认等。它为机载软件开发提供了一套系统化的指导,确保在开发过程中考虑安全性和可靠性。安全等级(DAL):根据系统的重要性,DO-178C将软件划分为不同的开发保障等级(DAL A到E),DAL A的要求最为严格,适用于关键安全功能,而DAL E的要求较低,适用于非关键功能。DO-178C在非基于模型软件开发中的应用。

qq_41854911的博客 977

基于深度学习的图像修复系统,GAN图像修复,图像修复算法研究,并实现系统登录和注册,全网独发

近年来,深度学习已成为计算机视觉领域的研究热点,基于深度学习的图像修复技术弥补了传统修复方法长期存在的不足,显著提高了生成结果的质量。深度学习是指模仿人脑机制设计的具有深层结构的神经网络。深度学习作为一种表征学习,通过模仿人脑神经元之间的信息传递方式来学习输入数据的特征,并找到输入和输出数据之间的映射关系。通过在图像修复中应用深度学习技术,可以准确学习图像的语义信息,然后根据信息预测缺失的内容,大大克服了传统修复算法的不足,使结果更具逻辑性。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 8257

Android代码混淆 反编译

一个xxx.apk提交给测试、 ok,去倒杯水,看看网页~~~~~ 呃,忽然觉得 是不是应该 给我的代码 提高点安全性, 记得看过 apk直接可以 解压,然后很容易的就可以 反编译出 .java 找了找,果然,这一切 只不过是 一分钟的事儿, 1、得到 classes.dex文件;直接用你机器上的  解压软件 打开 .apk 文件   解压出 classes.d

Guet326699的专栏 2505

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android 代码混淆及反编译方法

 Android 代码混淆及反编译方法   一、       AndroidSDK自带proguard混淆 在Android SDK中自带有proguard代码混淆器,但在默认的情况下该混淆器是没有打开的。该混淆器在SDK中的路径是android-sdk-windows\tools\proguard 启动android-sdk-windows\tools\proguard\lib\

fancs的专栏 1682

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android 代码混淆机制

Android 代码混淆机制 由于Android项目大部分用的java语言,而java属于高层抽象语言,易于反编译、反汇编,其编译后的程序包包含了大量的源代码变量、函数名、数据结构等信息,根据其编译打包后的APK文件,可以非常容易的得到 近乎源代码质量 的反编译代码。如果不加混淆,相当于直接将源代码拱手送人,内容严密的app权限审核可以说是形同虚设。如果大家想避免源代码泄漏后重新修改策划而额外增加的工

zerooneBader的博客 3447

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android 代码混淆 反编译,Android的反编译和代码混淆

前言包括以下内容要反编译apk需要下面3个工具反编译资源文件反编译类文件代码混淆要反编译apk需要下面3个工具apktool(资源文件获取)作用:资源文件获取,可以提取图片文件和布局文件进行使用查看dex2jar(源文件获取)作用:将APK反编译成java源码(classes.dex转化成jar文件)jd-gui作用:查看APK中classes.dex转化成的jar文件,即源码文件下面进行反编译资...

weixin_39608394的博客 750

android代码混淆和反编译

1. 用proguard混淆代码     android sdk 自带 proguard 包,因此用proguard混淆 很简单,只需简单配置下就好           1.  在 project.properties里开启 proguard :          sdk.dir=D:\\android\\tool\\android-sdk-windows_4.0 proguard

学习、积累、分享 1672

简单教你怎么混淆Android的代码,让你看到混淆和没有混淆的区别。

一、咱们先看看没有混淆的代码反编译后什么样子反编译过程1、把.apk重命名成.zip(因为apk包和zip的算法一样)classes.dex就是代码存放的位置,下一步我们把dex转成jar2、dex文件转成jar文件需要下载一个dex2jar文件     https://sourceforge.net/projects/dex2jar/把工具解压到文件夹,为了方便省去输入路径,我们把上一步得到的c...

u013139425的博客 9576

android工程混淆和反编译

一、工程文件的混淆 混淆文件下载:http://download.youkuaiyun.com/detail/lxq_xsyu/6328751 1、在根目录下添加progard.cfg文件        2、打开project.properties在底下添加proguard.config=proguard.cfg # This file is automatically generated b

水寒 2449

安卓proguard代码混淆以及反编译工具

混淆以及反编译那些事儿 含义解释: - 压缩(Shrink): 检测并删除未使用的类,字段,方法和属性。 - 优化(Optimize): 分析并优化方法的字节码。 - 混淆(Obfuscate): 使用简短的无意义名称例如a,b,c等,重命名类,字段和方法。 - 预检(Preveirfy): 主要是在Java平台上对处理后的代码进行预检。 #### 输入/输出配置项 ```groovy @filename ```

热爱技术 1795
上一篇: Linux下Wine QQ 2012
下一篇: Android盈利模式,哪种更靠谱?
普通网友
博客等级 码龄17年 125粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值