前言
每次App重新运行后native函数加载的绝对地址是会变化的,唯一不变的是函数相对于基地址的偏移,因此我们可以在获取模块的基地址后加上固定的偏移地址获取相应函数的地址,Frida中也正好提供了这种方式:先通过Module.findBaseAddress(name)或Module.getBaseAddress(name)两个API函数获取对应模块的基地址,然后通过add(offset)函数传入固定的偏移offset获取最后的函数绝对地址。以下使用stringFromJNI3中的stringFromJNI3作为具体案例讲解下思路和注意的点。
动态注册的函数
// MainActivity.java
package com.roysue.ndktest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.roysue.ndktest.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
// Used to load the 'ndktest' library on application startup.
static {
System.loadLibrary("ndktest");
}
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater()

文章讲述了在Android应用中,由于native函数的地址在每次App运行时可能会变化,但相对于基地址的偏移保持不变。通过Frida的Module.findBaseAddress和add方法可以获取函数地址。以一个具体的例子展示了如何动态注册native方法stringFromJNI3,并使用Frida的hook(RegisterNatives)脚本来找到函数的偏移地址,然后编写hookNative.js脚本进行函数拦截。强调了App重新编译可能导致函数偏移地址改变,需要更新hook脚本。
最低0.47元/天 解锁文章
740

被折叠的 条评论
为什么被折叠?



