首页
论坛
课程
招聘
[分享]刚开始学习ios逆向,分享下初学的一些基础和彭到的坑
2019-7-29 16:57 14579

[分享]刚开始学习ios逆向,分享下初学的一些基础和彭到的坑

2019-7-29 16:57
14579

首先第一点很重要,对于大神来说,ios的系统版本可能不是很重要,但是对于我们小菜鸡来说,ios10和ios11的真的感觉区别好大。如果条件允许,最好用ios10来进行学习。


一、下载指定版本的ipa

有时候需要从itunes下载指定的版本,但是最新的itunes已经不支持apptore商店下载的功能在里面了,这种情况下我们要下载一个老版本的itunes12.6
安装老版本的itunes中间会有各种问题,我就不列出了,安装问题都是一路根据错误查。
成功安装,然后搜索想要下载的app,然后右键拷贝连接出来,下面是youtobe的下载链接

https://apps.apple.com/cn/app/youtube/id544007664

然后得到的id是544007664,然后直接访问下面的链接,可以查询到所有版本,如果是其他app就替换中间的id即可

https://api.unlimapps.com/v1/apple_apps/544007664/versions

{"id":"a6f25b86-4328-4c0d-b0f6-929b09a953fc","apple_app_id":"84389e6e-852b-450b-be5b-5ab92ddcd667","bundle_version":"11.17.8","external_identifier":"817299303","created_at":"2016-05-09T15:13:37.633Z","updated_at":"2019-07-17T22:48:55.148Z"},{"id":"8150c16c-a472-4f89-9de0-e95015c902c8","apple_app_id":"84389e6e-852b-450b-be5b-5ab92ddcd667","bundle_version":"11.25.10","external_identifier":"817989963","created_at":"2016-07-06T16:49:49.229Z","updated_at":"2019-07-15T15:04:35.538Z"},{"id":"925a888f-2b53-4d07-9b7d-e76168c8f7bc","apple_app_id":"84389e6e-852b-450b-be5b-5ab92ddcd667","bundle_version":"11.33.9","external_identifier":"818657197","created_at":"2016-08-30T18:29:54.691Z","updated_at":"2019-07-17T06:43:12.573Z"},
里面基本都是这种数据,我们如果想下载一个11.17.8的版本,就把external_identifier的值复制出来817299303。
然后是这样的。当我们直接下载app的时候,会向appstore发送一个请求,p32-buy.itunes.apple.com,请求的域名大致是这样的。然后我们拦截这个请求,将请求中的这个字段替换成我们想下载的版本,那么下载成功时,就获取到了指定的app版本。我这里使用的抓包工具是charles。后面我再介绍这个工具咋用。

