首页
社区
课程
招聘
[原创]分析substrate的HookMessageEx实现细节
发表于: 2014-8-22 19:02 7552

[原创]分析substrate的HookMessageEx实现细节

2014-8-22 19:02
7552
这是个初版本,是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");
    }
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 2443
活跃值: (464)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
HOOK 运行时,不越狱可以,但是dylib要签名才行~

感谢分享~~
2014-8-23 13:01
0
游客
登录 | 注册 方可回帖
返回
//