当前位置:首页 > 代码 > 正文

hook通知代码(hook消息)

admin 发布:2022-12-19 22:24 133


今天给各位分享hook通知代码的知识,其中也会对hook消息进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

求hook api的源代码

API HookImport Table API Hook 完整代码

API Hook 工具相关代码

详谈HOOK API的技术

不知对你是否有帮助

iOS中如何实现hook?

 我们都知道在windows下可以通过API轻松的hook很多消息,IOS里面貌似还没有现成的API(可能是我还没发现吧),前段时间碰巧看到Objective-C运行时的一些东西,于是心想着是不是可以尝试一下实现hook的功能。

下面先直接上源码:1//2//TestHookObject.m3//TestHookMessage4//5//Created by mapleCao on 13-2-28.6//Copyright (c) 2013年 mapleCao. All rights reserved.7//89#import"TestHookObject.h"10#importobjc/objc.h11#importobjc/runtime.h1213@implementation

TestHookObject1415//this method will just excute once16+ (void)initialize17{18//获取到UIWindow中sendEvent对应的method19Method sendEvent = class_getInstanceMethod([UIWindowclass

], @selector(sendEvent:));20Method sendEventMySelf = class_getInstanceMethod([selfclass

], @selector(sendEventHooked:));2122//将目标函数的原实现绑定到sendEventOriginalImplemention方法上23IMP sendEventImp =

method_getImplementation(sendEvent);24class_addMethod([UIWindowclass

], @selector(sendEventOriginal:), sendEventImp, method_getTypeEncoding(sendEvent));2526//然后用我们自己的函数的实现,替换目标函数对应的实现27IMP sendEventMySelfImp =

method_getImplementation(sendEventMySelf);28class_replaceMethod([UIWindowclass

], @selector(sendEvent:), sendEventMySelfImp, method_getTypeEncoding(sendEvent));29}3031/*32* 截获到window的sendEvent33* 我们可以先处理完以后,再继续调用正常处理流程34*/35- (void)sendEventHooked:(UIEvent *)event36{37//do something what ever you want38NSLog(@"haha, this is my self sendEventMethod!!!!!!!");3940//invoke original implemention41[self performSelector:@selector(sendEventOriginal:) withObject:event];42}4344@end下面我们来逐行分析一下上面的代码:

首先我们来看19行,这一行主要目的是获取到UIWindow原生的sendEvent的

Method(一个结构体,用来对方法进行描述)

,接着第20行是获取到我们自己定义的类中的sendEvent的Method

(这两个方法的签名必须一样,否则运行时报错)

。第23行我们通过UIWindow原生的sendEvent的Method获取到对应的

IMP(一个函数指针)

,第24行使用运行时API Class_addMethod给UIWindow类添加了一个叫sendEventOriginal的方法,该方法使用UIWindow原生的sendEvent的实现,并且有着相同的方法签名

(必须相同,否则运行时报错)。

27行是获取我们自定义类中的sendEventMySelf的IMP,28行是关键的一行,这一行的主要目的是为UIWindow原生的sendEvent指定一个新的实现,我们看到我们将该实现指定到了我们自己定义的sendEventMySelf上。到了这儿我们就完成了偷梁换柱,大功告成。

执行上面这些行以后,我们就成功的将UIWindow的sendEvent重定向到了我们自己的写的sendEventMySelf的实现,然后将其原本的实现重定向到了我们给它新添加的方法sendEventOriginal中。而sendEventMySelf中,我们首先可以对这个消息进行我们想要的处理,然后再通过41行调用sendEventOriginal方法转到正常的执行流程。

为什么执行起来不报错,而且还会正常执行?因为sendEventMySelf是UIWindow的sendEvent重定向过来的,所以在运行时该方法中的self代表的就是UIWindow的实例,而不再是TestHookObject的实例了。加上sendEventOriginal是我们通过运行时添加到UIWindow的实例方法,所以可以正常调用。当然如果直接通过下面这种方式调用也是可以的,只不过编译器会提示警告

(编译器没那么智能)

,因此我们采用了performSelector的调用方式。

[self sendEventOriginal:event];以上就是Hook的实现,使用时我们只需要让TestHookObject类执行一次初始话操作就可以了,执行完以后。UIWindow的sendEvent消息就会会hook到我们的sendEventMySelf中了。

下面是调用代码:

Install Hook

代码中我们还专门添加了一个button来验证,hook完以后消息是否正常传递。经验证消息流转完全正常。

各种Hook开发代码集锦

MonkeyDev的MonkeyApp模板的开发

Theos开发

如果分析到目标sub_xxx函数之后,可以直接静态修改二进制文件,用Hopper打开目标二进制文件,注意选择正确的架构,然后定位到调用sub_xxx函数的地方(一般是bl sub_xxx这样的),在要修改的语句上按Alt + A,将当前汇编指令修改为nop(nop是arm汇编里的一条空指令,即什么也不做)即可,但这样只能完全阻止调用sub_xxx,如果只是需要在sub_xxx函数中插入一点逻辑,则需另外想办法,然后Hopper-File-Produce New Executable... 保存为新的二进制文件或lib,现在大部分只有arm64,如果还需要armv7的,则将原二进制文件以armv7的架构打开,找到sub_xxx执行上述的操作并保存, 将上面两个得到的二进制文件合并lipo

hook通知代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于hook消息、hook通知代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/27485.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载