二、砸壳
我的理解是,砸壳等于解密,因为从itunes中下载的包都多了一层,我们得先砸开外面的一层,才能解析里面真正的数据。可以选择自己砸壳,或者从其他pp手机助手之类的直接下载。有多种砸壳方式,我自己尝试过三种方式砸壳,我大致说下过程和一些小坑
1、dumpdecrypted
这种砸壳方式我在ios11的机子上测试没能解密成功,然后ios10一点问题都没有。可能是我太渣了吧。新手还请用ios10来尝试
首先从github上下载了编译出来dumpdecrypted,这个基本没啥问题的。
接着我们用到了两个路径,一个是沙盒到路径,还有一个是运行的路径
运行想要砸壳的应用,然后ps -e|grep Application找到要砸壳的应用,将路径保存出来
然后我们需要找到沙盒到路径,简单的办法就是使用cycript注入之后,再查询出来。
ios11的是[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
结果:file:///var/mobile/Containers/Data/Application/3B94D3F0-2CFB-4E0E-A0A2-03F960B2BA60/Documents/
ios10的是NSHomeDirectory()然后后面手动加个Documents
结果:/var/mobile/Containers/Data/Application/3B94D3F0-2CFB-4E0E-A0A2-03F960B2BA60
接着把编译好的dumpdecrypted.dylib用scp上传到设备的/var/mobile/Containers/Data/Application/3B94D3F0-2CFB-4E0E-A0A2-03F960B2BA60/Documents/这个目录下
然后就可以砸壳了,cd到沙盒的目录下。执行下面的命令

DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib  /var/containers/Bundle/Application/4AE69936-E547-4B27-B76F-D5CEAB992553/Target.app/Target

成功后会在当前目录生成出砸壳后的文件,scp到本地即可


2、bfinject

使用这个方式砸壳是因为刚开始我手上只有ios11的手机,然后萌新各种无法成功解密,并且获取沙盒路径也不好使,并且cycript也无法正常运行。然后我就找到了bfinject。我们可以用它来实现在ios11上运行cycript,也可以直接用它来进行砸壳。使用起来也很简单便捷

bash bfinject -P iRead.app -L decrypt

bash bfinject -p 进程id -L decrypt

两种方式都能砸壳,成功砸壳后会生成文件。我们要搜索下文件生成在哪里了

find /var/mobile/Containers/Data/Application/ -name decrypted-app.ipa

然后把这个砸好的拷贝到本地即可。


3、frida-ios-dump

这个使用我感觉没啥好介绍了的了。ios的frida用起来简单方便

添加源https://build.frida.re

然后搜索frida,安装。有点小坑的是,frida有点略大,然后国内的网经常下载失败,反正我安装尝试很多次,最后搭梯子才下好的。

然后github上的frida-ios-dump项目拉下来。有一点坑的是,砸壳的这个py脚本里面用了一些linux的命令。如果你是在window下面来进行砸壳的话,那么你就得尽兴一些特殊处理才能成功砸壳了。

方案一,将py里面用到的一些linux命令转换成对应的win的命令。

方案二,安装cywin,安装的时候,把py脚本中用到的一些linux命令添加一下。这样脚本就可以成功运行并砸壳了。


三、各类工具

1、reveal
这个是界面ui分析工具,也是有些小坑在里面,我照着书里面的发现ios library根本点不了,没有找到这个文件,最后查了下,原来新版本的不一样。

Reveal⁩/⁨Contents⁩/⁨SharedSupport⁩/⁨iOS-Libraries⁩/RevealServer.framework 目录下的 RevealServer 复制到设备/Library/RHRevealLoader/libReveal.dylib

然后RevealServer.framework 拷贝到手机上的/System/Library/Frameworks 目录下

Scp要复制目录使用-r

然后到设置里面找到reveal,点开后选择自己想要抓到应用,我们就可以抓到界面了。


2、dpkg

先安装Xcode,然后就是按照下面的步骤来。如果安装了不能用要记得sudo port selfupdate

xcode-select --install 

sudo xcodebuild -license

安装 Macports ,网址:http://www.macports.org/install.php

测试时否能用port可以先sudo port list一下

如果找不到port是需要设置环境变量

export PATH=/opt/local/bin:/opt/local/sbin:$PATH

如果不能用就先sudo port selfupdate

最后执行安装dpkg

sudo port -f install dpkg


3、Charles

这个是用来抓http包的,用法很简单,这里我只说下ios设备抓https时,使用10及10以上会有个小坑

手机代理端口设置好。保证能抓包http包先,然后手机访问http://chls.pro/ssl,如果能成功安装,说明配置ok。不能就是手机还没设置好

这里注意手机不能翻q,否则可能会导致不能正常的安装

然后进入设置,通用,关于本机,证书信任,开启刚刚的证书即可


4、cycript

这个不得不说相当强大,应用运行时注入,写插件的时候可以提前用这个执行测试效果。很大的提高开发效率,简单的功能可以省掉写测试插件了。

但是也有坑,ios10运行相当顺利。但是ios11需要使用bfinject注入才能运行成功,并且control+d退出好像有点问题,我没有去查啥情况。

在ios11上运行 bash bfinject -P Reddit -L cycript

据说最新的插件装上也可以直接运行cycript。不过我没有测试了。

ios10直接运行 cycript -p demo2

由于cycript上可以导入脚本的,如果先导入脚本,把常用的简单操作可以直接封装在脚本中,这样就可以节省我们很多时间

这里我用的github上的mjcripy。这样使用前先@import mjcript   然后查询一些信息的命令可以直接调用封装好的,主要还是因为我object-c太渣了。毕竟没做过ios开发。


5、debugserver+lldb动态调试

xcode如果有进行过调试的话,会在自动把debugserver复制到移动设备上,路径是/Developer/usr/bin下面会有个debugserver

复制到pc端,然后签名授权下,下面的内容保存为ent.xml

<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>

然后签名ldid -S ent.xml debugserver

然后把这个文件复制到手机的/usr/bin目录下

如果动态调试太卡,我们可以用iport转发下端口,然后使用localhost来进行连接

移动设备debugserver *:1234 -a “demo2”

pc端执行lldb

然后链接到移动设备process connect connect://ip:1234

查询模块在内存中的偏移量

image list -o -f

Ida中的函数地址+偏移量=偏移后的基址

根据函数名设置断点

b function_name

根据地址设置断点

b s -a 0x1111


不得不说github就说我们这些渣渣新的好基友,lldb的命令对我来说,也是头昏脑花,于是搜一搜。

果然有仗义大佬,chisel这个项目就可以让我们舒舒服服的玩耍起来了。


四、插件编写

1、theos

theos的编译

nic.pl 创建项目

make 编译

make package 打包成deb

make install 安装到远程移动设备

安装到远程设备是用的环境变量的值

THEOS_DEVICE_IP和THEOS_DEVICE_PORT来设置远程设备的ip和端口

2、MonkeyDev

我感觉就是xcode集成了theos,直接用theos每次我都是直接用编辑器来写,感觉是各种不方便,想着要是能用个ide该多爽。然后就发现是有的。

github上找到monkeydev,按照readme安装后,就可以看到Xcode创建的时候下面多了一些模版,里面的logos tweak就和theos的一样了。


由于本菜鸡太渣了,有写错的还烦请指导下。







[注意] 招人!base上海,课程运营、市场多个坑位等你投递!

收藏
点赞1
打赏
分享
最新回复 (10)
雪    币: 119
活跃值: 活跃值 (179)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Nermor 活跃值 1 2019-7-29 23:22
2
0
从楼主的过往发帖纪录来看,仿佛看到了曾经的自己;  今天这篇分享文章着实来之不易, 而且是毫无保留的分享;
给楼主点个赞!
还有 你可能缺少一个 有问题一起探讨的”学伴“  , 希望看雪有人能跟你一起 
雪    币: 7157
活跃值: 活跃值 (2433)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
misskings 活跃值 2 2019-7-30 10:07
3
0
Nermor 从楼主的过往发帖纪录来看,仿佛看到了曾经的自己; 今天这篇分享文章着实来之不易, 而且是毫无保留的分享; 给楼主点个赞! 还有 你可能缺少一个 有问题一起探讨的”学伴“ , 希望看雪有人能跟你 ...
谢谢大佬捧场。自学啃书路真的是很艰辛,从安卓到ios。虽然都没深入,但是好歹是看明白了一些东西,简单入门了。能亲手做点事了
雪    币: 267
活跃值: 活跃值 (834)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
StriveMario 活跃值 2019-7-30 10:16
4
0
点赞, 分享精神不易, 加油!~
雪    币: 7157
活跃值: 活跃值 (2433)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
misskings 活跃值 2 2019-7-30 10:30
5
0
不知道哪里有可以讨论ios逆向的。有群或者tg之类的么??
雪    币: 70
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yxhbboy 活跃值 2019-8-9 09:50
6
0
现在学这个还能应用到哪里?
雪    币: 133
活跃值: 活跃值 (257)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
koflfy 活跃值 1 2019-8-20 16:12
7
0
mark
雪    币: 221
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
社会人 活跃值 2019-9-22 12:18
8
0
进群讨论
雪    币: 117
活跃值: 活跃值 (470)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaozhu头 活跃值 2020-8-26 11:22
9
0
有群嘛?
雪    币: 8
活跃值: 活跃值 (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_Y_107 活跃值 2021-4-17 23:23
10
0
怎么联系楼主,,想找你写个软件
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_dqwgdsem 活跃值 2021-6-11 03:14
11
0
很详细 辛苦了 也开始学 跟着楼主进步
游客
登录 | 注册 方可回帖
返回