TrampolineHook 是一个中心重定向框架。可以通过一个函数替换/拦截所有你想要函数的框架。
由于 TrampolineHook 进行过更新,本文先从最初的源码开始阅读分析。
预备知识汇编语言之前有文章简单总结了汇编语言。
虚拟内存关于虚拟内存,特地做了一篇简述
初版提交记录为 :commit => ‘eb2cb31243a86cd50760e8bb8f8e2145e18e4467’
代码例子TrampolineHook 中提供了一个 demo ,展示了如何使用。
12345678910111213141516171819202122232425262728/// 一个自定...
虚拟内存实现的简单介绍虚拟内存是什么 ?操作系统通过虚拟内存的映射机制,使得每个进程拥有看起来连续且完全隔离和独立的内存空间。
操作系统对虚拟内存的分配和管理是以页为单位。
当将一个可执行文件或者动态库加载到内存中执行时,操作系统会将文件中的代码段部分和数据段部分的内容通过内存映射文件的形式映射到对应的虚拟内存区域中。
虚拟内存的权限代码段在不同的操作系统中权限不一样。
在 iOS 中,可执行代码所在的虚拟内存区域的权限只能是可执行的。
这也就是说我们不可以在具有可读写权限的内存区域中(比如堆内存或者栈内存空间)动态的构造出指令来供 cpu 执行。
iOS 系统中不支持将某段内存的保护机...
前言本文需要对 Objective-C 的类的继承关系,runtime使用需要一定理解。
Aspects 和 Stinger 的存在意义在 iOS 中,我们 hook 一个方法时,可以使用系统提供的 runtime 进行方法交换。
然而方法交换,会修改原来一个类原本的结构,并且造成多个实例遭到 hook 。
打个比方,比如我们需要对 UIViewController 的方法进行 hook ,runtime 代码如下
123456789101112- (void)hookMethod { /// 获取 目标 Method 和 hook Method Method or...
2019年的技术总结2019年学习了许多,下面总结一下完成的成果:
pod 私有仓库
利用 pod 对工程组件模块化
Aspects
fishhook
线程回溯堆栈
AST语法树遍历的Xcode插件
flutter 入门
未完成目标:
网络知识的学习与总结
算法学习与总结
2020年的技术目标AOP 总结写一篇关于 iOS AOP 的总结。
Aspects/Stinger 的实现原理
Aspects/Stinger/method_exchange 的比较总结
iOS AOP的注意事项
逆向完成阅读AloneMonkey大神的《iOS应用逆向与安全》并实践。
完成一个独立的ap...
网络请求包格式一个电商http包请求格式:
应用层http加入http头、正文端口信息
传输层加入本机端口和请求端口信息
网络层ip地址加入本机ip和请求ip信息
数据链路层加入本机MAC地址和网关MAC地址信息
Linux 系统会判断请求ip地址在不在本网段,如果不在则会发送到网关。所以通过ARP协议获取到网关MAC地址。
回顾和iOS开发相关的WWDC2019SwiftUI特点:这一套声明式UI方案支持iOS全平台
iOS 适配到 MacOSiOS 应用代码只要做一点适配即可移植到 MacOS 上
定位权限权限会更加严格要求
更快启动App,软件更新包体积也会降低60%
加密登录苹果还推出了「以苹果账户登录」的功能,官方称这不仅更安全,且不会被追踪。你还可以选择隐藏自己的真实邮件地址,之后苹果便会对你的邮件地址进行加密,应用最终只会获得一个随机生成的伪造地址。该功能不止支持 iOS 端的第三方应用登录,也支持网页端。
iPadOS从此 iPhone、iPad 分道扬镳
Combine苹果新出...
hook objc_msgSend demo
demo 中会使用到汇编的知识,若不了解,我上一篇文章有简略的总结
hook objc_msgSend 之后统计了所有方法的调用时间。
具体步骤:
使用 fishhook hook objc_msgSend
由于 objc_msgSend 是用汇编编写,所以要对 x0 ~ x7进行操作(demo只支持arm64)
记录下方法调用者、方法选择器、返回地址。存储进 pthread 标志中,使其与线程一一对应。
调用原来的 objc_msgSend 方法
返回原来的 objc_msgSend 的返回地址
详细情况在demo已经有中文注释,关于f...
http://infocenter.arm.com/help/index.jsp
ARM 寄存器arm64有32个64bit长度的通用寄存器x0~x30,sp,可以只使用其中的32bit w0~w30arm64有32个128bit SIMD寄存器v0~v31arm32只有16个32bit的通用寄存器r0~r12, lr, pc, sparm32有16个128bit SIMD寄存器Q0~Q15,又可细分为32个64bit SIMD寄存器D0~D31
函数调用:
arm64前面8个参数都是通过寄存器来传递x0~x7,其他通过栈传递
arm32前面4个参数通过寄存器来传递r0~r3,其他通过...
函数调用栈原理指令指针
指令指针IP:指令寄存器存储,指向处理器下条等待执行的指令地址(代码内的偏移量),每次执行完 IP会增加
堆栈栈顶指针SP:堆栈指令寄存器存储,系统栈的栈顶地址
栈帧指针FP:栈帧基址指令寄存器存储,每个栈帧都有一个对应的栈帧基地址,局部变量和函数参数都可以通过FP确定,因为它们到FP的距离不会受到压栈和出栈操作影响。
为了访问函数局部变量,必须能定位每个变量。局部变量相对于堆栈指针SP的位置在进入函数时就已确定,理论上变量可用SP加偏移量来引用,但SP会在函数执行期随变量的压栈和出栈而变动。尽管某些情况下编译器能跟踪栈中的变量操作以修正偏移量,但要引入可观的...
fishhook 是 Facebook 出的一个非常简单的库,可以在模拟器和设备上的iOS上运行的Mach-O二进制文件中动态重新绑定符号。这提供了类似于DYLD_INTERPOSE在OS X上使用的功能。
facebook fishhook github 地址我自己写中文注释的 fishhook
实现思路Mach-O首先需要学会 Mach-O 文件的知识,上一篇文章有描述
程序启动的时候 Mach-O 文件会被 DYLD (动态加载器)加载进内存。加载完 Mach-O 后,DYLD接着会去加载 Mach-O 所依赖的动态库
ASLR地址空间布局随机化。它会让 Mach-O 文件加载的...