不成功的Hook调用

Hook IOS 设备的 invertColors 选项 但是不成功

#import "UIKit/UIKit.h"
#import "Foundation/Foundation.h"

static NSNumber * flag = [NSNumber numberWithInt:1];

extern "C" BOOL _AXSInvertColorsEnabled(NSNumber* flag);
%hook SpringBoard
- (void)_menuButtonDown:(struct __IOHIDEvent *)arg1
{
    %orig;
    flag = flag ==[NSNumber numberWithInt:1]?[NSNumber numberWithInt:0]:[NSNumber numberWithInt:1];
    _AXSInvertColorsEnabled(flag);
    
    NSLog(@"NSNumber flag = %@  ",flag);
}
%end

最后安装成功后 有打印
Jan 9 13:12:45 Panda-iphone SpringBoard[993]: NSNumber flag = 0
Jan 9 13:12:53 Panda-iphone SpringBoard[993]: NSNumber flag = 1
Jan 9 13:12:54 Panda-iphone SpringBoard[993]: NSNumber flag = 0
Jan 9 13:13:33 Panda-iphone SpringBoard[993]: NSNumber flag = 1
Jan 9 13:13:34 Panda-iphone SpringBoard[993]: NSNumber flag = 0
Jan 9 13:13:35 Panda-iphone SpringBoard[993]: NSNumber flag = 1
但是就是不能成功切换选项

_AXSInvertColorsEnabled的函数原型和功能不是你想象的这样,这个函数仅仅是返回当前是否enabled;要enable/disable,貌似是用_AXSInvertColorsSetEnabled函数

大神,刚才是找错了函数,现在找到了函数,但是不知道是什么对象调用了它,
只知道是 [AccessibilitySettingsController accessibilitySetPreference:specifier:] 中的 arg1 调用了_handleInvertColorsEnabled
函数原型在 https://github.com/thenameisnigel/IOS7-Beta-1-Class-Dumps/blob/master/AccessibilitySettings/AccessibilitySettingsController.h 这里看到的
我只能去 hook 这个类AccessibilitySettingsController 的函数accessibilitySetPreference:specifier 然后去了解arg1是什么类然后才能调用_handleInvertColorsEnabled
%hook AccessibilitySettingsController

-(void)accessibilitySetPreference:(id)preference specifier:(id)specifier
{
UIAlertView *alert = [UIAlertView alloc] initWithTitle:@“Hello ,welcome panda’ tweak!” message:nil delegate:nil cancelButtonTitle:@“ok” otherButtonTitles:nil];
[alert show];

    NSLog(@"accessibilitySetPreference preference = %s  descript %@ specifier = %s descript %@",object_getClassName(preference),preference
          ,object_getClassName(specifier),specifier);
%orig;

}

%end
但是这个tweak始终不成功~_~
这个是 AccessibilitySetting 里的 invert color 选项的函数

我问的问题跟 141页的问题 一样,找到来电默认接听方式的查询函数
这个函数是 [specifier intValue] 照样的 我同样不知道 specifier 也就是 arg2 是什么对象 调用的initValue?

你现在的目的是什么?hook这个_AXSInvertColorsSetEnabled函数吗?

你hook

-(void)accessibilitySetPreference:(id)preference specifier:(id)specifier

是为了干什么?

是为了 知道(id)preference specifier:(id)specifier 是什么参数,书的后面介绍了可以 在跳过函数返回去看,但我这样像上面那样Hook 为什么不能成功呢? HOOK 只是为了验证能Hook住,现在问题就是HOOK 不住, 这是为什么呢,这个函数是被导出的函数?

你的filter填的是谁?这个函数可能是被某个bundle调用的,而不是被Preferences本身调用的,你hook的对象可能有问题

我用的 IOSOpenDev 新手不建议用吗?
难道默认是指定 SpingBoard???

好吧 我错了刚学学IOSOpenDev
我居然默认是 SpringBoard
~
我改改

新手不建议使用iOSOpenDev,这个IDE太智能,省略了许多初学者应该掌握的基本原理,其实是害了你

好的 下次绝不用它了~~~~
调试时,看到
[328] 0x0000000005e48000 /Users/panda/Library/Developer/Xcode/iOS DeviceSupport/8.1.2 (12B440)/Symbols/System/Library/PrivateFrameworks/CoreServicesInternal.framework/CoreServicesInternal
[329] 0x0000000105184000 /System/Library/PreferenceBundles/AccessibilitySettings.bundle/AccessibilitySettings(0x0000000105184000)
[330] 0x0000000005e48000 /System/Library/PrivateFrameworks/ScreenReaderOutput.framework/ScreenReaderOutput(0x00000001932cc000)
[331] 0x0000000005e48000 /System/Library/PrivateFrameworks/UIAccessibility.framework/UIAccessibility(0x0000000194a50000)
[332] 0x0000000005e48000 /System/Library/PrivateFrameworks/Accessibility.framework/Frameworks/AccessibilityUIService.framework/AccessibilityUIService(0x000000018d418000)

我设置 filter 为
com.apple.AccessibilitySettings或者
com.apple. Preferences
都不能HOOK住 没法了~~~

我估计这个函数是在AccessibilitySettings内部调用的,至于为什么没有hook到呢,应该是因为:
你点击图标,启动Preferences.app;在Preferences内部点击某个选项,它(延迟)加载AccessibilitySettings。
如果你hook的是com.apple.Preferences,目标就是错的;
如果你hook的是com.apple.AccessibilitySettings,因为CydiaSubstrate是随Preferences启动而加载的,Preferences启动时AccessibilitySettings还未得到加载,此时尝试hook,会因找不到hook对象而失败。
解决办法是,找到Prefenreces加载AccessibilitySettings的函数,在这个函数里做判断,当AccessibilitySettings得到加载时%init(hook)。
这个情况有点类似于最后一章“拦截电话”,你感受一下

谢谢大神!!!我也想到是这样,就是没想怎么解决,看来 书还是得看完才提问~~~ ~_~