android - 在 Android 中对 Log-function 的所有调用中混淆或删除字符串文字

标签 android string reverse-engineering obfuscation

我们正在构建一个 Android 应用程序,其中使用 Timber 进行日志输出。我们定义了自己的 .e、.d、.v 等函数,并使用 if (BuildConfig.DEBUG) 来查看是否应该输出日志。这解决了我们不想在版本中输出调试日志但函数调用中使用的所有字符串文字仍然存在于编译的源代码中的问题。我们还使用 ProGuard 进行混淆。举个例子,在一个类中我们可以有:

somObj.normalFunction(variable)
Log.d("This secret class achieved its secret mission!");

在我们的版本中,这不会在应用日志中看到,但如果您对 APK 进行逆向工程,您将看到类似以下内容的内容:

q.b(m)
z.a("This secret class achieved its secret mission!");

这可以向黑客暗示他们正在查看什么类。 因此,我们正在寻找的是能够在编译时完全删除所有 Log 函数调用(使用一些预处理、注释或其他东西,但希望不必在每个函数调用之前添加某些内容)或混淆所有这些函数调用的字符串文字参数。因此,两个理想的解决方案是,如果源代码在编译之前看起来像:

q.b(m);

q.b(m);
z.a("jgasoisamgp23mmwaföfm,ak,ä")

仅仅通过思考,我就可以看到两种实现这一目标的糟糕方法。要么我们用 if(BuildConfig.DEBUG) 包围对 Log.d 的所有调用,这将使编译器在编译之前删除它们。但这是非常潮的。或者,我们确保每次您想要添加日志打印输出时都需要执行

Log.d(LogClass.getLog(1234)) 

然后在 LogClass 中定义所有这些日志,然后使用 if(BuildConfig.DEBUG) 删除它们,如果是这种情况,则在 getLog 中返回 null。但这使得每次您想要添加日志时都变得更加潮。

最后,有什么好的解决方案吗?

最佳答案

免责声明:我为 PreEmptive 工作,制造PreEmptive Protection - DashO的公司.

DashO 能够删除对特定方法(例如 Log 方法)的调用。虽然这不会删除加载字符串文字的指令,只是删除调用本身,但 DashO 还提供字符串加密,这将为这些字符串文字提供一些保护。

举个例子,我通过 DashO 运行这个类:


    public class App {
        public static void main(String[] args) {
            Log.d("Secret message here"); 
        }
    }

在启用字符串加密的情况下删除对 Log.d 的调用后,反编译输出如下所示:

    public class App
    {
      public static void main(String[] paramArrayOfString)
      {
        a.replace("Bwpfpb7u|ih}z{?($0&", -12 - -61);
      }
    }

DashO 提供了其他可能破坏反编译器的保护措施(例如控制流混淆);我已经在本次演示中关闭了这些功能。

关于android - 在 Android 中对 Log-function 的所有调用中混淆或删除字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56462191/

相关文章:

string - Powershell脚本替换由于 “(”或 “)”而导致的路径字符串中的字符错误

python - 如何从给定的字符串中提取字符和数值?

java - 检查字符串是否不仅包含整数

debugging - 反编译 DyLib(动态库)

assembly - Ghidra:自动将字节设置为 Unicode/CString

java - PreferenceCategory 主题不适用于 PreferenceScreen

java - 区分 "out of range"或 "in range, but no listening server socket"? (蓝牙)

java - Android:如何点击我的通知直接转到特定屏幕?

c - 使用偏移量取消引用多级指针的最简洁方法是什么?

android - 如何在 Android Studio 中使用相应的应用内购买 API 为亚马逊应用商店和谷歌 Play 商店构建 apk