美文网首页
逆向安全之Proguard删除Log日志

逆向安全之Proguard删除Log日志

作者: f1abf4d2779c | 来源:发表于2017-08-04 00:56 被阅读940次

我们都知道,日志属于非常敏感的信息,逆向工程师在逆向你的程序的时候,本来需要捕捉你程序的各种输出,然后进行推测,顺藤摸瓜然后得到需要的信息,一旦你的日志泄漏,会大大增大程序被破解的风险。

大部分开发者打印日志的做法

  1. 直接判断BuildConifg.DEBUG或者自己做一个开关
  2. 自己定义LOG输出,使用开关来统一判断是否打印日志
示例代码
public class LogUtil {

    // 打印日志的开关, 发布的时候修改为false
    private static boolean DEBUG = true;
    
    public static void d(String tag, String msg) {
        if (DEBUG) android.util.Log.d(TAG, msg);
    }

    // 其他日志打印代码
    ...
}

// 打印日志
LogUtil.d("Test", "this is a test")

上面的方式有一个问题,虽然在release版本里面,确实没有日志输出,但是输出日志的代码依然存在,只是没有执行到!(if条件不成立)所以,有没有办法让这些代码执行到呢?简单来说,就是能不能在release版本里面把这个DEBUG变量弄成true呢?当然可以!而且做法还非常简单,具体参考下面的链接:

http://www.jianshu.com/p/a42e6e7dc3da

让release版本里面不包含日志代码

从上面的分析我们得到一个结论:如果需要程序是“日志安全的”,那么release版本里面不应该存在任何输出日志的代码。

下面介绍一种小技巧,利用Proguard去除日志信息:

在build.gradle中使用

// 注意是proguard-android-optimize.txt,这是google提供的优化日志混淆配置
// 其中proguard-rules.pro是你项目自己的混淆文件
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

在proguard-rules.pro中使用

# 删除系统日志语句
-assumenosideeffects class android.util.Log {
     public static boolean isLoggable(java.lang.String, int);
     public static int v(...);
     public static int i(...);
     public static int w(...);
     public static int d(...);
     public static int e(...);
}
# 删除自定义的日志提示类提示语句 
-assumenosideeffects class com.onemt.sdk.base.framework.utils.LogUtil {
     public static *** v(...);
     public static *** i(...);
     public static *** w(...);
     public static *** d(...);
     public static *** e(...);
}

Ps:如果在混淆文件中指定了以下命令,Proguard将不会优化输入的类文件,也就是不会删除日志语句。

#不优化输入的类文件,若使用则日志不会被清除
-dontoptimize

相关文章

网友评论

      本文标题:逆向安全之Proguard删除Log日志

      本文链接:https://www.haomeiwen.com/subject/jdimlxtx.html