假设 android mediaserver 具有以下 API:
$ nm --demangle --dynamic libmediaplayerservice.so |grep setDataSourceAsync
0005c6f0 T android::NuPlayer::setDataSourceAsync(android::sp<android::DataSource> const&)
0005c008 T android::NuPlayer::setDataSourceAsync(android::sp<android::IStreamSource> const&)
0005c18c T android::NuPlayer::setDataSourceAsync(android::sp<android::IMediaHTTPService> const&, char const*, android::KeyedVector<android::String8, android::String8> const*)
0005c49c T android::NuPlayer::setDataSourceAsync(int, long long, long long)
$ nm -D libmediaplayerservice.so |grep setDataSourceAsync
0005c6f0 T _ZN7android8NuPlayer18setDataSourceAsyncERKNS_2spINS_10DataSourceEEE
0005c008 T _ZN7android8NuPlayer18setDataSourceAsyncERKNS_2spINS_13IStreamSourceEEE
0005c18c T _ZN7android8NuPlayer18setDataSourceAsyncERKNS_2spINS_17IMediaHTTPServiceEEEPKcPKNS_11KeyedVectorINS_7String8ES9_EE
0005c49c T _ZN7android8NuPlayer18setDataSourceAsyncEixx
现在我想钩最后一个:
0005c49c T android::NuPlayer::setDataSourceAsync(int, long long, long long)
下面的代码可以工作,但 API 名称被破坏:
var libname = "libmediaplayerservice.so";
var funame = "_ZN7android8NuPlayer18setDataSourceAsyncEixx";
Interceptor.attach(Module.getExportByName(libname, funame), {
onEnter: function(args) {
console.log("onEnter: call fun enter");
},
onLeave: function(retval) {
console.log("onLeave: call fun leave");
}
});
两个问题:
是否可以在 javascript 代码中使用如下所示的 demangled 名称:
android::NuPlayer::setDataSourceAsync(int, long long, long long)
- 第一个参数
int
是一个文件描述符,就像打开返回值一样。如何使用这个 fd 将文件转储到 javascript 中的磁盘?