iOS中的Hook(待完成)
2017-06-24 00:00
846 查看
通过张图来了解hook的概念
![](https://static.oschina.net/uploads/img/201706/24133437_dkCY.png)
简单的说就是一种程序的运行流程或者代码执行过程的一种技术.
hook在iOS开发者也比较常见比如,运用Objc的runtime机制动态改变方法的地址.
例子:替换UIImage imageNamed的方法
在如facebook推出的fishhook框架,根据Mach-O加载原理,修改懒加载和非懒加载表的指针.
分析案例Demo
还有越狱开发中的Substrate.
![](https://static.oschina.net/uploads/img/201706/24133437_dkCY.png)
简单的说就是一种程序的运行流程或者代码执行过程的一种技术.
hook在iOS开发者也比较常见比如,运用Objc的runtime机制动态改变方法的地址.
例子:替换UIImage imageNamed的方法
UIImage(Swizzle) //为了避免在并发,我们在load方法中调用 +(void)load { Method new = class_getClassMethod(self, @selector(imageNamed:)); Method orgin = class_getClassMethod(self, @selector(imageWithName:)); method_exchangeImplementations(new, orgin); } + (UIImage *)imageWithName:(NSString *)name { //想要实现的逻辑 return image; }
在如facebook推出的fishhook框架,根据Mach-O加载原理,修改懒加载和非懒加载表的指针.
分析案例Demo
#import <dlfcn.h> #import <UIKit/UIKit.h> #import "AppDelegate.h" #import "fishhook.h" static int (*orig_close)(int); static int (*orig_open)(const char *, int, ...); int my_close(int fd) { printf("Calling real close(%d)\n", fd); return orig_close(fd); } int my_open(const char *path, int oflag, ...) { va_list ap = {0}; mode_t mode = 0; if ((oflag & O_CREAT) != 0) { // mode only applies to O_CREAT va_start(ap, oflag); mode = va_arg(ap, int); va_end(ap); printf("Calling real open('%s', %d, %d)\n", path, oflag, mode); return orig_open(path, oflag, mode); } else { printf("Calling real open('%s', %d)\n", path, oflag); return orig_open(path, oflag, mode); } } int main(int argc, char * argv[]) { @autoreleasepool { //替换close=>my_close open=>my_open rebind_symbols((struct rebinding[2]){{"close", my_close, (void *)&orig_close}, {"open", my_open, (void *)&orig_open}}, 2); // Open our own binary and print out first 4 bytes (which is the same // for all Mach-O binaries on a given architecture) int fd = open(argv[0], O_RDONLY); uint32_t magic_number = 0; read(fd, &magic_number, 4); printf("Mach-O Magic Number: %x \n", magic_number); close(fd); return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
还有越狱开发中的Substrate.
相关文章推荐
- 传iOS 5.1完成测试 发布时间早于iPad 3上市
- 用迅雷在Apple官网上下载ios sdk到99.9%,却无法完成的解决办法
- 呼 IOS 的聊天部分差不多算完成了 纪念下
- 【ci框架】源代码解读:利用Hook.php文件完成ci框架功能的扩展
- iOS: imageIO完成渐进加载图片
- hook ios
- unityios开发--加载视频以及加载完成之后自动跳转
- IOS中如何Hook消息
- unityios开发--加载视频以及加载完成之后自动跳转 .
- [iOS]《美式英语发音》version 1.0 完成
- 9年才完成的iOS调情游戏The Act 穿越来的
- Google为iOS推出地图App已开发完成
- 百度以分成模式进入 iOS,完成移动搜索布局
- iOS程序完成后如何生成ipa进行真机测试
- iOS开发学习笔记:使用xcode里的单元测试,放在STAssert…里面的语句无法使用自动完成功能
- iPhone与iPad开发实战——iOS 经典应用剖析(更新完成)
- ios pdf相关的知识,先贴个链接,正在做这方面项目,等有些成果后回来完成这文章。
- ios在后台 完成一个长期任务
- iOS: imageIO完成渐进加载图片
- IOS中如何Hook消息