iOS逆向(二)工具篇

  1. 砸壳工具
    1. dumpdecrypted
  2. 静态分析工具
    1. class dump
    2. IDA
  3. 动态分析工具
    1. Cycript
    2. debugserver
    3. LLDB
    4. Theos
  4. 辅助工具
    1. SSH
    2. dyld_decache

关于逆向的第二篇,也还没是正题,先来以使用的目的来分类一下逆向需要哪些工具,分别在什么平台上使用和有什么作用,部分还直接带上使用示例。在一些使用方式比较绕的工具上,同样也准备了坑点的描述,记录一下痛苦的心路历程,一个问题可能就卡了1、2天。

砸壳工具

dumpdecrypted

平台:MacOS & iOS
作用:砸壳线上加密App

先从github下载dumpdecrypted的源码,然后编译成dylib备用。

$ cd dumpdecrypted-master/
$ make

静态分析工具

class dump

平台:MacOS
作用:导出头文件

下载连接

$ open /usr/local/bin
$ sudo chmod 777 /usr/local/bin/class-dump
$ class-dump --help
  • 将下载好的class-dump复制到/usr/local/bin
  • 更改其权限

IDA

平台:MacOS
作用:反汇编。

下载地址,点evaluation version,选择下载IDA 7.0 Freeware。

动态分析工具

Cycript

平台:iOS
作用:命令行上编写及运行代码,或注入代码到进程并执行。

直接在Cydia就能找到下载。

debugserver

平台:iOS
作用:debug App,供LLDB的接入。

在使用debugserver之前,首先要帮它添加task_for_pid权限,才能以进程为单位调试到别人的App。

  • 先从iOS拷贝出debugserver
$ rsync -avz -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 4567" --progress root@127.0.0.1:/Developer/usr/bin/debugserver /Path/to/debugserver/
  • 然后对debugserver瘦身
$ lipo -info /Path/to/debugserver/
$ lipo -thin arm64 /Path/to/debugserver/ -output /Path/to/debugserver/

不知ldid从哪个版本开始支持对fat binary的签名,反正最后的一个版本1.2.1是支持的,如果支持的可以忽略上面的瘦身步骤

  • 再对对debugserver进行签名

ent.xml下载地址,下载到/Path/to/debugserver/后执行下面命令

$ cd /Path/to/debugserver/
$ /opt/theos/bin/ldid -Sent.xml debugserver
//或直接用brew的ldid执行

可以使用下面指令确认一下debugserver的签名属性是否正确,若输出ent.xml的内容则证明签名成功

ldid -e debugserver
  • 然后将debugserver拷贝回iOS
$ rsync -avz -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 4567" --progress /Path/to/debugserver/debugserver root@127.0.0.1:/usr/bin/debugserver
  • 最后SSH到iOS为debugserver添加执行权限
iPhone:~ root# chmod +x /usr/bin/debugserver
//或
iPhone:~ root# chmod 777 /usr/bin/debugserver

当ldid签名无效时,可以尝试用下面的方法重签debugserver

codesign -s - --entitlements ent.plist -f debugserver

若上述的ent.xml、ent.plist下载不了,可以用下面的内容自己建文件

ent.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>com.apple.springboard.debugapplications</key>
    <true/>
    <key>run-unsigned-code</key>
    <true/>
    <key>get-task-allow</key>
    <true/>
    <key>task_for_pid-allow</key>
    <true/>
</dict>
</plist>

ent.xml

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>com.apple.springboard.debugapplications</key>
        <true/>
        <key>get-task-allow</key>
        <true/>
        <key>task_for_pid-allow</key>
        <true/>
        <key>run-unsigned-code</key>
        <true/>
</dict>
</plist>

另外,还可以在iOS上在BigBoss那安装上Toolchain,在Mterminal上使用ldid来直接对iOS的debugserver进行签名,免去了拷贝来拷贝去的麻烦。

使用示例

//启动进程并等待LLDB接入 
//*为所有IP可接入,接入端口为1234
debugserver -x posix *:1234 /Path/to/TargetApp.app/TargetApp

//附加进程
debugserver *:1234 -a /Path/to/TargetApp.app/TargetApp

第二版小黄书教的debugserver -x backboard无效,提示

