本文介绍: 上面讲到了mobileloader,他是怎么做到把第三方lib注入目标程序的呢?上面讲了很多原理性的东西,相信大家已经看的不耐烦了,下面我们一起动点真格的,我们从头开始,一步一步的做一个微信自动抢红包插件,当然,网上可能已经有相关的开源代码了,但是我这里要讲的是,这些代码是怎么得出来的,我么重点讲一讲分析过程iOS的入侵离不开越狱开发,一切的破解入侵都是建立在越狱的基础上的,如果没有拿到系统权限,一切的想法都是空谈了,当然,市面上存在免越狱的破解补丁,但是它的开发过程,也是基于越狱环境的。

如果您有耐心看完这篇文章,您将懂得如何着手进行app分析追踪注入等实用的破解技术,另外,通过入侵”,将帮助您理解如何规避常见安全漏洞文章大纲:

iOS黑客关键字

iOS的入侵离不开越狱开发,一切的破解、入侵都是建立在越狱的基础上的,如果没有拿到系统级权限,一切的想法都是空谈了,当然,市面上存在免越狱的破解补丁,但是它的开发过程,也是基于越狱环境

tweak

iOS的黑客界,要做破解或越狱开发,就必须了解tweak,它是各种破解补丁的统称,在google上,如果你想搜索一些越狱开发资料或者开源的破解补丁代码,它是最好的关键字

iOS的tweak大致分为两种:

没有越狱的机器由于系统中没有mobilesubstrate这个库,我们有二个选择第一个是直接把这个打包ipa当中,使用它的api实现注入,第二个是直接修改汇编代码;第一个用于较为复杂的破解行为,而且越狱tweak代码可以复用,第二种适用于破解一些if…else…之类的条件语句

Mobilesubstrate

下面的图展示的就是oc届著名的method swizzling技术,他就是iOS的注入原理,类似于windows钩子,所以我们注入也称为hook

Mobilesubstrate为了方便tweak开发,提供了三个重要的模块

app注入原理

上面讲到了mobileloader,他是怎么做到把第三方lib注入进目标程序的呢?这个我们要从二进制文件的结构说起,从下面的图来看,Mach-O文件的数据主体分为三大部分,分别是头部(Header)、加载命令(Load commands)、和最终的数据(Data)。mobileloader会在目标程序启动时,会根据指定规则检查指定目录是否存在第三方库,如果有,则会通过修改二进制loadCommands,来把自己注入进所有的app当中然后加载第三方库。

 

为了让大家看的更清楚,下面我用machoview打开一个真实的二进制文件给大家看看可以看出,二进制当中所有引用到动态库都放在Load commands当中,所以,通过这个段增加记录,就可以注入我们自己写的动态库了

那么问题来了,在这里插入我们自己动态库有什么用?我们自己写的代码没有执行的入口,我们一样没发干坏事,嗯,恭喜你问到点子上了,我们还需要一个”main“函数来执行我们自己代码这个main“函数在oc里面称为构造函数,只要在函数前声明attribute((constructor)) static即可,有了它我们就可以发挥想象力,进行偷天换日干点坏事了:

 到这里为止,我们已经知道了怎么在目标程序注入自己代码,那么我们怎么知道需要hook哪些方法?怎么找到关键点进行实际的破解呢?下面讲一下常见app入侵分析方法

iOS逆向分析方法

逆向分析最常用的有三种方法:

1.网络分析
通过分析和篡改接口数据,可以有效的破解通过接口数据控制客户端行为app,常用的抓包具有Tcpdump, WireShark, Charles等,windows平台fidller
2. 静态分析
通过砸壳、反汇编、classdump头文件技术来分析app行为,通过这种方式可以有效的分析出app实用的一些第三方库,甚至分析出app架构内容,常用的工具有dumpdecrypted(砸壳)、hopper disassembler(反汇编)、class_dump(导头文件)
3. 动态分析
有静就有动,万物都是相生相克的,动态分析指的是通过分析app运行数据,来定位注入点或者获取关键数据,常用的工具有cycript(运行控制台)、 lldb+debugserver远程断点调试)、logify追踪

