ios逆向發生在ios14.6版本問題

使用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时遇到了兼容性问题和错误。下面是一些解决方案和建议:

  1. 确定iOS版本兼容性问题:

首先,确保您的代码在不同的iOS版本上都能正常运行,可以按照以下步骤进行:

  • 在iOS 14.6上运行时报错的设备上,添加异常断点以捕捉错误的具体位置。通过选择“Debug Navigator”(调试导航器)或使用“lldb”命令行调试工具等,追踪错误信息,以确定错误发生的具体位置。
  • 检查所使用的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错误通常与内存访问问题有关。你可以尝试下面的解决方案来修复这个错误:

  • 检查你的代码中是否有空指针或野指针问题,特别是在访问对象或调用方法的地方。确保所有的对象引用在使用之前已经正确初始化。
  • 检查你的hook代码中是否有潜在的内存访问问题。在%orig之前和之后的代码,特别是那些访问对象或调用方法的地方,确保在hook方法中正确处理对象的生命周期。
  • 使用内存分析工具,如Instruments或Xcode的内存调试器,来检测内存泄漏或野指针等问题。分析和修复这些问题可能需要对整个代码库进行细致的调试和检查。

如果以上解决方案都不起作用,那可能需要进一步调试和分析,或者请提供更多详细的代码和错误信息,以便进一步帮助您解决问题。

希望以上解决方案对您有所帮助!如果您需要更多的帮助,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^