【问题标题】:Obfuscating android API混淆android API
【发布时间】:2019-01-05 19:54:02
【问题描述】:

我正在阅读一些关于在保护 Android 应用程序免受逆向工程方面混淆的不同方法的文章。我想到的一件事是,是否可以混淆 android API?假设我有一个这样的 android 代码:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Base64;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Hello", "World");
    }
}

有什么方法可以混淆代码以获得这样的东西:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import x.y.z;

public class MainActivity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        z.w("Hello", "World");
    }
}

我想出了两种方法:

  1. 创建一个包x,有一个子包y,有一个类z。类z 必须有一个名为w 的方法,该方法调用Log.d。实际上,这里使用了一个间接层,逆向工程稍微困难了一点。
  2. 创建一个包x,有一个子包y,有一个类z。从here 获取android.util.Log 的源代码并将整个代码粘贴到类z 中(记得将方法d 重命名为w)。这肯定会增加代码大小,但会使逆向工程变得更加困难。

这些方法正确吗?有更简单的方法吗?

更新:

一篇提到android API的文章可以被混淆:

ViewDroid: Towards Obfuscation-Resilient Mobile Application Repackaging Detection,第 5.2.1 节

【问题讨论】:

    标签: android obfuscation


    【解决方案1】:

    创建一个包 x,有一个子包 y,有一个类 z。类 z 必须有一个名为 w 的方法,该方法调用 Log.d。实际上这里使用了一个间接层,逆向工程变得更难了。

    创建一个工具来撤消该间接性并不是特别难以创建。

    创建一个包 x,有一个子包 y,有一个类 z。从这里获取 android.util.Log 的源代码并将整个代码粘贴到类 z 中(记得将方法 d 重命名为 w)。这肯定会增加代码大小,但会使逆向工程变得更加困难。

    它也不会编译,因为您的应用无法访问 com.android.internal.* 符号、各种 native 方法等。

    这些方法正确吗?

    如果“正确”是指“将编译并运行”,则第一个会。

    【讨论】:

    猜你喜欢
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    相关资源
    最近更新 更多