3

我正在编写一个记录系统中所有 darwin 通知的钩子。我挂钩以下功能:

CFNotificationCenterPostNotification
CFNotificationCenterPostNotificationWithOptions
NSNotificationCenter::postNotification
NSNotificationCenter::postNotificationName

我看到很多日志。例如,当我解锁屏幕时,它会显示 SBDeviceLockStateChangedNotification。

但我期待像“com.apple.springboard.lockcomplete”这样的事件或像这里这样的其他事件

不知道为什么我无法捕获类似达尔文的通知。任何帮助表示赞赏。这是审查的代码

#include <notify.h>
#include <substrate.h>
#include <sqlite3.h>
#include <string.h>
#import <CoreFoundation/CFNotificationCenter.h>
//#include "CPDistributedMessagingCenter.h"
#import <CoreFoundation/CoreFoundation.h>
#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>
//#import <SpringBoard/SpringBoard.h>


// init CFNotificationCenterPostNotification hook
void (*orig_CFNotificationCenterPostNotification) (
                                                   CFNotificationCenterRef center,
                                                   CFStringRef name,
                                                   const void *object,
                                                   CFDictionaryRef userInfo,
                                                   Boolean deliverImmediately
                                                   );

void replaced_CFNotificationCenterPostNotification (
                                                    CFNotificationCenterRef center,
                                                    CFStringRef name,
                                                    const void *object,
                                                    CFDictionaryRef userInfo,
                                                    Boolean deliverImmediately
                                                    ){
    NSLog(@"CFNotificationCenterPostNotification: %@", name );

    orig_CFNotificationCenterPostNotification(center,name,object,userInfo,deliverImmediately);

}

void (*orig_CFNotificationCenterPostNotificationWithOptions) (
                                                      CFNotificationCenterRef center,
                                                      CFStringRef name,
                                                      const void *object,
                                                      CFDictionaryRef userInfo,
                                                      CFOptionFlags options
                                                      );
void replaced_CFNotificationCenterPostNotificationWithOptions (
                                                      CFNotificationCenterRef center,
                                                      CFStringRef name,
                                                      const void *object,
                                                      CFDictionaryRef userInfo,
                                                      CFOptionFlags options
                                                      )
{
    NSLog(@"CFNotificationCenterPostNotificationWithOptions: %@", name );

    orig_CFNotificationCenterPostNotificationWithOptions(center,name,object,userInfo,options);

}

%hook SpringBoard

-(void)applicationDidFinishLaunching:(id)application {
    %orig;

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Welcome"
                                                    message:@"Welcome to my iPhone!"
                                                   delegate:nil
                                          cancelButtonTitle:@"Thanks"
                                          otherButtonTitles:nil];
    [alert show];
    //[alert release];
}
%end
%hook NSNotificationCenter
- (void)postNotification:(NSNotification *)notification{

        NSLog(@"NSNotificationCenterpostNotification: %@",[notification name]);

    %orig;
}
- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo{

        NSLog(@"NSNotificationCenterpostNotificationName: %@",aName);

    %orig;
}

%end
__attribute__((constructor)) void notificationinit() {

%init;

    MSHookFunction(CFNotificationCenterPostNotification, replaced_CFNotificationCenterPostNotification, &orig_CFNotificationCenterPostNotification);

    MSHookFunction(CFNotificationCenterPostNotificationWithOptions, replaced_CFNotificationCenterPostNotificationWithOptions, &orig_CFNotificationCenterPostNotificationWithOptions);

}
4

1 回答 1

5

所以,有几点想法:

  1. 首先,您能解释一下为什么要使用方法调配或挂钩来检测这些通知吗?您是否试图实际拦截通知,在您的软件中处理它们,并阻止它们被传递到系统的其余部分?如果这就是你想要的,那么我理解你的方法。如果您只是想接收这些通知,那么我会推荐只注册达尔文事件(全部或按名称)的正常方法。 有关示例,请参见此处

  2. 这只是com.apple.springboard.lockcomplete事件的问题吗?因为解锁设备时不会生成该事件。仅在锁定时发布。要检测解锁事件,您可以看到这个答案

  3. 如果您仍然遇到问题,这可能是因为事件可以通过多种方式发布。您可能会钩住CFNotificationCenterPostNotification()and CFNotificationCenterPostNotificationWithOptions(),但它们并不是发布事件的唯一方式。也可以使用低级notify_post() API 。我的猜测是,它CFNotificationCenterPostNotification()实际上会使用notify_post()调用来发布事件。因此,如果您尝试检测事件,尤其是未记录的事件,iOS 可能会直接使用 发布该事件notify_post(),这可以解释为什么您没有看到它。

希望这可以帮助。

于 2013-07-19T08:41:30.697 回答