imxz | 发布于 2018-12-21 14:24:19 | 阅读量 740 |
发布于 2018-12-21 14:24:19 |


开始学习IOS逆向踩了很多坑,

尤其是使用Theos编写Tweak插件的时候需要Hook一些地方,

查阅了很多资料,整理了以下几点

环境:

IOS11.3.1

MAC OS

THEOS

需要了解的

Logos语法 请自行百度

1.对地址函数的Hook

//引入一些必要的头文件
#import "substrate.h"
#import <Foundation/Foundation.h>
#import <dlfcn.h>
#import <mach-o/dyld.h>
//我要HOOK的地址是 静态下的 0x1000083B0 
//它有一个参数
//先声明一个旧的函数(名称随意)(这是个解密函数地址)
char* (*Old_1000083B0)(const char* base64);
//然后实现一个新的函数(名称随意)
//内容根据情况编写
char* New_1000083B0(const char* base64)
{
  NSString * str_q = [NSString stringWithUTF8String:base64];
  NSLog(@"IMXZ_Q:%@",str_q);
  char* ret = Old_1000083B0(base64);
  NSString * str_h = [NSString stringWithUTF8String:ret];
  NSLog(@"IMXZ_H:%@",str_h);
  return ret;
}

//Logos语法
%ctor {
    //获取动态时的函数地址
    unsigned long base_1000083B0 = _dyld_get_image_vmaddr_slide(0) + 0x1000083B0;
    //替换需要Hook的函数
    MSHookFunction(
    (void *)base_1000083B0,
    (void *)&New_1000083B0,
    (void **)&Old_1000083B0);

}


2.对C函数的Hook

#import "substrate.h"
#import <Foundation/Foundation.h>
#import <dlfcn.h>
#import <mach-o/dyld.h>

//声明对应的函数
extern "C" char* getenv(const char* info);

char* (*Old_getenv)(const char* info);

char* New_getenv(const char* info)
{
  if(strcmp(info,"DYLD_INSERT_LIBRARIES") == 0)
  {
    return NULL;
  }
  return Old_getenv(info);
}

%ctor {

    MSHookFunction(
      &getenv,
      &New_getenv,
      &Old_getenv);

}
//-------------------------------------------------------------------------
//以下内容是一个新的 tweak
// 注意 下面的 代码  Makefile中 需要 一个flag支持
// ADDITIONAL_OBJCFLAGS = -fobjc-arc


#import "substrate.h"
#import <Foundation/Foundation.h>
#import <AdSupport/AdSupport.h>
#import <SystemConfiguration/CaptiveNetwork.h>
#import <NetworkExtension/NetworkExtension.h>

extern "C" CFDictionaryRef CNCopyCurrentNetworkInfo(CFStringRef interfaceName);

CFDictionaryRef (*Old_CNCopyCurrentNetworkInfo)(CFStringRef interfaceName);

////我让其返回 我指定的WIFI名称和MAC地址
CFDictionaryRef New_CNCopyCurrentNetworkInfo(CFStringRef interfaceName)
{

  id info = (__bridge_transfer id)Old_CNCopyCurrentNetworkInfo(interfaceName);

  if (info && [info count])
  {

    NSDictionary *dic = (NSDictionary *)info;
    NSArray* allkeys = [dic allKeys];
    NSMutableArray* allValue = [[NSMutableArray alloc] init];

    for (int i = 0; i < allkeys.count; i++)
    {
        NSString * key = [allkeys objectAtIndex:i];
        if([key isEqualToString:@"BSSID"])
        {
          NSString* retData = [UserInfoLoader GetDeviceInfoByKey:@"BSSID"];
          [allValue addObject:retData];
        }
        else if([key isEqualToString:@"SSID"])
        {
             NSString* retData = [UserInfoLoader GetDeviceInfoByKey:@"SSID"];
             [allValue addObject:retData];
        }
        else
        {
          id obj  = [dic objectForKey:key];
          [allValue addObject:obj];
        }
    }

    NSArray* _allValue = [NSArray arrayWithArray: allValue];

    NSDictionary *dict = [NSDictionary dictionaryWithObjects:_allValue forKeys:allkeys];

    return (__bridge_retained CFDictionaryRef)dict;
  }else
  {
    return (__bridge_retained CFDictionaryRef)info;
  }
}



%ctor {

  MSHookFunction(
    &CNCopyCurrentNetworkInfo,
    &New_CNCopyCurrentNetworkInfo,
    &Old_CNCopyCurrentNetworkInfo);
 
}

3.对类方法的Hook

//hook一个实例方法
%hook AppDelegate
//越狱检测的 我直接调用返回了 false
- (_Bool)isJailBreak{
  return false;
}
%end
//hook一个静态方法
%hook WXOMTAHelper
//越狱检测的 我直接返回了 false
+ (_Bool)isJB{
  return false;
}
%end

4.对类属性的Hook

//这是系统的一个对象
%hook UIDevice
    //获取属性 我返回了一个我指定的 IDFV
    - (NSUUID *)identifierForVendor{
      NSString* retData = [UserInfoLoader GetDeviceInfoByKey:@"IDFV"];
      NSUUID* retUUID =  [[NSUUID alloc] initWithUUIDString:retData];
      return retUUID;
    }
%end

//同上
%hook ASIdentifierManager
    //我返回了一个 我指定的IDFA
    - (NSUUID *)advertisingIdentifier{
      NSString* retData = [UserInfoLoader GetDeviceInfoByKey:@"IDFA"];
      NSUUID* retUUID =  [[NSUUID alloc] initWithUUIDString:retData];
      return retUUID;
    }
%end 


5.对Selector的Hook

暂未遇到需求














内容更新于: 2019-08-25 21:02:34
链接地址: http://imxz.cn/post/IOS-Tweak-Hook-%E6%95%99%E7%A8%8B

上一篇: 记一款IOS单机游戏《地牢防御》存档修改器的诞生

下一篇: IOS11越狱状态下运行Root权限App

740 人读过
立即登录, 发表评论.
没有帐号? 立即注册
0 条评论
文档导航