iphone - mobilesubstrate 可以 Hook 这个吗?

标签 iphone c++ ios jailbreak

我想 Hook 在 ImageIO 框架中本地声明的名为 png_handle_IHDR 的函数。我使用 MobileSafari 作为过滤器。但是在调用原始功能时,mobilesafari 崩溃了。检查 NSLog 后,我得到了这个:

Jun  5 17:21:08 unknown MobileSafari[553] <Warning>: dlopen ImageIO success!
Jun  5 17:21:08 unknown MobileSafari[553] <Warning>: Zeroing of nlist success!
Jun  5 17:21:08 unknown MobileSafari[553] <Warning>: method name successfully assigned!
Jun  5 17:21:08 unknown MobileSafari[553] <Warning>: nlist SUCCESS! nlsetting..
Jun  5 17:21:08 unknown MobileSafari[553] <Warning>: nlset success! Hooking..
Jun  5 17:21:09 unknown MobileSafari[553] <Warning>: Png IHDR handle hooking!
Jun  5 17:21:09 unknown UIKitApplication:com.apple.mobilesafari[0x819][553] <Notice>: libpng error: Invalid IHDR chunk
Jun  5 17:21:09 unknown ReportCrash[554] <Notice>: Formulating crash report for process MobileSafari[553]
Jun  5 17:21:09 unknown com.apple.launchd[1] <Warning>: (UIKitApplication:com.apple.mobilesafari[0x819]) Job appears to have crashed: Abort trap: 6
Jun  5 17:21:09 unknown SpringBoard[530] <Warning>: Application 'Safari' exited abnormally with signal 6: Abort trap: 6

我马上想到,很有可能是我弄错了png_handle_IHDR的函数原型(prototype)。以下是我在调整中的代码:

#import <CoreFoundation/CoreFoundation.h>
#include <substrate.h>

#define ImageIO "/System/Library/Frameworks/ImageIO.framework/ImageIO"

void (*png_handle_IHDR)();

MSHook(void, png_handle_IHDR){
    NSLog(@"Png IHDR handle hooking!\n");
    _png_handle_IHDR(); //crashed here!!
    NSLog(@"Png IHDR handle hooking finished!\n");

}

template <typename Type_>
static void nlset(Type_ &function, struct nlist *nl, size_t index) {
    struct nlist &name(nl[index]);
    uintptr_t value(name.n_value);
    if ((name.n_desc & N_ARM_THUMB_DEF) != 0)
        value |= 0x00000001;
    function = reinterpret_cast<Type_>(value);
}

MSInitialize {

        if (dlopen(ImageIO, RTLD_LAZY | RTLD_NOLOAD)!=NULL)
        {       
                NSLog(@"dlopen ImageIO success!\n");
                struct nlist nl[2];
                bzero(&nl, sizeof(nl));
                NSLog(@"Zeroing of nlist success!\n");
                nl[0].n_un.n_name = (char*) "_png_handle_IHDR"; 
                NSLog(@"method name successfully assigned!\n");
                nlist(ImageIO,nl);
                NSLog(@"nlist SUCCESS! nlsetting..\n");
                nlset(png_handle_IHDR, nl, 0);  
                NSLog(@"nlset success! Hooking..\n");
                MSHookFunction(png_handle_IHDR,MSHake(png_handle_IHDR));
        }        
}

我的 makefile 是这样的:

include theos/makefiles/common.mk

TWEAK_NAME = privateFunctionTest
privateFunctionTest_FILES = Tweak.xm

include $(THEOS_MAKE_PATH)/tweak.mk
privateFunctionTest_FRAMEWORKS = UIKit ImageIO CoreGraphics Foundation CoreFoundation

编辑:问题是,了解成功 Hook 所必需的原始函数参数吗?如果是,从反汇编中获取函数原型(prototype)是唯一的方法吗?在任何 SDK header 中都没有对此的定义。谢谢。

最佳答案

好的,我反编译了函数,得到了反编译器猜到的函数原型(prototype)。只要参数和返回类型广泛匹配,例如bool : int, unsigned int : int,它仍然可以工作而不会终止执行。所以这有效:

int *png_handle_IHDR(int a1, int a2, int a3);

MSHook(int, png_handle_IHDR, int a1, int a2, int a3){

    NSLog(@"png_handle_IHDR(%d,%d,%d)", a1,a2,a3);
    int val = _png_handle_IHDR(a1,a2,a3);
    NSLog(@"Png IHDR handle hooking finished, returning %d as result!", val);
    return val;

}

关于iphone - mobilesubstrate 可以 Hook 这个吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10894838/

相关文章:

ios - 如何通过应用拦截和解析来电

c++ - 在 C++ 中清理对象的动态数组

ios - iOS 上的跨应用数据交换

iphone - 加载新视频时隐藏 MPMoviePlayerController

iPhone:导航 Controller 上方有图像/广告吗?

c++ - 在 Visual Studio 2005 中调试时显示环境变量?

c++ - 从字符串列表生成正则表达式

java - java、linux开发机苹果推送通知服务

ios - Xcode 不显示运行设备

ios - 如何在 Swift 模型中存储 JSON 响应