android 混淆 去掉log,Android去掉/混淆Log,反编译都看不到
原标题:Android去掉/混淆Log,反编译都看不到
出发点:
当然是由于编程习惯太好,打了一堆中文log,其实只是想给测试看。然而如果包被反编译,看log基本都能理解流程了,有点尴尬。所以此文主要探究proguard配置,以去除log。
以下过程示例,来自于这段代码。
publicclassMainActivityextendsAppCompatActivity{
privatestaticfinalString TAG = "MainActivity";
privateString a = "a";
privateString b = "b";
@Override
protectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "This is"+ a + b);
}
}
啥都不配置的情况下,反编译的smali代码如下:
# virtual methods
. method publiconCreate(Landroid/os/Bundle;)V
.locals 2
invoke-super {p0, p1}, Landroid/support/v7/app/c;->onCreate(Landroid/os/Bundle;)V
constp1, 0x7f09001b
invoke- virtual{p0, p1}, Lcom/rentee/logremove/MainActivity;->setContentView(I)V
const- stringp1, "MainActivity"
new-instance v0, Ljava/lang/StringBuilder;
const- stringv1, "This is"
invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V
iget- objectv1, p0, Lcom/rentee/logremove/MainActivity;->m:Ljava/lang/String;
invoke- virtual{v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
iget- objectv1, p0, Lcom/rentee/logremove/MainActivity;->n:Ljava/lang/String;
invoke- virtual{v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke- virtual{v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result- objectv0
invoke- static{p1, v0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
return- void
.end method
很明显,整条字符串拼接过程是由StringBuilder完成的。
1.在build.gradle配置proguard-android-optimize.txt,因为默认的proguard-android.txt优化开关是关了的,而proguard的assumenosideeffects、
assumenoexternalsideeffects配置是需要开启优化开关的。
buildTypes{
release{
minifyEnabledtrue
proguardFiles getDefaultProguardFile( 'proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
在proguard-rules.pro文件中配置assumenosideeffects。这是网上的通用大解。
-assumenosideeffects classandroid.util.Log{
publicstaticbooleanisLoggable(java.lang.String, int);
publicstaticintv(...);
publicstaticinti(...);
publicstaticintw(...);
publicstaticintd(...);
publicstaticinte(...);
}
不过也的确存在一个问题,就是去除不干净,反编译后,smail如下:
# virtual methods
. method publiconCreate(Landroid/os/Bundle;)V
.locals 1
invoke-super {p0, p1}, Landroid/support/v7/app/c;->onCreate(Landroid/os/Bundle;)V
constp1, 0x7f09001b
invoke- virtual{p0, p1}, Lcom/rentee/logremove/MainActivity;->setContentView(I)V
new-instance p1, Ljava/lang/StringBuilder;
const- stringv0, "This is"
invoke-direct {p1, v0}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V
iget- objectv0, p0, Lcom/rentee/logremove/MainActivity;->m:Ljava/lang/String;
invoke- virtual{p1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
iget- objectv0, p0, Lcom/rentee/logremove/MainActivity;->n:Ljava/lang/String;
invoke- virtual{p1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
return- void
.end method
Log的相关代码没了,但是还是有StringBuilder的拼接过程在,这个从根本上解决不了问题。
2.进化版,proguard 6.0以上版本新增了assumenoexternalsideeffects和assumenoexternalreturnvalues,这两个属性6.0才引入,Android自带proguard-gradle插件并没有这么新,所以要在工程项目根目录配置如下strategy,强制将progurad指定到6.0以上版本。
build {
configurations.all {
resolutionStrategy {
force "net.sf.proguard:proguard-gradle:6.0.3"
}
}
}
然后在progaurd-rules.txt文件中增加如下配置:
-assumenoexternalsideeffects classjava.lang.StringBuilder{
publicjava.lang.StringBuilder();
publicjava.lang.StringBuilder( int);
publicjava.lang.StringBuilder(java.lang.String);
publicjava.lang. StringBuilder append(java.lang.Object);
publicjava.lang. StringBuilder append(java.lang.String);
publicjava.lang. StringBuilder append(java.lang.StringBuffer);
publicjava.lang. StringBuilder append(char[]);
publicjava.lang. StringBuilder append(char[], int, int);
publicjava.lang. StringBuilder append(boolean);
publicjava.lang. StringBuilder append(char);
publicjava.lang. StringBuilder append(int);
publicjava.lang. StringBuilder append(long);
publicjava.lang. StringBuilder append(float);
publicjava.lang. StringBuilder append(double);
publicjava.lang. String toString();
}
-assumenoexternalreturnvalues publicfinalclassjava.lang.StringBuilder{
publicjava.lang. StringBuilder append(java.lang.Object);
publicjava.lang. StringBuilder append(java.lang.String);
publicjava.lang. StringBuilder append(java.lang.StringBuffer);
publicjava.lang. StringBuilder append(char[]);
publicjava.lang. StringBuilder append(char[], int, int);
publicjava.lang. StringBuilder append(boolean);
publicjava.lang. StringBuilder append(char);
publicjava.lang. StringBuilder append(int);
publicjava.lang. StringBuilder append(long);
publicjava.lang. StringBuilder append(float);
publicjava.lang. StringBuilder append(double);
}
这段配置的作用是,去除返回值无用的StringBuilder的相关操作,由于在第2点配置后,Log相关代码被去除,所以Log中的字符串拼接也是无用的,会被去除。配置后smali代码是:
# virtual methods
. method publiconCreate(Landroid/os/Bundle;)V
.locals 0
invoke-super {p0, p1}, Landroid/support/v7/app/c;->onCreate(Landroid/os/Bundle;)V
constp1, 0x7f09001b
invoke- virtual{p0, p1}, Lcom/rentee/logremove/MainActivity;->setContentView(I)V
return- void
.end method
是的,一句都没有了,干干净净,爽!
android 混淆 去掉log,Android去掉/混淆Log,反编译都看不到相关推荐
- Android APK程序加密,防止被别人反编译
作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来. Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-s ...
- Android如果对APK进行加密,提高反编译难度(思路)
提高反编译难度的几种方式: 对于软件安全来说,有攻就要有防才对.不然,Android整个产业链就会被这样的Crack给毁掉. 第一种办法:将核心代码用JNI写进so库中.由于so库的反编译和破解的难度 ...
- 自己写的android apk反编译,获取Android自己写好了的apk以及反编译
今天,我们先说一下,获取Android自带的apk以及反编译它们来学习Android工程师是怎样写的,今天我们就以拿到Android自带的短信管理器的apk为例子 你可能有疑问,为什么要那么麻烦,从系 ...
- Android逆向去掉某功能,逆向教程之-反编译apk完全精简删除菜单功能(二)
本帖最后由 liuxiaoxin 于 2020-12-3 19:00 编辑 授人以鱼,不如授人以渔! 本教程图文并茂,步骤非常详细,偏小白向,大佬请自觉屏蔽. 使用工具:MT管理器免费版 被修改的软件 ...
- 使用VS自带的混淆器防止你的程序被反编译
这里就介绍大家使用VS自带的混淆器dotfuscator.exe来阻止这种行为. 首先要做的找到dotfuscator.exe: D:/Microsoft Visual Studio .NET 200 ...
- android 混淆规则作用,Android混淆规则
简介 Java代码是非常容易反编译的.为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理. ProGuard是一个混淆代码的开源项目.它的主要作用就是混淆,当然它还能对字节码 ...
- Android混淆编译、反混淆、反编译
混淆编译 为了保护APK代码和架构,不轻易被外部人员反编译和破解,对发布的APK,所以必须进行代码混淆编译. Java 是一种跨平台的.解释型语言,Java 源代码(.java文件)编译成中间&quo ...
- android开发笔记之 Android代码混淆打包
大家应该都听过代码混淆吧,如果大家有去反编译过别人的APK的话,应 该会看到好多包名和类名是a,b.c-.之类的的吧,这里就提到了一个概念: 混淆. 那就让我们了解下这个东西吧 作用:为了防止自己的劳 ...
- android proguard 不起作用,Android-ProGuard 混淆
前言 现在写的app 基本都是经过混淆了的,如果不混淆, 发布出去,别人一反编译 就可以直接看你的源码了 我现在用的AndroidStudio , 只需要在 build.grade 的配置文件中配置如 ...
最新文章
- 缅怀袁隆平院士:一颗稻谷里的爱国情怀
- 计算机可以待机无法关机,win7怎么设置不待机?如何设置自动关机的方法【详解】...
- 存储过程系列之存储过程返回值总结
- new对象后的代码块(匿名类)
- MongoDB数据库学习
- mac双系统w ndows8,U盘如何安装MAC双系统
- 【Python】 Python小游戏-贪吃蛇大冒险
- java程序员月薪3万需要掌握哪些技术?技术水平需要到什么程度?
- 微信JSAPI支付调不起收银台问题
- dvwa上传php文件,DVWA之文件上传漏洞
- 手机读卡但显示无服务器,手机不读卡了怎么修复
- PHP Fatal error: Uncaught Error: Class ‘\Elasticsearch\Serializers\SmartSerializer‘ not found in /h
- 加载json文件注意事项
- 创业日志(十二) 关于怠惰
- ArcBlock 将出席以太坊经典峰会 | ABT 预告
- 夏天你给你的爱车保养该怎么做
- php获取中文字符拼音首字母
- 时间戳和日期转换工具
- kernel启动优化
- ChatGPT写2023高考语文新课标I卷作文