Skip to content

Instantly share code, notes, and snippets.

@jaoye
Last active April 1, 2019 02:11
Show Gist options
  • Save jaoye/22b731ba168931c7087f682702039bc5 to your computer and use it in GitHub Desktop.
Save jaoye/22b731ba168931c7087f682702039bc5 to your computer and use it in GitHub Desktop.
[How to use MSHookFunction] #CydiaSubstrate #iOSHook

CydiaSubstrate Hook 有两个函数 MSHookMessageEx 和 MSHookFunction

MSHookMessageEx 用来 hook Objective-C 函数

MSHookFunction 用来 hook C/C++ 函数

MSHookMessageEx 使用的是 method swizzle 方法

MSHookFunction 是通过函数地址进行的交换

官方实例:

void *(*oldConnect)(int, const sockaddr *, socklen_t);

void *newConnect(
    int socket, const sockaddr *address, socklen_t length
) {
    if (address->sa_family == AF_INET) {
        sockaddr_in *address_in = address;
        if (address_in->sin_port == htons(6667)) {
            sockaddr_in copy = *address_in;
            address_in->sin_port = htons(7001);
            return oldConnect(socket, &copy, length);
        }
    }

    return oldConnect(socket, address, length);
}

MSHookFunction(&connect, &newConnect, &oldConnect);

函数的第一个参数 &connect 是调用 MSFindSymbol ,该函数会根据函数名查找函数地址。

所以第一个参数实际上就是函数地址,由此我们就可以通过传入函数地址,来 hook 任何 C/C++ 函数了。

实例:

void (*orig_testMethod)(void);

void hook_testMethod(void) {
    // 调用原函数
  
}

unsigned long _sub_10016E640 = (_dyld_get_image_vmaddr_slide(0) + 0x100006678);
MSHookFunction((void *)(0x100006678+g_slide), (void *)hook_testMethod, (void **)&orig_testMethod);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment