hooker

iOS逆向与安全4.1:深入浅出谈Hook

2019-05-29  本文已影响0人  looha

HOOK

HOOK,中文译为“挂钩”或“钩子”。在iOS逆向中是指改变程序运行流程的一种技术。通过hook可以让别人的程序执行自己所写的代码。在逆向中经常使用这种技术。我们重点要了解其原理,这样能够对恶意代码进行有效的防护。

以现在很多应用都有的转账功能做示例;


image.png

iOS中HOOK技术的几种方式

Method Swizzle

image.png

Cydia Substrate

1、MobileHooker

顾名思义用于HOOK。它定义一系列的宏和函数,底层调用objc的runtime和fishhook来替换系统或者目标应用的函数.其中有两个函数:

2、MobileLoader

fishHook

它是Facebook提供的一个动态修改链接mach-O文件的工具。利用MachO文件加载原理,通过修改懒加载和非懒加载两个表的指针达到C函数HOOK的目的。

关键函数

image.png

参数一 存放rebinding结构体的数组(可以同时交换多个函数)
参数二 rebindings数组的长度

image.png
  const char *name;//需要HOOK的函数名称,C字符串
  void *replacement;//新函数的地址
  void **replaced;//原始函数地址的指针!把原始的函数保存在replaced
};

fishHook使用

//    rebinding结构体
    struct rebinding nslog;
    nslog.name = "NSLog";//重新绑定的函数名称
    nslog.replacement = myNSLog;//提供要替换绑定的函数
    nslog.replaced = (void **)&sys_nslog;//原始函数,把系统原NSLog保存在sys_nslog中


//定义数组
    struct rebinding rebs[1] = {nslog};

/** 用来重新绑定符号
     *  arg1: 存放rebinding结构体的数组!
     *  arg2: 数组的长度!
     */
    rebind_symbols(rebs, 1);


//----------------------更改系统NSLog的调用-------------------------
//函数指针,用来保存原始的函数地址
static void(*sys_nslog)(NSString *format, ...);


//定于一个新的函数
void myNSLog(NSString *format, ...){
    format = [format stringByAppendingString:@"\n勾上了!!"];
    //由于我们不知道NSLog内部实现,所以保留原始的调用!
    sys_nslog(format);
}

PS ** fishHook不能hook自己定义的函数 **

DYLD加载

共享缓存库

苹果提供的系统库,UIkit等等系统库,又dyld加载,当App需要访问系统库时,dyld引导在共享缓存库查找并使用

探索Hook

PIC 位置独立代码

MachO文件中 _DATA 建立指针,指向外部函数。
func();
bl 0x102606a18 --> 指向PIC中的指针。当代码在运行时,该指针无意义,可以理解为占位,当调用时获取共享缓存库中的函数地址,赋值给0x102606a18,从而指向共享缓存库中的函数,此为Macho文件的PIC技术,间接调用。

fishHook HooK C函数

在PIC间接调用时,代码初始运行时的函数地址再被调用而去绑定共享缓存库真是函数地址的时候,把我们自己写的函数地址赋值给代码初始运行时的函数地址,从而达到调用我们代码的目的。

dyld 并不会在加载image的时候,不会给函数(lazy函数)赋值,第一次调用时才赋值,即符号绑定

核心原理:fishHook 在重新绑定的时候,给代码初始运行时的函数地址赋值,通过传入的fishHook.name函数名称,找打符号,并给符号赋值为我们的函数。fishHook并不是调用再第一次调用函数的时候替换绑定,而是fishHook rebind_symbols绑定的时候替换绑定

ps
X 0x12134434 可读内存的值,右往左读
dis - s 0x12134434 读汇编

通过符号找字符串

sysmbols Table

String Table

上一篇下一篇

猜你喜欢

热点阅读