移动安全面试题—iOS相关

iOS砸壳工具原理(DYLD_INSERT_LIBRARIES注入dylib动态库)

在 iOS 平台上,砸壳(脱壳)是指将 App Store 下载的加密应用程序解密为未加密的形式。砸壳工具通常用于逆向工程和调试目的。
DYLD_INSERT_LIBRARIES 是 iOS 和 macOS 平台上动态链接器(dyld)的一个环境变量,它允许在程序启动时插入一个或多个动态库。通过插入包含砸壳功能的动态库,可以在程序运行时拦截并解密程序的加密部分,实现砸壳的目的。
以下是使用 DYLD_INSERT_LIBRARIES 实现砸壳的基本原理:

  1. 编写砸壳动态库:首先,我们需要编写一个包含砸壳功能的动态库。这个库需要实现以下功能:
    • 拦截 mmap、mremap_encrypted 等与内存映射相关的系统调用;
    • 在拦截的系统调用中,检测到加密的内存段(通过 cryptid 字段识别)时,使用系统提供的解密方法(如 mremap_encrypted)对其进行解密;
    • 将解密后的内存段重新映射回程序。
  2. 获取待砸壳程序的路径:需要获取目标应用程序的路径,以便在稍后的步骤中运行它。
  3. 使用 DYLD_INSERT_LIBRARIES 注入砸壳动态库:在运行目标程序之前,将 DYLD_INSERT_LIBRARIES 环境变量设置为砸壳动态库的路径,例如:
export DYLD_INSERT_LIBRARIES=/path/to/your/dylib
  1. 运行目标程序:现在可以运行目标程序。由于已经设置了 DYLD_INSERT_LIBRARIES,dyld 会在程序启动时自动加载砸壳动态库,从而在运行时解密程序的加密部分。
  2. 导出解密后的程序:在完成上述步骤后,可以使用其他工具(如 class-dump、MachOView 等)导出解密后的程序,以便进一步分析和逆向工程。

以上就是使用 DYLD_INSERT_LIBRARIES 注入砸壳动态库的基本原理。请注意,这种方法在 iOS 平台上的实际可行性可能受到系统版本、越狱状态等因素的影响。

iOS如何在不越狱的情况下去hook一个c函数,了解fishhook吗,Method Swizzling呢

在不越狱的 iOS 设备上,针对 C 函数进行 hook 的方法之一是使用 fishhook 库。fishhook 是一个由 Facebook 开发的轻量级的、可以在 iOS 和 macOS 上使用的动态链接库 hooking 工具。它可以在运行时重新绑定(rebind)C 符号,从而实现 hook C 函数的目的。
以下是使用 fishhook 进行 C 函数 hook 的基本步骤:

  1. 导入 fishhook 库:首先,你需要将 fishhook 库导入到你的项目中。可以通过克隆官方仓库或使用 CocoaPods 等方式进行导入:
  2. 编写 hook 函数:接下来,编写用于替换原始 C 函数的 hook 函数。例如,如果你想要 hook printf 函数,可以编写如下的 hook 函数:objcCopy
#include <stdio.h>

static int (*orig_printf)(const char * restrict format, ...);

int hook_printf(const char * restrict format, ...) {
    
    
    // 在这里编写你的 hook 逻辑
    // 例如,在原始 printf 输出的基础上添加前缀
    va_list args;
    va_start(args, format);
    int result = orig_printf("[HOOK] ");
    result += orig_printf(format, args);
    va_end(args);
    return result;
}
  1. 使用 fishhook 进行 rebind:接下来,使用 fishhook 库的 rebind_symbols 函数进行符号重绑定。在上面的例子中,你可以这样做:objcCopy
#import <fishhook/fishhook.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    
    // 在这里进行符号重绑定
    rebind_symbols((struct rebinding[1]){
    
    {
    
    "printf", hook_printf, (void *)&orig_printf}}, 1);

    // 接下来的 printf 调用将使用 hook 函数
    printf("Hello, world!\n");

    return YES;
}

至于 Method Swizzling,它是 Objective-C 中用于在运行时替换方法实现的技术。但是,这种技术主要应用于 Objective-C 方法,而不是 C 函数。如果你想要 hook Objective-C 方法,可以使用 Method Swizzling;如果你需要 hook C 函数,可以使用 fishhook 这样的工具。

猜你喜欢

转载自blog.csdn.net/u010671061/article/details/132268639