Loading

修改aosp进行函数调用监控

最近遇到一个问题,如何从系统层面实现动态java函数调用的监控

这个问题源于我之前frida实现监控有很多局限性,因此这次直接修改源码就行监控

aosp源码编译的教程在我另一个博客里有
https://hslxy.top/index.php/2022/08/09/编译android-7-1源码/

这里补充一下重新生成镜像的命令是
make snod

刷驱动
https://developers.google.com/android/drivers#walleyeopm1.171019.013
下载好了在源码根目录运行

刷手机,将编译好的镜像用fastboot刷入
20221216113859
用这个img文件

adb reboot fastboot
fastboot devices //查看是否连接成功

如果连接不上,在这下驱动,并在设备管理器找到其他设备中有个android,将驱动安好

https://github.com/xushuan/google_latest_usb_driver_windows

参考链接 https://blog.csdn.net/qq_33529867/article/details/113665717

我用的aosp版本8.1

实现函数监控

20221216112219

在art/runtime/interpreter/interpreter_common.h
在483行后添加这段

// const char* methodName = shadow_frame.GetMethod()->PrettyMethod().c_str();
std::ostringstream oss;
std::string inst_str = inst->DumpString(shadow_frame.GetMethod()->GetDexFile());
// 监控指令如果是invoke或者return,就将其记录下来
if(strstr(inst_str.c_str(), "invoke") || strstr(inst_str.c_str(), "return")){
    // 记录函数名、invoke指令、return指令
    oss << shadow_frame.GetMethod()->PrettyMethod() << " @@ " <<inst->DumpString(shadow_frame.GetMethod()->GetDexFile());
    LOG(ERROR) << oss.str();
}

修改运行模式
20221216112715
在art/runtime/interpreter/interpreter.cc将237行修改为

static constexpr InterpreterImplKind kInterpreterImplKind = kSwitchImplKind;

监控动态注册

20221216112818

在art/runtime/jni_internal.cc的2264行添加一个输出

LOG(WARNING) << "JNI RegisterNativeMethods: " << c->PrettyDescriptor() << " name:" << name << " sig:" << sig << " fnPtr:" << fnPtr;

修改android:debuggable始终为true

frameworks/base/services/core/java/com/android/server/pm/PackageDexOptimizer.java
20221216113331

将282行注释,改为始终为true

- boolean debuggable = (flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ boolean debuggable = true;
posted @ 2022-12-16 11:42  要努力哇  阅读(461)  评论(0)    收藏  举报