Получение сигнатуры метода MRMediaRemoteSendCommandToApp из частного фреймворка MediaPlayer.framework

В частности, я ищу сигнатуру метода MRMediaRemoteSendCommandToApp. 'здесь немного не могу много использовать его.

Для MRMediaRemoteSendCommand доступны определения, которые могут выглядеть так:

typedef enum {
    kMRPlay = 0,
    kMRPause = 1,
    kMRTogglePlayPause = 2,
    kMRStop = 3,
    kMRNextTrack = 4,
    kMRPreviousTrack = 5,
    kMRToggleShuffle = 6,
    kMRToggleRepeat = 7,
    kMRStartForwardSeek = 8,
    kMREndForwardSeek = 9,
    kMRStartBackwardSeek = 10,
    kMREndBackwardSeek = 11,
    kMRGoBackFifteenSeconds = 12,
    kMRSkipFifteenSeconds = 13,
    kMRLikeTrack = 0x6A,
    kMRBanTrack = 0x6B,
    kMRAddTrackToWishList = 0x6C,
    kMRRemoveTrackFromWishList = 0x6D
} MRCommand;
Boolean MRMediaRemoteSendCommand(MRCommand command, id userInfo);

Как предлагается в разделе Получение подписей частных методов API для iOS вопрос, я пробовал class-dump, но не нашел ни одного из методов. Hopper Disassembler v4 показал правильные символы, но я не мог понять, как получить сигнатуру метода для любого из методов.


person Dave    schedule 18.12.2019    source источник


Ответы (1)


class-dump в первую очередь имеет дело с классами Objective-C, это обычная функция C.

Boolean MRMediaRemoteSendCommandToApp(MRMediaRemoteCommand command, NSDictionary *userInfo, _MROriginProtobuf *obj, NSString *bundleIdentifier, unsigned int optionSendOptionsNumber, NSObject<OS_dispatch_queue>* queue, void (^block)(NSError *, NSArray <NSNumber *> *));

MRMediaRemoteSendCommand для внутреннего использования просто вызывает MRMediaRemoteSendCommandToApp, поэтому команды доступны здесь:

_MROriginProtobuf: https://github.com/w0lfschild/macOS_headers/blob/master/macOS/PrivateFrameworks/MediaRemote/54/_MROriginProtobuf.h

Пример использования:

MRMediaRemoteSendCommandToApp(MRMediaRemoteCommandPause, nil, nil, @"com.spotify.client", 0, nil, nil);

Однако после попытки я получил следующую ошибку в Console.app:  введите описание изображения здесь

Все команды были перенаправлены сейчас играющему игроку.

Создание приложения с правами com.apple.mediaremote.send-commands приведет к сбою при запуске. Чтобы предотвратить сбой, вам нужно сделать три вещи:

  1. Удалите право com.apple.security.app-sandbox (Тестовая среда приложения).
  2. Не используйте сертификат подписи, выпущенный Apple (выберите «Нет» для команды в разделе «Подписание и возможности») Знак Xcode для локального запуска
  3. Запретить AMFI проверять права com.apple.mediaremote.send-commands. Я рекомендую использовать это расширение ядра.
person Dimitar Nestorov    schedule 28.04.2020
comment
Это показывает подпись метода для MRMediaRemoteSendCommand. Вопрос заключается в поиске сигнатуры метода для MRMediaRemoteSendCommandToApp метода. - person Dave; 28.04.2020
comment
Спасибо за обновление, я все еще не уверен, как определить подпись метода из файла заголовка? - person Dave; 29.04.2020
comment
@ Дэйв не уверен, что понимаю твой вопрос. Заголовочные файлы содержат сигнатуры методов. Какой файл заголовка? - person Dimitar Nestorov; 29.04.2020
comment
Файл заголовка, с которым вы связались, имеет подпись метода для MRMediaRemoteSendCommand. Мне интересно, как вы узнали, какие параметры передать MRMediaRemoteSendCommandToApp? - person Dave; 29.04.2020
comment
@Dave Я потратил пару часов на Hopper, Ghidra и IDA, чтобы посмотреть, что происходит внутри этих функций, чтобы выяснить, какие параметры ожидают эти функции. Иногда мне нужно было углубиться в 6-7 функций. Затем я попытался передать возможно ожидаемые параметры, чтобы увидеть, не произойдет ли сбой. - person Dimitar Nestorov; 29.04.2020