使用Hopper查看需要hook的函示为下面
/* @class _TtC13hookdemoswift14ViewController */
-(void)btnClick:(void *)arg2 {
[self retain];
Swift._bridgeAnyObjectToAny();
r0 = sub_100007a04(0x1000118a8);
r0 = swift_allocObject(r0, 0x40, 0x7);
r8 = *type metadata for Swift.String;
*(int128_t *)(r0 + 0x10) = *0x100009ea0;
*(r0 + 0x38) = r8;
*(int128_t *)(r0 + 0x20) = 0x6f57206f6c6c6548;
*(int128_t *)(r0 + 0x28) = 0xeb00000000646c72;
Swift.print();
swift_release(r19);
sub_100007a40(&stack[-64]);
[r20 release];
return;
}
透过monkey的logos tweak去hook,.xm档案的程式码如下
// See http://iphonedevwiki.net/index.php/Logos
#if TARGET_OS_SIMULATOR
#error Do not support the simulator, please use the real iPhone Device.
#endif
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
//@interface _TtC9DEMOswift14ViewController:UIViewController
//@end
%hook hookdemoswift.ViewController
-(void)btnClick:(void *)arg2 {
%orig;
%log;
// 在hook方法中添加您的自定义逻辑
NSLog(@"Hooked buttonforhook:");
// 调用原始方法
return;
}
%end
.xm的程式透过monkeydev app测试是可以正常hook的
被hook的手机为ios14.6版本,
会发生Thread 1: EXC_BAD_ACCESS (code=2, address=0x104b2be94)的错误,如何解决,但是ios13版本得iphone不会发生
【以下回答由 GPT 生成】
解决方案:
根据您提供的信息,您在iOS中使用Monkey's Logos进行hook时遇到了兼容性问题和错误。下面是一些解决方案和建议:
首先,确保您的代码在不同的iOS版本上都能正常运行,可以按照以下步骤进行:
检查所使用的API和框架的文档,查看在不同iOS版本上是否有任何更改或限制。特别关注-[UIViewController viewDidLoad]
方法的变化。
解决针对不同iOS版本的兼容性问题:
一旦确定了具体的iOS版本兼容性问题,可以考虑以下解决方案之一:
使用条件编译:在代码中使用条件编译来处理不同iOS版本的差异。通过检查当前运行的iOS版本,可以使用不同的代码分支处理具体问题。例如:
objective-c #import <UIKit/UIKit.h> %hook _TtC9DEMOswift14ViewController -(void)viewDidLoad { %orig; #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_6 if (@available(iOS 14.0, *)) { NSLog(@"Running on iOS 14 or later"); // 在iOS 14.0及更高版本上进行特定的处理 NSLog(@"show Hook"); } #endif return; } %end
根据不同版本使用不同的Hook方法:如果需要在不同版本上使用不同的Hook方法,您可以根据运行时的iOS版本选择不同的Hook方法。例如:
```objective-c #import %hook _TtC9DEMOswift14ViewController
%if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_6 -(void)viewDidLoad { %orig; if (@available(iOS 14.0, *)) { NSLog(@"Running on iOS 14 or later"); NSLog(@"show Hook for iOS 14 and later"); } return; } %endif
%if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_14_6 -(void)viewDidLoad { %orig; NSLog(@"show Hook for iOS version earlier than 14"); return; } %endif
%end ```
修复EXC_BAD_ACCESS错误:
EXC_BAD_ACCESS
错误通常与内存访问问题有关。你可以尝试下面的解决方案来修复这个错误:
%orig
之前和之后的代码,特别是那些访问对象或调用方法的地方,确保在hook方法中正确处理对象的生命周期。如果以上解决方案都不起作用,那可能需要进一步调试和分析,或者请提供更多详细的代码和错误信息,以便进一步帮助您解决问题。
希望以上解决方案对您有所帮助!如果您需要更多的帮助,请随时提问。