一、代码注入
1. 通过修改LoadCommands
段注入framework/dylib文件
参考: 逆向工程的代码注入
2. 在越狱机上, 通过DYLD_INSERT_LIBRARIES
属性插入动态库, Tweak就是利用此原理
参考: Tweak使用及原理
二、代码注入的攻防
1. 通过修改LoadCommands
注入的攻防博弈
(1) 围绕hook原理进行攻防
① 防守: 使用fishhook重绑定method swizzling
相关方法, 使注入的代码hook失效.
由于依赖库加载顺序为: 插入的库->Link Binary With Libraries配置中依赖库按顺序载入->通过yololib注入的库.
所有开发者可以自己创建依赖库并加入到Link Binary With Libraries配置中的最前面. 只有先于注入代码重绑定才能阻断注入代码的hook.
② 攻击:
- 通过Tweak注入, 其依赖库加载在最前面.
- 找到APP中开发者反注入的动态库, 直接使用
Synalyze It
或其他工具修改其数据使其失效.
直接修改依赖库的mach-o文件的数据, 关键在于怎样定位选择合理的修改位置.
- 使注入的库优先加载. 如果不适用Tweak的话, 只能修改
LoadCommands
段. 通过yololib
修改只能是注入的库最后加载, 或者, 可以尝试写一个能将注入库改到LoadCommands
段最前面的工具, 但是肯定很难.
(2) 针对使用DYLD_INSERT_LIBRARIES
注入的攻防
① 防守: DYLD源码中, 有判断如果Mach-O文件中存在__RESTRICT
段和__restrict
组, 则不插入动态库. 那么开发者可以主动添加该段来防止插入动态库.
添加方式: 在
Other Linker Flags
配置中添加如下项
-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null
② 攻击: 破坏LoadCommands
段中的__RESTRICT
与__restrict
字段, 即直接修改Mach-O文件.
③ 再防守: 在工程中, 查看自己的LoadCommands
段, 如果__RESTRICT
或__restrict
被修改, 则证明Mach-O文件被修改, 可以执行exit
退出方式被hook
查看
LoadCommands
段的方法可在DYLD源码中找到.
④ 再攻击: 找到工程中判断__RESTRICT
段是否存在的代码, 通过修改Mach-O文件的方式破坏其代码.