美文网首页iOS精品文章
动态库注入&反注入

动态库注入&反注入

作者: 纯情_小火鸡 | 来源:发表于2017-09-25 09:58 被阅读101次

tweak是各种破解补丁的统称。

iOS的tweak大致分为两种:

  • 第一种是在cydia上发布的,需要越狱才能安装,大部分是deb格式的安装包,iOS在越狱后,会默认安装一个名叫mobilesubstrate的动态库,它的作用是提供一个系统级的入侵管道,所有的tweak都可以依赖它来进行开发,目前主流的开发工具有theos和iOSOpenDev,前者是采用makefile的一个编译框架,后者提供了一套xcode项目模版,可以直接使用xcode开发可调试,但是这个项目已经停止更新了,对高版本的xcode支持不好,大家酌情选择(本文中的例子全部采用theos)
  • 第二种是直接打包成ipa安装包,并使用自己的开发证书或者企业证书签名,不需越狱也可以安装,可直接放到自己的网站上,可实现在线安装;对于没有越狱的手机,由于权限的限制,我们是没有办法写系统级的tweak的,例如springboard的补丁是没法运行的,这种tweak大多是针对某个app,把目标app进行修改注入处理,再重新签名和发布,有点类似于windows软件的xxx破解版、xxx免注册版

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

一. 动态库注入

我们知道,程序在启动的时候会把引用到的动态库都放在Load commands段当中,所以,通过给这个段增加记录,就可以注入我们自己写的动态库了。

简单来说就是通过修改可执行文件的Load Commands,增加一个LC_LOAD_DYLIB,写入dylib路径。这样程序执行的时候就会来编译这个LC_LOAD_DYLIB找到要注入的dylib,从而进行加载。

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

#import <CaptainHook/CaptainHook.h>

CHDeclareClass(AnAppClass);
CHMethod(1, void, AnAppClass, say, id, arg1)
{
    NSString* tmp=@"Hello, iOS!";
    CHSuper(1, AnAppClass, say, tmp);
}
__attribute__((constructor)) static void entry()
{
    NSLog(@"Hello, Ice And Fire!");
    CHLoadLateClass(AnAppClass);
    CHClassHook(1, AnAppClass,say);
}

到这里为止,我们已经知道了怎么在目标程序注入自己的代码,那么我们怎么知道需要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(追踪)

然后我们需要了解几个工具

1、让目标程序破茧而出——dumpdecrypted

因为直接从 AppStore下载下来的二进制文件都是加了壳的,所以为了让它的内核破茧而出,我们需要砸壳操作。

所以第一个工具就是 dumpdecrypted ,这个工具是手机端 的,可以通过 cydia安装,安装后文件路径是:

/usr/lib/dumpdecrypted.dylib

在实际使用时,可以通过 pp助手把这个文件 copy到目标程序的 documents目录,然后ssh进手机终端,cd到 documents目录,执行:

DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib WeChatPath

执行完后会再 documents目录生成一个砸完壳后的二进制文件

2、运行时分析——cycript

砸完壳之后,我们再 dump出头文件,但是微信的类太多了,头文件有几百个,如此多的头文件,让人眼花缭乱,所以要找到突破口,我们得缩小范围,我喜欢用的思路是从 ui入手,先找到微信对话界面的 controller,然后再追踪 controller中对应的消息处理函数。

这样第二个工具 cycript 隆重出场了 ,它也是个手机端 的工具,用于查看 app运行时数据,大伙儿可以通过 cydia安装,安装完之后,ssh到越狱手机的终端。

先找到微信的进程id:ps aux | grep WeChat
再执行:cycript -p 微信的pid

完成了注入,进入到 cycript提供的终端。

3、追踪神器 -- logify

目前为止我们已经锁定了大致的突破口,下面还需继续追踪,找到这个类里面的消息处理函数,这里的思路就是通过向群里发送一个消息,然后观察 controller中哪些方法被调用了。

第三个工具 Logify就是干这个事情的 ,它是 theos的一个组件,和 theos一起安装在 pc端的,在 pc的终端输入:

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

打开生成的 tweak.xm文件,可以看到它其实就是 hook了这个类所有的方法,在方法中注入了 nslog,打印方法的入参和返回值,最后把这个文件用 theos打包并安装到手机中,再次向群里发消息,手机连上 xcode观察手机控制台输出。

4、反汇编工具——hopper & 断点调试工具——lldb + debugserver

第五个工具 lldb + debugserver 顾名思义,debugserver是手机端的(只要你的手机有连过 xcode进行 debug,这个玩意就自动有了),用于监听 pc端 lldb的连接,来实现远程调试。

这个工具要和第四个 hooper(反汇编工具) 结合起来用。

首先 ssh进手机的终端,输入:

debugserver *:19999 -a WeChat

监听 lldb的连接

然后打开pc的终端,启动 lldb并连接:

lldb
process connect connect://deviceIP:19999

如果连接成功,我们就正式进入 debug状态了。

那么问题来了,要精确的设置断点,必须知道这个函数的内存地址,这个内存地址怎么搞出来呢?

有个公式:

内存地址=进程内存基地址+函数在二进制中的偏移量

上面我们已经连上了 lldb调试环境,获取基地址在 lldb中输入下面的命令:

image list -o -f

5、注入工具——insert_dylib + install_name_tool

对于越狱机器来说,到这里已经大功告成了,但是想要在非越狱机器上跑,还需要几个步骤:

在非越狱机上面,一切都要靠自己,首先手动把你的库注入到目标二进制中,这一步使用 insert_dylib 就可以了,它运行在 pc端 ,在命令行 cd到微信的二进制目录,执行命令:

insert_dylib [@executable_path](/user/name/executable_path)/xxx.dylib WeChat

