iOS逆向编程
我不敢说我这篇文章是最全的逆向工程解说,但是我可以肯定的告诉你,你围绕我这篇文章,无论是逆向的方法、工具的选择,你可以少走很多弯路,逆向道路千千条,我为你开辟一道阳关大道。
前言:
还记得搞iOS逆向编程已经是去年的事情了,趁现在还有点印象,赶紧打开了简书写下自己的学习过程。
先给大家看看我的工具:
这里用到的工具 和 使用方法 更具体的可以去百度,你可以围绕我这篇文章去百度 寻找需要的工具
1、Jason-2(面具) 用于json格式化显示,正常iOS 开发网络请求 header 头返回application/json都会用到。(下次有时间再补图)
2、Charles (青花瓷) 设置代理后可进行抓URI 便于我们分析项目里的数据。(下次有时间再补图)
3、Reveal 这是分析项目节目图层的工具,当然前提是你得有个越狱手机才可以使用。(后面推荐个更好的FLEXLoader)
越狱手机 cydia下载Reveal 后
选中需要查看图层的app,这里我选择了最后一个
再打开app ,进去手机页面
这时候Mac端的Reveal 就能同步看到图层关系了,便于我们分析程序使用了哪些控件。
效果如下:
其实还有一种更好的方法:截图你可能也看到了!没错,那就是FLEXLoader
和手机端打开Reveal一样,我们选择项目 后,再进去 FLEXLoader 效果是这样的:
多了一个工具条一样的东西,我们点select 试试
一样可以查看到图层之间的关系,当然只是没有Reveal 看到的更令人愉悦而已。
4、iFUNBox 是连接手机 后 方便我们查看 手机文件的工具。(下次有时间再补图)
5、iResign 是用来重新签名app的工具(之前签名绕了好多个弯子,使用了很多命令,虽然也成功了,但是用了这个工具,我真的是爱不释手)(下面有用到)
6、go2shell 是在当前文件位置打开终端的一个小工具(避免了使用cd到当前文件位置,就相当于window里面的shift+右键 打开终端一个意思)(可选)
7、machOview 这是用来查看可执行文件的结构的(查看MachO文件格式信息,IOS系统中可执行程序属于Mach-O文件格式)其实你不用也能逆向(下次有时间再补图)
8、IDA ,我下载了两种:hopper Disassembiler v4 和 IDA、 IDA 64 (将二进制翻译成为代码的工具,前提是 你的二进制已经砸壳成功)。(下次有时间再补图)
9、最后就是Xcode了 ,我们需要给他安装一个插件:monkeyDev
你可能会百度看到网上教程说到iOSOpenDev,iOSOpenDev也能做到,但是那玩意太久远了,monkeyDev让我更亲近点。你可以选择这个插件。
这玩意是干嘛的呢,告诉你,你逆向写的代码,就是在这里创建新的项目里面写的!(和我们正常创建iOS项目一样)
网上有很多种写法,但是对于iOS开发者是不是更喜欢使用Xcode的呢???答案是肯定的!!!
准备逆向前说明一下:装逼神器
cycript是什么?
网上很多讲到了cycript,其实这个没啥大用,说白了就是调试用的。也能看看效果
因为动态调试嘛!!!
你可以选择不用他,反正可以爽爽。用法笔记:https://www.jianshu.com/p/aeaf9c956d1c
=============================================================
️️️️️️️️️️️️️️️️️️️️️️️️️
我要强调的是:这个改了只是调试,真正的逆向是:
Xcode用monkeyDev 创建的项目运行得到一个可执行的dylib文件(再使用yololib注入到咂过壳的app里面去,重新签名,生成新的ipa)
️️️️️️️️️️️️️️️️️️️️️️️️️️
yololib:这个就是个可执行文件,具体的百度,后面我会再详细说明。
番外:非本文内容:
下载得到线上ipa
你可以使用windows 系统安装的爱思助手下载得到安装包
好了,工具也介绍了,现在开始我们的逆向之旅
️ 越狱手机手机客户端下载爱思助手,安装一款你需要砸壳的app
️ 基本都是加过密的,需要砸壳,怎么砸壳呢? 下面我给大家列一下我记得笔记:
//Clutch砸壳
// 拷贝到手机里面
// scp Clutch root@192.168.1.94:/usr/bin/
//连接手机
// ssh root@192.168.1.94
//Clutch -i 查看安装的bundleID
//Clutch -d bundleID
你需要准备:
第一:Clutch :GitHub下载最新版Clutch,https://github.com/KJCracks/Clutch/releases
下载得到的Clutch 拷贝到手机/usr/bin/里面(记住要cd到Clutch 的位置,为了方便你可以使用我推荐的go2shell工具)
第二:ssh Mac 终端自带ssh,手机需要cydia里面安装插件ssh (不会的去百度)
root@后面的是Mac 电脑的IP地址
砸壳步骤:(下次有时间再补图)
Clutch拷进手机
ssh连接手机,
手机就有了Clutch 功能,
Clutch -i 命令可以查看所以安装的app的bundleID(省的你去用machoview 查看了)
Clutch -d bundleID 砸对应bundleID 的app
这时候终端会有砸壳的进度,最后会告诉你砸完壳后的存储路径
第三: 怎么拿到咂过的可执行文件呢? 用命令行??? no no no!!! 真的用命令行,那得多枯燥,这时候就用到我给你推荐的工具了:iFunbox (自己百度)
第四:使用我推荐的两种IDA ,打开IDA 导入刚才的可执行文件,这时候就可以分析整个项目了!!!记住这个是分析!
这时候你的准备工作已经做了一大半了,oc项目都有.h 和 .m文件,.h 是暴露出来的,当然也就能获取到。使用Class-dump获取(下次有时间再补图)
第五:Class-dump (自行百度下载安装)
class-dump的下载地址:http://stevenygard.com/download/class-dump-3.5.tar.gz
使用方法:(方法很简单,你也别去百度了,下面的笔记足够了)
// Class-dump 的使用
// 1、 cd 到app位置
// 2、 class-dump -H xxx.app -o test(备注:xxx.app 是app名称 test是放头文件的文件夹 这个名字你随便起 )
这时候你的test文件夹就有了所有头文件了,下面开始我们的逆向之旅:monkeyDev 创建项目
Xcode 的monkeyDev 插件自行百度安装
你可能要疑惑,我新建的hook项目 和我砸壳的怎么关联呢?我们带着疑惑慢慢看。
1、新建
2、将刚才 Class-dump 的头文件headers 也拖进项目,Xcode 开发着 当然用Xcode看更让人愉悦啦!
3、修改配置文件plist,位置在如图所示地方️
修改:
改成你砸壳的Bundles id :(为了你们方便 我复制一下代码)
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<dict>
Filter
Bundles
<string>xingfu.XFExpressCameraDemo</string>
</dict>
</plist>
4、.mm文件编写我们的hook 代码,咋一看还挺像oc的呢!!!
先截个图看看:
我们来分析一下:
CHDeclareClass(UIViewControllerWrapperView);
括号里面是你要hook的对象 UIViewControllerWrapperView 这个类是我砸壳的app里面的一个类
CHOptimizedMethod(1, self, void, UIViewControllerWrapperView, btnClick,id,arg1)
括号里面是你要在UIViewControllerWrapperView 这个类 hook的方法 (btnClick 是方法名),参数是id !!!
我是怎么找到的呢????
1、还记得我给你们提到的工具Reveal和FLEXLoader 吗???UIViewControllerWrapperView 类 (你要找的类)可以在界面层级看到。
2、还记得我给你们提到的获取头文件headers吗?(Class-dump 得到),UIViewControllerWrapperView.h得到的头文件里面的方法。(我找到的是btnClick)
UIButton*btn = arg1;
btn.backgroundColor = [UIColor redColor];
// write code here ...
NSLog(@"===================");
NSLog(@"这是我hook植入的代码");
NSLog(@"===================");
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"hook" message:@"这是我hook的代码"
delegate:nilcancelButtonTitle:@"好的"otherButtonTitles: nil];
[alertshow];
上面的是我给他➕的hook的代码。
最后记得释放哦
5、写完运行 得到一个dylib动态库
我们去看看我们的成果去
6、项目怎么注入动态库呢?百度一搜,网上资料都是一堆命令行脚本!麻烦?是的,非常麻烦!
这时候就用到 yololib 了,GitHub 自行下载
yololib不需要安装,网上一堆讲解,我不想说有多好,反正我看着就头疼。
我的方法很粗暴,我们直接拿它用
粗暴的方法:把dylib动态库。 yololib 都拷贝到。XFExpressCameraDemo.decrypted(砸壳得到的那个文件)位置:
这样就可以粗暴的使用yololib 命令了
使用yololib简单的执行下面一句就可以成功完成注入。
注意:我们先cd到之前保存的XFExpressCameraDemo.decrypted位置,即已砸完壳的可执行文件位置。
./yololib 目标可执行文件 需注入的dylib (空格隔开)
( 目标可执行文件:因为我已经cd到目标位置,直接使用名字即可)
成功效果:
7、最后我们重新签名
你可以百度到网上一堆使用脚本重新签名的方法,这些都太繁琐太繁琐。逆向难,很多原因是因为繁琐,没有一篇合适的文章或者教程入门。可是看我的文章你是不是觉得也不是太难啊,没错,就是so easy! 不废话了,我们继续最后一个环节 重新签名ipa!
使用工具iResign (百度自行下载,或者去github找)
1、ipa 路径
2、embedded.mobileprovision路径 :这就是配置文件(iOS开发打包的pp文件)
iOS开发都知道,这个里面有你的开发者证书信息,bundleID,团队,有效期,设备ID等等(线上的话是生产证书)
3、entitlements.plist的路径:这个需要你自己用Xcode建:
(网上一堆资料用脚本就是搞这个的,我们粗暴点,自己用plist建,还不会出错!)
(1)、key: application-identifier value: 2Y2QCD75VJ.xingfu.XFExpressCameraDemo
value这是app ID,你可以这样看到️
(2)、com.apple.developer.team-identifier:appID 前面的那部分
(3)、get-task-allow 设置NO就行了
(4)、keychain-access-groups (数组)item0: app ID
4、需要修改的appID,配置的pp证书里面是什么和它一一对应即可
5、选择对应的开发者团队(iOS程序员都会,不多说了)
重新签名即可得到你hook后的app啦!!!!
运行效果(下次有时间再补图)
(完结)
(完结)
(完结)
(完结)
(完结)
(完结)
有人疑惑了,你让我安装的IDA 也没用到啊!!!是的,入门级的教程是上面的,下面番外篇才是进阶。