如何检测来自 smali 代码的 JNI 调用?

逆向工程 拆卸 安卓 爪哇
2021-06-26 07:56:27

在 Android 中,JNI 调用可用于从其他来源加载本机代码。从链接http://bobao.360.cn/learning/detail/3765.html,以下示例代码显示了从本机库调用函数“decryptString”时 smali 代码的样子。

const/16 v3, 0x57
new-array v1, v3, [B
fill-array-data v1, :array_2a
.local v1, "encryptedStringBytes":[B
invoke-static {}, Lorg/cf/nativeharness/Cryptor;->getInstance()Lorg/cf/nativeharness/Cryptor;
move-result-object v0
.line 21
.local v0, "c":Lorg/cf/nativeharness/Cryptor;
# v3 contains a String made from encrypted bytes
new-instance v3, Ljava/lang/String;
invoke-direct {v3, v1}, Ljava/lang/String;-><init>([B)V
# Call the decryption method, move result back to v3
invoke-virtual {v0, v3}, Lorg/cf/nativeharness/Cryptor;->decryptString(Ljava/lang/String;)Ljava/lang/String;
move-result-object v3

原始的 Java 代码如下所示:

public class Cryptor {
    private static Cryptor instance = null;
    public static Cryptor getInstance() {
        if (instance == null) {
            instance = new Cryptor();
        }
        return instance;
    }
    public native String decryptString(String encryptedString);
}

smali 代码似乎没有迹象表明正在加载本机代码。smali 代码中的哪些“签名”可以很好地表明 JNI 调用是从原始 Java 代码进行的?

1个回答

您想查看被调用方法的定义。decryptString方法的定义将包含native访问标志,类似于它的相应 java 声明。例如:

.method public native decryptString(Ljava/lang/String;)Ljava/lang/String

此外,您可以查找调用以System.loadLibrary作为应用程序正在加载库以执行 JNI 调用的指示。