Demo:微信抢红包插件 


上面讲了很多原理性的东西,相信大家已经看的不耐烦了,下面我们一起动点真格的,我们从头开始,一步一步的做一个微信的自动抢红包插件,当然,网上可能已经有相关的开源代码了,但是我这里要讲的是,这些代码是怎么得出来的,我么重点讲一讲分析过程

工欲善其事,必先利其器

一台越狱的手机,并装有以下软件

寻找注入点
砸壳

首先我们要做的就是把微信的壳砸掉,砸壳其实是为了把它的头文件classdump出来,因为从appstore下载的app二进制都是经过加密的,直接进行classdump操作是啥也看不出来的

xxx$ cp /usr/lib/dumpdecrypted.dylib /path/to/app/document
xxx$ DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /path/to/WeChat

 最终的输出如下,内容太多,大家肯定看不清楚,不过没关系这个不是重点,这里只是展示一下打印结果形式:

 

我们可以随机选取一个节点不要太靠树叶,也不要太靠树根,例如我选的是标红的部分,把这个节点内存地址copy出来,这个内存地址,就代表了这个节点的view对象ios开发的老油条们都知道,通过view的nextResponder方法,可以找出它所属的视图控制器ViewController,所以我么在cycript的控制台持续输入如下命令

 

 

看到没有,通过四个nextResponder方法调用,我么找到了当前聊天窗口的ViewController类名,他就是BaseMsgContentViewController,现在我们缩小了目标范围,下面我们还需要继续缩小范围,要找到具体的消息处理函数才行。

动态分析-Logify

要继续缩小范围,就得祭起神器Logify了,它是theos的一个模块作用就是根据头文件自动生成tweak,生成的tweak会在头文件的所有方法中注入NSLog打印方法的入参和出参,非常适合追踪方法的调用数据传递

现在我们根据此前砸壳后class_dump出来的头文件,找到BaseMsgContentViewController在pc终端执行如下命令

logify.pl /path/to/BaseMsgContentViewController.h > /out/to/Tweak.xm

输出的tweak文件大概是这个样子的:

 

这里带百分号的关键字例如 %hook、%log、%orig 都是mobilesubstrate的MobileHooker模块提供的宏,其实也就是把method swizzling相关的方法封装成了各种宏标记,使用起来更简单大家想要更深入了解各种标记,可以google一下logos语言

theos创建tweak

上面我们用logify生成了一个tweak代码,我们要把它安装到手机上,首先需要使用theos进行编译安装theos之后,在pc终端输入nic.pl:

 

首先选择项目模版当然是tweak啦,然后项目名称作者,后面两个选项要注意:

 把上面logify生成的tweak文件覆盖当前目录,并用文本编辑打开makefile文件,在文件的开头增加你的ios设备ip地址和ssh端口

最后pc终端进入项目目录,输入 make package install 命令

期间会让你输入设备ssh密码,越狱机器的默认ssh密码是alpine,make命令会生成deb安装包,放在debs目录,我们如果想对外发布自己插件,可以把生成的安装包上传到cydia即可

安装成功后再次进入微信的聊天界面,并使用另外一个微信在群里发个普通消息,连接xcode打开越狱机器控制台,查看输出,会发现有类似下面的输出:

Jun 7 09:56:13 Administratorde-iPhone WeChat[85972] <Notice>: [1;36m[WxMsgPreview] [m[0;36mTweak.xm:308[m [0;30;46mDEBUG:[m -[<BaseMsgContentViewController: 0x15e0c9a00> addMessageNode:{m_uiMesLocalID=2, m_ui64MesSvrID=0, m_nsFromUsr=ccg*675~9, m_nsToUsr=1037957572@chatroom, m_uiStatus=1, type=1, msgSource="(null)"} layout:1 addMoreMsg:0]

看出来了吧,消息处理函数是BaseMsgContentViewController的addMessageNode:layout:addMoreMsg:方法,大家可以看出,方法的参数内容也打印出来了

原文地址:https://blog.csdn.net/q2243088760/article/details/134757250

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_30484.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注