mediaserverd
1、mediaserverd是什么
mediaserverd(/usr/sbin/mediaserverd)是被root进程launchd启动的一个后台(daemon)进程,其描述文件为com.apple.mediaserverd.plist存放在
/System/Library/LaunchDaemon目录下,系统在启动的时候会扫描该目录下面所有的plist文件,分别启动所有后台进程,大概有
50多个,后台进程是iOS系统实现伪后台的真正原因。

com.apple.mediaserverd.plist 描述了mediaserverd启动、以及服务的相关信息,mediaserverd主要为系统提供音视频编解码的服务,包含声音输出录音,视频解码编码等。
通过plist中 com.apple.airplay.sender.xpc 的描述,可以看出来mediaserverd提供了一个xpc的服务
XPC是苹果系统上一种进程间通信的技术,XPC 目的是提高 App 的安全性和稳定性。XPC 让进程间通信变得更容易,让我们能够相对容易地将 App 拆分成多个进程的模式。
<key>MachServices</key> <dict> <key>com.apple.BTAudioHALPlugin.xpc</key> <true/> <key>com.apple.airplay.sender.xpc</key> <true/> <key>com.apple.audio.AUPBServer</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.audio.AURemoteIOServer</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.audio.AudioConverterServer</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.audio.AudioFileServer</key> <true/> <key>com.apple.audio.AudioQueueServer</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.audio.AudioSession</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.audio.AudioUnitServer</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.audio.SystemSounds</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.admin</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.asset</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.assetimagegenerator</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.audiodeviceclock</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.audioprocessingtap</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.cpe</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.cpeprotector</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.endpoint</key> <true/> <key>com.apple.coremedia.formatreader</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.mutablecomposition</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.recorder</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.remaker</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.sandboxserver</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.videocompositor</key> <true/> <key>com.apple.coremedia.videoqueue</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.virtualdisplay</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.coremedia.virtualdisplayserver</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.fig.movie</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.mediaserverd</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.videoconference.avconference</key> <dict> <key>ResetAtClose</key> <true/> </dict> <key>com.apple.videoconference.camera</key> <dict/> </dict>
2、mediaserverd进程的作用和工作原理
mediaserverd提供音视频服务功能,用户app进程通过调用xpc服务,对视频进行解码编码。
xpc调用参考:https://objccn.io/issue-14-4/
音视频的解码涉及到对硬件的操作,mediaserverd中包含大量调用驱动层的代码,通过xpc可以防止用户进行溢出攻击,提高系统的稳定性。因为同一的xpc接口,跨进程,提高了溢出攻击伪造数据的难度。
在越狱手机上通过对mediaserverd中声音的服务进行hook,可以进行录音,比如通话录音等。
3、mediaserverd 中有用的方法
通过反汇编发现mediaserverd由C编写,不是mach-o格式的二进制文件,反汇编之后暴露出来的符号较少,通过class-dump无法提取有用信息。
下面是一段播放系统铃音的代码
int sub_b4fc() {
sp = sp - 0x8;
r0 = *0x23b50;
if (r0 != 0x0) goto loc_b5fc;
loc_b514:
r0 = dlopen("/System/Library/PrivateFrameworks/MediaToolbox.framework/MediaToolbox", 0x1);
*(0x23b50 + 0x4) = r0;
if (r0 != 0x0) goto loc_b54a;
loc_b528:
r1 = dlopen("/System/Library/PrivateFrameworks/Celestial.framework/Celestial", 0x1);
r0 = 0x21666967;
*(0x23b50 + 0x4) = r1;
if (r1 == 0x0) goto .l3;
loc_b54a:
dlerror();
*0x23b50 = dlsym(*(0x23b50 + 0x4), "FigMediaServerStart");
r0 = dlerror();
if ((r0 != 0x0) || (*0x23b50 == 0x0)) goto loc_b600;
loc_b56e:
*(0x23b50 + 0x8) = dlsym(*(0x23b50 + 0x4), "FigMediaServerStop");
r0 = dlerror();
if ((r0 != 0x0) || (*(0x23b50 + 0x8) == 0x0)) goto loc_b600;
loc_b58e:
*(0x23b50 + 0xc) = dlsym(*(0x23b50 + 0x4), "FigMediaServerSystemSoundIDShouldPlayWithVolume");
r0 = dlerror();
if ((r0 != 0x0) || (*(0x23b50 + 0xc) == 0x0)) goto loc_b600;
loc_b5aa:
*(0x23b50 + 0x10) = dlsym(*(0x23b50 + 0x4), "FigMediaServerVibrateForSystemSoundID");
r0 = dlerror();
if ((r0 != 0x0) || (*(0x23b50 + 0x10) == 0x0)) goto loc_b600;
loc_b5c6:
*(0x23b50 + 0x14) = dlsym(*(0x23b50 + 0x4), "FigMediaServerSystemSoundIDActivate");
r0 = dlerror();
if ((r0 != 0x0) || (*(0x23b50 + 0x14) == 0x0)) goto loc_b600;
loc_b5e2:
r4 = 0x23b50;
asm{ ldrd r0, r1, [r0] };
asm{ stm.w sp, {r0, r1} };
FigRecalcSumIndex();
r0 = *r4;
goto loc_b5fc;
loc_b5fc:
r0 = (r0)(r0);
return r0;
.l3:
return r0;
loc_b600:
r1 = "%s\n";
r3 = *___stderrp;
fprintf(r3, r1);
r0 = 0x21666967;
return r0;
}

浙公网安备 33010602011771号