debugserver-@(#)PROGRAM:debugserver PROJECT:debugserver-360.0.26.3
for arm64.
error: failed to launch process debugserver: failed to get the task for process -1

网上说的debugserver -x spring无效,但输出的提示有指出有效的类型有哪些,估计spring已经被抛弃了

error: invalid TYPE for the –launch=TYPE (-x TYPE) option: ‘spring’
Valid values TYPE are:
auto Auto-detect the best launch method to use.
posix Launch the executable using posix_spawn.
fork Launch the executable using fork and exec.
backboard Launch the executable through BackBoard Services.
frontboard Launch the executable through FrontBoard Services.

最后还是用posix解决了。

LLDB

平台:MacOS
作用:调试用的Debugger

  • 运行LLDB
$ /Applications/Xcode.app/Contents/Developer/usr/bin/lldb
  • 连接debugserver
(lldb) process connect connect://IP:port
Process 1281 stopped
* thread #1, stop reason = signal SIGSTOP
    frame #0: 0x000000010061d000 dyld`_dyld_start
dyld`_dyld_start:
->  0x10061d000 <+0>:  mov    x28, sp
    0x10061d004 <+4>:  and    sp, x28, #0xfffffffffffffff0
    0x10061d008 <+8>:  mov    x0, #0x0
    0x10061d00c <+12>: mov    x1, #0x0
Target 0: (TargetApp) stopped.

暂时还没了解如何用iproxy的本地IP连接lldb,但我在iproxy开启的情况下使用Mac热点分配的IP来连接也很快,几秒而已。

使用示例

(lldb) b function               //在函数起始位置设断点
(lldb) b l                      //查看所有断点
(lldb) b s -a 0xAddress         //设置断点
(lldb) b dis [breakPointNumber] //禁用所有断点 [或指定禁用的断点号]
(lldb) b en                     //启用所有断点 [或指定启用的断点号]
(lldb) b del                    //删除所有断点 [或指定删除的断点号]
(lldb) c                        //继续运行

//设置一组断点,通过以下命令
(lldb) b com add 1              // 指定某一断点下执行的指令集合
Enter your debugger command(s).  Type 'DONE' to end.
(lldb) po [$r0 class] 
(lldb) p (char *)$r1 
(lldb) DONE

(lldb) ni                       //nexti 进入函数体的下一步
(lldb) si                       //stepi 不进入函数体的下一步
(lldb) register write $rn x     //给指定寄存器rn赋值x
//lldb下control + c能强制断掉现在的进程,相当于Xcode中的暂停

Theos

平台:MacOS
作用:编写和编译插件等

brew install dpkg
brew install ldid
  • 先安装两个Theos依赖的工具dpkg和ldid
$ export THEOS=/opt/theos
$ sudo git clone --recursive git://github.com/DHowett/theos.git $THEOS
$ sudo chown -R 777 $THEOS

$ cp /usr/local/Cellar/ldid/xx_version/bin/ldid /opt/theos/bin/ldid /opt/theos/bin/ldid
$ sudo chmod 777 /opt/theos/bin/ldid 
$ sudo chmod 777 /opt/theos/bin/ldid 

$ cp /usr/local/Cellar/dpkg/xx_version/bin/dpkg-deb /opt/theos/bin/ldid /opt/theos/bin/dpkg-deb
$ sudo chmod 777 /opt/theos/bin/dpkg-deb
  • 下载Theos
  • 复制ldid到Theos下,并更改其权限
  • 复制dpkg-deb到Theos下,并更改其权限

辅助工具

SSH

平台:MacOS & iOS
作用:远程操作

如果打算先在iOS的Cydia上下载一个OpenSSH,然后在MacOS上的终端通过ssh连接上去iOS,而又当你的设备是10.3.x版本的系统,那就掉坑了。

SSH连不上?戳这里

简单来说,解决方法就是

  • 卸载干净iOS上的OpenSSH和OpenSSL;
  • 添加源 http://cydia.ichitaso.com/test
  • 在上述源里下载 dropbear (OpenSSH的替代品);
  • 重新安装OpenSSL
  • 这个时候再试试 ssh root@deviceIP (继续用22端口即可,有些网友说用2222的亲测不对)

不能使用OpenSSH的原因是

Yalu jailbreak
Can I install OpenSSH?
No, the jailbreak already comes with a working SSH daemon (dropbear). Installing OpenSSH can create issues on your jailbroken device.

中途确认dropbear进程是否有在运行的可用以下指令

ps aux|grep dropbear
ps -e | grep ssh

接下来才进入正题,直接在同Wifi环境下ssh,此链接过程可能会十分漫长

$ ssh root@172.16.xxx.xxx

若嫌Wifi连接太慢,可以使用usbmuxd工具来利用usb实现连接,安装

$ brew install usbmuxd

把iPhone的默认端口22映射到Mac上

$ iproxy 4567 22
waiting for connection

保持上面的终端,新建一个终端进行连接(root的默认密码是alpine,有必要的话首次登陆后注意修改密码)

$ ssh -p 4567 root@127.0.0.1
root@127.0.0.1's password:

当你想使用scp的时候直接改用rsync代替吧,在使用着iproxy的情况示例

rsync -avz -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 4567" --progress /path/to/source/file  root@127.0.0.1:/path/to/destination/

这是参考自狗神分享的rsync替代scp帖子中,一位逆友后来更新的指令。

为什么要使用rsync替代scp?原因是yalu102自带的SSH缺少了scp,无法用WINSCP传输文件。

说一下我踩到的坑,在使用着iproxy的情况下执行scp来copy file示例如下(注意-P要大写)

$ scp -P 4567 /Users/xx/dumpdecrypted.dylib root@127.0.0.1:/var/xx/Documents/

sh: scp: command not found

会发现出现以上报错,原因上面已交代。

google一下,发现部分外国帖子和大量国人已经针对上述问题总结出下面解决方法,先到Cydia下载wget到iOS上,然后在iOS的Terminal执行下面指令

wget mila432.com/scp
ldid -S scp
chmod 777 scp
mv scp /usr/bin/scp

但是!mila432.com/scp 这个地址的内容已不存在了..
最后,就是用rsync解决了(其实低端点用iFunBox等工具也是可以的),拷贝成功后会输出

building file list …
1 file to consider
dumpdecrypted.dylib
197528 100% 157.13MB/s 0:00:00 (xfer#1, to-check=0/1)
sent 8418 bytes received 42 bytes 2417.14 bytes/sec
total size is 197528 speedup is 23.35

如果设备重启了,重新越狱后发现ssh连不上,提示以下错误的时候,则需要重装Dropbear和OpenSSL

$ ssh -p 4568 root@127.0.0.1
ssh: connect to host 127.0.0.1 port 4568: Connection refused
ssh: connect to host 127.0.0.1 port 4568: Connection refused
ssh_exchange_identification: read: Connection reset by peer

如果出现下面的错误,清空文件/Users/username/.ssh/known_hosts中的内容就能解决。或者切换到一个新的映射端口上,如 iproxy 2222 22,区别开之前经常使用的端口

$ ssh -p 2222 root@127.0.0.1
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:NhckXKSdwvSSLhago6bQb1/lIqRaLqAxHd6kHOPIYQs.
Please contact your system administrator.
Add correct host key in /Users/username/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/username/.ssh/known_hosts:3
ECDSA host key for [127.0.0.1]:2222 has changed and you have requested strict checking.
Host key verification failed.

dyld_decache

平台:MacOS
作用:抽取出iOS的系统库文件(从iOS拷贝到MacOS上)的二进制文件。

当要分析系统框架中的类及其方法时,就需要用到这个工具。抽取iOS库的二进制文件来分析,是为了避免MacOS和iOS上分析出的指令和地址数据不一致。

抽取后的库放入IDA分析库本身和其各个方法的基地址,然后结合ASLR偏移计算出偏移后的真实地址,最后就可以根据真实地址打断点。

下载地址


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 mingfungliu@gmail.com

文章标题:iOS逆向(二)工具篇

文章字数:2.6k

本文作者:Mingfung

发布时间:2018-09-13, 22:39:02

最后更新:2018-09-13, 23:22:44

原始链接:http://blog.ifungfay.com/iOS/iOS逆向(二)工具篇/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

宝贝回家