-
-
[原创]分析substrate的HookMessageEx实现细节
-
发表于:
2014-8-22 19:02
7553
-
[原创]分析substrate的HookMessageEx实现细节
这是个初版本,是substrate的HookMessageEx实现的一部分,可以不依赖substrate,在未越狱的机器上, app里实现hook类成员函数,已经测试可用,毕竟是初版,很多细节的地方还需要完善,不对的地方请见谅.
自己动手丰衣足食
#import <objc/runtime.h>
#import <objc/message.h>
#import <sys/mman.h>
void MYHookMessageEx(Class _class, SEL sel, IMP imp, IMP *result)
{
const char * _className = "nil";
const char *_methodName = "NULL";
if (TRUE) {
if (_class) {
_className = class_getName(_class);
}
if (sel) {
_methodName = sel_getName(sel);
}
NSLog(@"[ MYHookMessageEx ] MYHookMessageInternal(%s , %s, %p, %p)", _className, _methodName, imp, result);
}
if (_class) {
if (sel) {
if (imp) {
unsigned int outCount = 0;
Method *_methodArray = class_copyMethodList(_class, &outCount);
if (_methodArray == NULL) {
_class = class_getSuperclass(_class);
if (_class) {
_methodArray = class_copyMethodList(_class, &outCount);
if (_methodArray == NULL) {
NSLog(@"[ MYHookMessageEx ] Warning: message not found [%s %s]", _className, _methodName);
return;
}
} else {
NSLog(@"[ MYHookMessageEx ] Warning: message not found [%s %s]", _className, _methodName);
return;
}
}
// 遍历方法,找到函数
unsigned int i = 0;
Method _methodfind = NULL;
for (; i < outCount; i++) {
SEL _selmethod = method_getName(_methodArray[i]);
if (sel_isEqual(sel, _selmethod) == YES) {
_methodfind = _methodArray[i];
break;
}
}
if (_methodfind == NULL) {
free(_methodArray);
NSLog(@"[ MYHookMessageEx ] Warning: message not found [%s %s]", _className, _methodName);
return;
}
*result = method_getImplementation(_methodfind);
method_setImplementation(_methodfind, imp);
NSLog(@"[ MYHookMessageEx ] Warning: Hook Sucess");
} else {
NSLog(@"[ MYHookMessageEx ] Warning: nil imp argument");
}
} else {
NSLog(@"[ MYHookMessageEx ] Warning: nil sel argument");
}
} else {
NSLog(@"[ MYHookMessageEx ] Warning: nil class argument for selector");
}
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)