因为我们的 hook代码是基于 cydiaSubstrate的,用l -L xxx.dylib来检查一下你的 tweak,这个依赖库在正版机上是没有的,我们需要把它从越狱机充 cp出来和你的 tweak一起拖进目标 app目录,并通过install_name_tool 命令修改你的 tweak中对他的引用路径。

最后,用 codesign命令对微信 bundle里面所有的 dylib进行签名:

codesign -f -s "iPhone Developer:xxx" xxx.dylib

打包成ipa:

xcrun -sdk iphoneos PackageApplication -v WeChat.app -o ~/WeChat.ipa

再使用 iResign对 ipa进行签名,就可以安装到非越狱的机器上了。

注意一下,如果你不想使用 iResign,在执行 xcrun之前,还需要对微信的二进制文件进行签名:

codesign -f -s "iPhone Developer:xxx” —entitlements Entitlements.plist WeChat.app

二. 常用入侵原理和反入侵方法总结

下面我们总结一下用到的几个工具:

  • dumpdecrypted
  • insert_dylib
  • cycript

第一个工具是砸壳用的 ,代码是开源的,而且相当简单,它并没有破解 appstore的加密算法,而是把自己注入到已经通过系统加载器解密的 mach-o文件,再把解密后的内存数据 dump出来,详细的原理这篇文章写的很清楚:http://bbs.iosre.com/t/dumpdecrypted/465

那他是怎么注入的呢?就是利用了 iOS系统中 DYLD_INSERT_LIBRARIES 这个环境变量,如果设置了 DYLD_INSERT_LIBRARIES 环境变量,那么在程序运行时,动态链接器会先加载该环境变量所指定的动态库;也就是说,这个动态库的加载优先于任何其它的库,包括 libc。

由于这个环境变量指定的动态库加载的时机实在是太早了,所以对于 app来说,除了代码混淆外,无良策;

但是我们可以在代码中通过判断环境变量来检测是不是被注入:

charchar *env = getenv("DYLD_INSERT_LIBRARIES");

如果方法返回非空,我们可以做一些上报之类的。

后面两个工具都是用来注入的

insert_dylib通过向 mach-o文件的 loadcommand段插入 LC_LOAD_DYLIB数据来加载第三方库。

对于 insert_dylib,我们可以通过在 Xcode的Build Settings中找到“Other Linker Flags”在其中加上-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null指令来绕过 dylib加载额外的第三方库,具体的原理可参考 http://bbs.iosre.com/t/tweak-app-app-tweak/438

但是破解这一招也非常简单,上面的链接也说了,用 0xED打开二进制文件,把__RESTRICT全局替换成其它名字即可。

cycript个人感觉是比较神奇的,它在进程运行时动态注入。

没有细看它的源码,网上资料称,它通过 taskfor_pid函数获取目标进程句柄,然后通过在进程内创建新线程并执行自己的代码。

对于 cycript这种 bt的行为,利用系统的 root权限在进程中创建线程并执行自己的代码,目前还没想到好的对策,如果有老司机有方法,希望能指导一下~

最后再说说 lldb反调试 ,网上大多都提到 ptrace系列函数,原理我就不多说,这里主要讲如何绕过它,有两种方法,先说第一种,直接通过汇编代码修改 ptrace的第一个参数,这样我们需要先知道在哪里调用了 ptrace。

用backboard服务启动启动目标程序:

debugserver -x backboard *:19999 /path/to/binary 

在pc端用lldb连接:

process connect connect://deviceIP:19999

然后在lldb中下符号断点

b ptrace,

在lldb中输入c命令之后看ptrace第一行代码的位置,继续输入命令:

p/x $lr 

找到函数返回地址,然后用:

image list -o -f

找到目标程序的基地址,这样就能用上面说的公式计算出偏移量,最后在 hooper中找到调用 ptrace的汇编代码。

移动App入侵与逆向破解技术-iOS篇

【Dev Club 分享第三期】iOS 黑客技术大揭秘

iOS安全攻防(十四)防止tweak依附

Urinx/iOSAppHook

相关文章

  • 动态库注入&反注入

    tweak是各种破解补丁的统称。 iOS的tweak大致分为两种: 第一种是在cydia上发布的,需要越狱才能安装...

  • 静态库与动态库注入

    静态库 注入步骤 动态库注入:

  • iOS逆向009--代码注入、Dylib注入

    简介代码注入:静态注入、动态注入 动态库dylib其实是修改MacO文件,展开 Load Commands在Fra...

  • HOOK原理及介绍

    注入小结 通过之前的学习,我们知道了利用动态库注入的两种方式: 注入 App 后,使得 项目和动态库产生关联关系。...

  • 11.Hook原理

    [TOC] 回顾 注入的相关要素: 注入的形式:利用动态库的特性进行注入,包括Framework、Dylib。可以...

  • 动态库注入

    Framework注入 原理 通过XCode将我们创建的framework扔进app包里面。然后通过工具修改程序的...

  • 动态库注入

    一、前言二、注入思路三、动态库注入实现四、分析实现按钮监听五、实战修改微信步数 一、前言 在文章《应用签名-脚本签...

  • iOS代码注入&Method Swizzle技术

    说明:本文仅限于说明其技术点,没有别的,不要做坏事 注入 代码注入方式:动态库framework注入,dylib注...

  • 动态库 dylib 注入

    iOS动态库 dylib 注入 https://www.exchen.net/ios-hacker-动态库-dyl...

  • 免越狱注入Reveal

    2.找到要注入的app ,用yololib注入该动态库。3.还是看图 demo:https://pan.baidu...

网友评论

    本文标题:动态库注入&反注入

    本文链接:https://www.haomeiwen.com/subject/hflosxtx.html