1

假设 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");
    }
});

两个问题:

  1. 是否可以在 javascript 代码中使用如下所示的 demangled 名称:

    android::NuPlayer::setDataSourceAsync(int, long long, long long)

  2. 第一个参数int是一个文件描述符,就像打开返回值一样。如何使用这个 fd 将文件转储到 javascript 中的磁盘?
4

1 回答 1

1

1. 是否可以在 javascript 代码中使用如下所示的 demangled 名称:

您将需要与 Python 绑定,使用send('mangle:' + func_name)

在python方面 -on_message提取func_name并使用subprocess执行g++

def on_message(msg, _data):
    if msg['type'] == 'send':
        if msg['payload'].startswith('mangle:'):
            # mangle
echo "class android{ void setDataSourceAsync(int, long long, long long) {}};void setDataSourceAsync(int,long long, long long){} " |\
 g++ -x c++ -S - -o- |\
 grep "^_.*:$" | sed -e 's/:$//'

工作很累><

2.第一个参数int是一个文件描述符,就像open返回值一样。如何使用这个 fd 将文件转储到 javascript 中的磁盘?

您想保存进入fd?

为了不干扰应用程序的执行,我建议使用dup2,读取它并send写入 python 端或写入sdcard

var fopen = new NativeFunction(Module.findExportByName('libc.so', 'fopen'), 'pointer', ['pointer', 'pointer']);
var our_fd = fopen('/sdcard/tmpfile');
var dup2 = new NativeFunction(Module.findExportByName('libc.so', 'dup2'), 'pointer', ['pointer', 'pointer']);
dup2(fd, our_fd);
// use same technique to read from our_fd 
于 2020-04-15T10:34:19.723 回答