Фрида - хук android родной C ++ API - PullRequest
0 голосов
/ 15 апреля 2020

Скажем, android медиасервер имеет 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

Теперь я могу sh подключить последний:

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 коде:

    android :: NuPlayer :: setDataSourceAsyn c (int, long long, long long)

  2. Первый аргумент int - это дескриптор файла, аналогично открытому возвращаемому значению. как я могу использовать этот fd для выгрузки файла на диск в javascript?

1 Ответ

0 голосов
/ 15 апреля 2020

1. Можно ли использовать выделенное имя, как показано ниже, в javascript коде:

Вам необходимо связать с Python, используйте send('mangle:' + func_name)

In * Сторона 1036 * - 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/:$//'

Это утомительная работа> <</p>

2. Первый аргумент int - это файловый дескриптор, как и открытое возвращаемое значение. как я могу использовать этот 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 
...