witchan 发表于 2023-7-31 17:18

【iOS逆向与安全】sms短信转发插件开发

本帖最后由 witchan 于 2023-7-31 17:48 编辑

# 前言

经过之前的分享,相信大家已经掌握了用户级的插件开发。勤奋好学的你是否对系统级的插件也有着浓厚的性趣,本篇文章将和大家一起学习如何分析并编写一款系统级的插件。

---



# 一、目标

一步步分析并编写一个短信自动转发的deb插件



# 二、工具

- mac系统
- 已越狱iOS设备:脱壳及frida调试
- IDA Pro:静态分析
- 测试设备:iphone6-ios12.5.5



# 三、步骤

## 1、守护进程

​                守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。例如:推送服务、人脸解锁、iCloud、查找我的iPhone、iMessage等。

相应的配置目录:

- /Library/LaunchAgents:管理员控制特定用户的代{过}{滤}理

- /Library/LaunchDaemons:管理员提供的系统级守护进程(cydia、filza、frida等就在这)
- /System/Library/LaunchDaemons:iOS提供的默认守护进程

本文的目的主要短信,所以关注的重点在iOS提供的守护进程,常见的进程配置文件有:

| 名称                           | 描述                  |
| ------------------------------ | ----------------------- |
| com.apple.apsd               | 推送服务                |
| com.apple.biometrickitd.pearl| 人脸解锁                |
| com.apple.cloudd               | iCloud                  |
| com.apple.icloud.findmydeviced | 查找我的iPhone          |
| com.apple.imagent            | 即时消息代{过}{滤}理 (iMessage) |

更多服务请参考https://www.theiphonewiki.com/wiki/Services



## 2、定位关键函数

在iPhone中使用文件管理工具查看`/System/Library/LaunchDaemons/com.apple.imagent`文件关键信息如下:

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>EnvironmentVariables</key>
        <dict>
                <key>NSRunningFromLaunchd</key>
                <string>1</string>
        </dict>
        <key>ProgramArguments</key>
        <array>
                <string>/System/Library/PrivateFrameworks/IMCore.framework/imagent.app/imagent</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
</dict>
</plist>

```

ProgramArguments所对应的路径,就是该进程执行的二进制文件。执行`frida-trace -U -m "*" imagent -o a.log`后,当手机收到短信后的日志如下:

```
-
-
+
-
-
-
-
-
-
+
-
+
-
+
+
-
-
-
-
-
+
-
+
-
-
-
-
-
-
-
```

根据日志可看出关键函数`-`, 使用命令`frida-trace -U -m "-" imagent`跟踪该函数,js代码如下:

```js
{
onEnter(log, args, state) {
    log(`-)} msgID:${args}]`);
},
onLeave(log, retval, state) {
}
}
```

当手机收到短信时,对应日志输出如下:

```
-
```

根据日志信息可看出,该方法里除了msgID,并没有包含我们需要的短信及发件人相关信息。那我们继续按日志的顺序往下看,`-` 这函数看着比较亲切。trace该函数得到日志如下:

```
-
        [Recipients: (
)]
        [Items: (
    "<CTMessagePart: 0x10be7f340>"
)]
       
       
       
       
       
       
        [Content-type params: {
}]
       
requiresUpload:0x16edaec2f]
-={
    co = "+86181xxxxxx";
    g = "00ECAC3B-0790-8674-CAD5-58DD07F4DEBA";
    h = 189xxxxxx;
    k =   (
                {
            data = <e58fa6>;
            type = "text/plain";
      }
    );
    l = 0;
    m = sms;
    n = 460;
    re =   (
    );
    sV = 1;
    w = "2023-07-30 14:43:25 +0000";
}}=
```

从日志可以看出。该方法就是我们要hook方法,收件人:co,发件人:h,短信内容:k



## 3、编写deb插件

具体的创建流程请参考之前的文章,源码如下:

```objc
#import <Foundation/Foundation.h>
#import "CaptainHook/CaptainHook.h"

@interface SMSServiceSession

@end

@interface IMDService

-(void)loadServiceBundle;
@property (nonatomic,retain,readonly) NSBundle * bundle;

@end

CHDeclareClass(SMSServiceSession); // declare class
CHOptimizedMethod2(self, id, SMSServiceSession, _convertCTMessageToDictionary, NSDictionary *, arg1, requiresUpload, BOOL*, arg2) {
    id result = CHSuper2(SMSServiceSession, _convertCTMessageToDictionary, arg1, requiresUpload, arg2);
   
    @try {
      NSString *from = result[@"h"];
      NSString *to = result[@"co"];
      NSArray *msgList = result[@"k"];
      if (msgList.count > 0) {
            NSData *data = msgList[@"data"];
            NSString *content = [ initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"witwit =from %@=to %@=content %@=",from, to, content);
      } else {
            NSLog(@"witwit =sms为空=");
      }
    } @catch (NSException *exception) {
      NSLog(@"witwit =SMSServiceSession _convertCTMessageToDictionary=err=%@=", exception);

    } @finally {
      
    }
   
    return result;
}

CHDeclareClass(IMDService)
CHOptimizedMethod0(self, void, IMDService, loadServiceBundle) {

    CHSuper0(IMDService, loadServiceBundle);
    NSString *bundleId = [ bundleIdentifier];
    NSLog(@"witwit =IMDService loadServiceBundle=%@=", bundleId);
   
    if () {
      CHLoadLateClass(SMSServiceSession);
      CHHook2(SMSServiceSession, _convertCTMessageToDictionary, requiresUpload);
    }
}


CHConstructor // code block that runs immediately upon load
{
        @autoreleasepool
        {
      NSLog(@"witwit SMSForward load success");

      CHLoadLateClass(IMDService);
      CHHook0(IMDService, loadServiceBundle);
    }
}
```

info.plist文件配置如下:

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Filter</key>
        <dict>
                <key>Bundles</key>
                <array>
                        <string>com.apple.imagent</string>
                </array>
        </dict>
</dict>
</plist>
```

注:插件安装完成后。请重启imagent:

```
launchctl unload /System/Library/LaunchDaemons/com.apple.imagent.plist
launchctl load /System/Library/LaunchDaemons/com.apple.imagent.plist
```

---



# 总结

本篇文章主要对短信转发器的核心方法进行了分析及试验,拿到短信内容后,具体的转发逻辑请自行实现。

witchan 发表于 2023-8-1 16:44

wch9926 发表于 2023-8-1 13:16
其实ios已经有这个自带功能了,iMessage里有个短信转发功能,不过楼主这个还是牛的,感谢分享

那个转发可能不一样。那是基于apple id在pc或设备上登录后,可开启在pc上收发短信。试想。有三五台设备,要统一管理,转发到微信啊,钉钉啥的咋办?

wch9926 发表于 2023-8-1 13:16

其实ios已经有这个自带功能了,iMessage里有个短信转发功能,不过楼主这个还是牛的,感谢分享

正己 发表于 2023-7-31 17:39

佬,格式有点乱哦

witchan 发表于 2023-7-31 17:48

正己 发表于 2023-7-31 17:39
佬,格式有点乱哦

抱歉,没选md格式,已更新

Arthurxiao 发表于 2023-7-31 21:24

ios还是安卓,之前用过一个通过邮箱转发的

二师兄。 发表于 2023-7-31 21:46

小伙子你很危险啊

moruye 发表于 2023-7-31 22:12

Wlis 发表于 2023-8-1 00:22

感谢分享。

Bruce_HD 发表于 2023-8-1 09:44

看看,看看,来支持支持。
页: [1] 2
查看完整版本: 【iOS逆向与安全】sms短信转发插件开发