• Stars
    star
    230
  • Rank 174,053 (Top 4 %)
  • Language
    Objective-C
  • License
    MIT License
  • Created over 5 years ago
  • Updated 9 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

【iOS逆向】高效Tweak工具函数集,基于theos、monkeyDev。(含方法调用链追踪、递归获取任意层级view、拦截并修改全局请求、清除keyChain数据、block还原、打印类的属性和方法、数据转换、数据存储、添加轮询、网络请求、加密解密等各种协助逆向分析函数)

ZXHookUtil

注意事项

请勿将此项目用于任何违法用途,仅限用于对iOS逆向的学习和研究之用途

项目中引用或参照的第三方库:MonkeyDevANYMethodLogCocoaSecurityBase64mjcriptImagePicker

Demo

使用方法追踪分析sign校验规则,下图为hook测试App的截图,ZXHookUtilTestApp项目即为测试App。

[ZXHookUtil addClassTrace:@"LoginVC" jsonClassList:@[@"LoginModel"]];
[ZXHookUtil addClassTrace:@"HttpRequest"];
[ZXHookUtil addClassTrace:@"EncryptionTool"];

Image text
Demo大致分析流程:获取登录控制器,获取登录按钮,打印按钮绑定事件定位登录函数,使用hopper分析登录函数汇编即可快速定位登录操作中使用到的网络请求类、加密类,为这些类添加方法追踪,打印结果:'['所连接的即为一组方法的call和return,方法中嵌套包含的即为此方法中调用的其他方法,添加追踪目标类即可自动追踪其内部方法调用与调用层级并打印,加密协议已一目了然。

直接获取当前控制器的按钮,无需关注页面UI层级

//获取登录按钮(获取title为“登录”的按钮)
NSArray *btnsArr = [ZXHookUtil getUIInView:loginVC.view text:@"登录" type:UITypeButton];
if(btnsArr.count){
    UIButton *loginBtn = btnsArr[0];
    //打印登录按钮所有事件
    NSLog(@"loginBtnTar--%@",[ZXHookUtil getAllTouchUpAction:loginBtn]);
    //直接调用登录按钮的所有点击事件
    [ZXHookUtil callBtnActions:loginBtn];
}

直接获取当前控制器的UITextField,无需关注页面UI层级

UITextField *loginTf = [ZXHookUtil getTfInView:loginVC.view placeHolder:@"请输入用户名"];
UITextField *pwdTf = [ZXHookUtil getTfInView:loginVC.view placeHolder:@"请输入密码"];
if(loginTf){
    loginTf.text = @"123";
}
if(pwdTf){
    pwdTf.text = @"123";
}

拦截全局请求

[ZXRequestBlock handleRequest:^NSURLRequest *(NSURLRequest *request) {
    //拦截回调在异步线程
    NSLog(@"拦截到请求-%@",request);
    dispatch_async(dispatch_get_main_queue(), ^{
        self.blockTv.text = [self.blockTv.text stringByAppendingString:[NSString stringWithFormat:@"拦截到请求--%@\n",request]];
    });
    //在这里可以将request赋值给可变的NSURLRequest,进行一些修改(例如根据request的url过滤单独对一些请求的请求体进行修改等)然后再return,达到修改request的目的。
    return request;
}];

拦截全局请求与响应

[ZXRequestBlock handleRequest:^NSURLRequest *(NSURLRequest *request) {
    //拦截请求处理
    return request;
} responseBlock:^NSData *(NSURLResponse *response, NSData *data) {
    //拦截响应数据
    //如果为http请求,则响应为NSHTTPURLResponse,可进行强制转换
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    NSLog(@"拦截到响应url-%@", httpResponse.URL);
    NSLog(@"拦截到响应数据-%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    //这里返回的data就是最终的响应数据,可以自行修改
    //可以通过[str dataUsingEncoding:NSUTF8StringEncoding];来将字符串转NSData
    return data;
}];   

清除keychain数据

[ZXHookUtil clearKeyChain];

打印block参数,具体例子参见ZXBlockLog

NSLog(ZXBlockLog(block));

主要工具方法(类名为ZXHookUtil,使用[ZXHookUtil xxx]调用)

#pragma mark - Foundation
#pragma mark - BaseInfo

/**
 获取BundleId
 */
+(NSString *)getBundleId;

/**
 获取UUID
 */
+(NSString *)getUUID;

/**
 获取App安装路径
 */
+(NSString *)getAppPath;

/**
 获取App沙盒doc路径
 */
+(NSString *)getDocPath;

/**
 获取App沙盒Cache路径
 */
+(NSString *)getCachesPath;

#pragma mark - Class相关
/**
 获取类的所有属性和方法
 @param obj 类名或对象
 @return ZXHookClass获取结果
 */
+(ZXHookClass *)getClassContent:(id)obj;

/**
 获取类的所有方法描述
 @param obj 类名或对象
 @return 类的所有方法描述数组
 */
+(NSArray *)getClassMethodsDescription:(id)obj;


/**
 打印类的所有方法描述
 @param obj 类名或对象
 */
+(void)logClassMethodsDescription:(id)obj;

/**
 获取类的所有属性描述
 @param obj 类名或对象
 @return 类的所有属性描述数组
 */
+(NSArray *)getClassPropertiesDescription:(id)obj;

/**
 打印类的所有属性描述
 @param obj 类名或对象
 */
+(void)logClassPropertiesDescription:(id)obj;

/**
 判断是否是系统类
 @param cls 类
 @return 是否是系统类
 */
+(BOOL)isFoundationClass:(Class)cls;

/**
 获取所有子类
 @param obj 类名或对象
 @return 所有子类数组
 */
+(NSArray *)getSubClass:(id)obj;

/**
 获取所有父类
 @param obj 类名或对象
 @return 所有父类数组
 */
+(NSArray *)getSuperClass:(id)obj;

#pragma mark - 数据转换
/**
 任意类型转字典
 @param obj 待转换的对象
 @return 字典或字典数组
 */
+(id)toDic:(id)obj;

/**
 任意类型转Json字符串
 @param obj 待转换的对象
 @return Json字符串
 */
+(NSString *)toJson:(id)obj;

/**
 任意类型转keyvalue(form-data)类型
 @param obj 待转换的对象
 @return keyvalue(form-data)类型字符串
 */
+(NSString *)tokvStr:(id)obj;

/**
 任意类型转模型 cls为需要转的模型的类,orgObj为需要转的原始数据
 @param cls 需要转的模型的类
 @param orgObj 需要转的原始数据
 @return 模型或模型数组
 */
+(id)toModel:(Class)cls orgObj:(id)orgObj;

#pragma mark - 数据存储
/**
 存储到UserDefaults
 @param obj 需要存储的对象
 @param key 存储key
 */
+(void)saveObj:(id)obj forKey:(NSString *)key;

/**
 从UserDefaults中读取数据
 @param key 存储key
 @return 读取结果
 */
+(id)readObjForKey:(NSString *)key;

/**
 存储到沙盒doc文件夹
 @param obj 需要存储的对象
 @param pathComponent 存储路径
 */
+(void)arcObj:(id)obj pathComponent:pathComponent;

/**
 从沙盒doc文件夹中读取数据
 @param pathComponent 存储路径
 @return 读取结果
 */
+(id)unArcObjPathComponent:(NSString *)pathComponent;

/**
 清除所有缓存数据
 */
+(void)cleanAllData;

/**
 清除UserDefaults数据
 */
+(void)clearUserDefaults;

/**
 清除KeyChain数据
 */
+(void)clearKeyChain;

/**
 根据文件路径清除文件
 @param path 需要清除的文件的全路径
 */
+(void)cleanFileWithPath:(NSString *)path;

#pragma mark - 添加方法跟踪

/**
 添加方法跟踪
 @param className 需要追踪的类名
 */
+(void)addClassTrace:(NSString *)className;

/**
 添加方法跟踪
 @param classNames 需要追踪的类名数组
 */
+(void)addClassesTrace:(NSArray <NSString *>*)classNames;

/**
 添加方法跟踪
 @param className 需要追踪的类名
 @param methodList 需要追踪的对应类中的具体方法,传nil即为类中所有方法
 */
+(void)addClassTrace:(NSString *)className methodList:(NSArray <NSString *>*)methodList;

/**
 添加方法跟踪
 @param className 需要追踪的类名
 @param jsonClassList 方法打印中需要转为json的方法名数组
 */
+(void)addClassTrace:(NSString *)className jsonClassList:(NSArray *)jsonClassList;

/**
 添加方法跟踪
 @param className 需要追踪的类名
 @param methodList 需要追踪的对应类中的具体方法,传nin即为类中所有方法
 @param jsonClassList 方法打印中需要转为json的方法名数组
 */
+(void)addClassTrace:(NSString *)className methodList:(NSArray *)methodList jsonClassList:(NSArray *)jsonClassList;

#pragma mark - 全局请求拦截/修改
/**
 全局请求拦截/修改
 @param block request拦截回调
 */
+(void)handleRequest:(requestBlock)block;

/**
 拦截全局请求及响应
 @param requestBlock 请求回调,requestBlock返回修改后的请求
 @param responseBlock 响应回调,responseBlock返回修改后响应的NSData数据
 */
+(void)handleRequest:(requestBlock)requestBlock responseBlock:(responseBlock)responseBlock;

#pragma mark - 添加轮询
/**
 添加轮询
 @param sec 轮询时间(秒)
 @param pollPerStepBlock 轮询方法回调
 @return ZXPoll对象
 */
+(ZXPoll *)addTimerWithSec:(long)sec callBack:(pollPerStepBlock)pollPerStepBlock;

#pragma mark - 网络请求相关
/**
 post请求
 @param interface 请求子路径
 @param postData 请求体,字典
 @param _result 请求回调block,block中result为是否请求成功,data为字典
 */
+(void)postInterface:(NSString *)interface postData:(id)postData callBack:(kGetDataEventHandler)_result;

/**
 post请求
 @param urlStr 请求全路径
 @param postData 请求体,字典
 @param _result 请求回调block,block中result为是否请求成功,data为字典
 */
+(void)postUrl:(NSString *)urlStr postData:(id)postData callBack:(kGetDataEventHandler)_result;

/**
 get请求
 @param interface 请求子路径
 @param _result 请求回调block,block中result为是否请求成功,data为字典
 */
+(void)getInterface:(NSString *)interface callBack:(kGetDataEventHandler)_result;

/**
 get请求
 @param urlStr 请求全路径
 @param _result 请求回调block,block中result为是否请求成功,data为字典
 */
+(void)getUrl:(NSString *)urlStr callBack:(kGetDataEventHandler)_result;

#pragma mark - 加密/解密相关
/**
 aes解密
 @param data 待解密的base64字符串
 @param key 解密key
 @return 解密结果
 */
+(NSString *)aesDecryptWithBase64:(NSString *)data key:(NSString *)key;

/**
 aes加密
 @param data 待加密的字符串
 @param key 加密key
 @return 加密结果
 */
+(NSString *)aesEncrypt:(NSString *)data key:(NSString *)key;

/**
 md5加密
 @param hashString 待加密的字符串
 @return 加密结果
 */
+(NSString *)md5:(NSString *)hashString;

#pragma mark - UIKit
#pragma mark - Toast
/**
 Toast
 @param obj Toast显示内容
 */
+(void)showToast:(id)obj;

#pragma mark - UIGet
/**
 获取对应类型view
 @param view 控制器view
 @param type 查找的view的UI类型
 @param recursive 是否递归查找
 @return 查找结果
 */
+(NSMutableArray *)getUIInView:(UIView *)view type:(UIType)type recursive:(BOOL)recursive;

/**
 获取对应类型view
 @param view 控制器view
 @param cls 查找的view类名
 @param recursive 是否递归查找
 @return 查找结果
 */
+(NSMutableArray *)getUIInView:(UIView *)view class:(Class)cls recursive:(BOOL)recursive;

/**
 根据placeHolder从控制器获取UITextField
 @param view 控制器view
 @param placeHolder UITextField的placeHolder
 @return 查找结果
 */
+(UITextField *)getTfInView:(UIView *)view placeHolder:(NSString *)placeHolder;

/**
 根据颜色获取控件
 @param view 控制器view
 @param color 查找的view颜色
 @param type 查找的view的UI类型
 @return 查找结果
 */
+(NSMutableArray *)getUIInView:(UIView *)view color:(UIColor *)color type:(UIType)type;

/**
 根据frame获取控件
 @param view 控制器view
 @param frame 查找的view的frame
 @param type 查找的view的UI类型
 @return 查找结果
 */
+(NSMutableArray *)getUIInView:(UIView *)view frame:(CGRect)frame type:(UIType)type;

/**
 根据高度获取控件
 @param view 控制器view
 @param height 查找的view的height
 @param type 查找的view的UI类型
 @return 查找结果
 */
+(NSMutableArray *)getUIInView:(UIView *)view height:(CGFloat)height type:(UIType)type;

/**
 根据显示文字内容获取控件
 @param view 控制器view
 @param text 查找的view显示的text
 @param type 查找的view的UI类型
 @return 查找结果
 */
+(NSMutableArray *)getUIInView:(UIView *)view text:(NSString *)text type:(UIType)type;

/**
 获取keyWindow
 @return keyWindow
 */
+(UIWindow *)getKeyWindow;

/**
 获取根控制器
 @return 根控制器
 */
+(UIViewController *)getRootVC;

/**
 获取最前面的控制器
 @return 最前面的控制器
 */
+(UIViewController *)getTopVC;

#pragma mark - 按钮相关
/**
 添加一个全局按钮
 @param callBack 按钮点击事件回调
 */
+(void)addBtnCallBack:(ZXActionBlock)callBack;

/**
 添加一个全局按钮
 @param text 按钮显示文字
 @param callBack 按钮点击事件回调
 */
+(void)addBtnWithText:(NSString *)text CallBack:(ZXActionBlock)callBack;

/**
 添加一个全局按钮
 @param text 按钮显示文字
 @param frame 按钮frame
 @param callBack 按钮点击事件回调
 */
+(void)addBtnWithText:(NSString *)text frame:(CGRect)frame CallBack:(ZXActionBlock)callBack;

/**
 获取按钮的所有点击事件方法
 @param btn 目标Btn
 @return 目标Btn的所有target和对应绑定的事件方法
 */
+(NSMutableDictionary *)getAllTouchUpAction:(UIButton *)btn;

/**
 直接调用按钮的所有点击事件方法
 @param btn 需要调用点击事件的按钮
 */
+(void)callBtnActions:(UIButton *)btn;

#pragma mark - WebView相关
/**
 获取UIWebView的html
 @param webView UIWebView
 @return UIWebView的html
 */
+(NSString *)getHtmlWithUIWebView:(UIWebView *)webView;

/**
 打印WKWebView的html
 @param webView WkWebView
 */
+(void)logHtmlWithWkWebView:(WKWebView *)webView;

#pragma mark - 系统弹窗相关
/**
 展示一个系统弹窗
 @param text 弹窗的msg
 */
+(void)showAlert:(NSString *)text;

/**
 展示一个系统弹窗
 @param title 弹窗的title
 @param msg 弹窗的msg
 */
+(void)showAlertWithTitle:(NSString *)title msg:(NSString *)msg;

/**
 获取当前显示的系统弹窗
 @return 当前显示的系统弹窗
 */
+(UIView *)getCurrentSysAlertV;

/**
 销毁当前显示的系统弹窗
 */
+(void)disMissCurrentSysAlert;

#pragma mark - 图片选择、展示相关
/**
 从相册或相机中选取图片
 @param photoBlock 选择图片回调
 */
-(void)getPhoto:(ImagePickerBlock)photoBlock;

#pragma mark 快速展示一张图片
/**
 快速展示一张图片
 @param img 需要展示的图片
 */
+(void)showImg:(UIImage *)img;

TODO:添加其他便捷的工具函数,提高逆向分析效率

More Repositories

1

uni-z-paging

【uni-app下拉刷新、上拉加载】高性能,全平台兼容。支持vue、nvue、vue2、vue3,使用wxs+renderjs实现。支持虚拟列表,支持自定义下拉刷新、上拉加载更多,支持自动管理空数据图、点击返回顶部,支持聊天分页、本地分页,支持国际化等100+项配置
JavaScript
738
star
2

IpaDownloadTool

输入下载页面链接自动解析ipa下载地址,支持本地下载,支持第三方和自定义下载页面(通过拦截webView的itms-services://请求获取plist文件,支持各类企业版、内测包ipa下载)
Objective-C
602
star
3

ZXHookDetection

【iOS应用安全、安全攻防】hook及越狱的基本防护与检测(动态库注入检测、hook检测与防护、越狱检测、签名校验、IDA反编译分析加密协议Demo);【数据传输安全】浅谈http、https与数据加密
Objective-C
424
star
4

ZXRequestBlock

基于NSURLProtocol一句话实现iOS应用底层所有网络请求拦截(含网页ajax请求拦截【不支持WKWebView】)、一句话实现防抓包(使Thor,Charles,Burp等代理抓包方式全部失效,且即使开启了代理,也不影响App内部的正常请求)。包含http-dns解决方法,有效防止DNS劫持。用于分析http,https请求等
Objective-C
336
star
5

ZXNavigationBar

灵活轻量的自定义导航栏,导航栏属于控制器view,支持导航栏联动,一行代码实现【导航栏背景图片设置、导航栏渐变、折叠、修改Item大小和边距、自定义导航栏高度、全屏手势返回、pop拦截、仿系统导航栏历史堆栈】等各种效果
Objective-C
325
star
6

OpenDingTalkHelperForiOS

iOS钉钉定时打卡助手【需要把备用机放在公司,仅用于定时打开钉钉】
217
star
7

ZXTheme

使用MethodSwizzling实现零侵入修改全局主题,无需修改项目旧代码,可随时添加、移除,可快速实现“暗黑模式(黑暗模式、深色模式、换肤)”,兼容xib与纯代码创建的view,兼容所有控件(含第三方控件)
Objective-C
116
star
8

uni-dingTalkHelper

钉钉定时打开测试工具
Vue
105
star
9

ZXCountDownView

【杀不死的倒计时】一个简单易用的倒计时View,常用于快速创建点击获取验证码按钮,支持各种自定义样式。(特点:重新进入当前页面或重启程序倒计时不会重置,仍将继续执行,且退出程序后的时间也会被自动计算在内)
Objective-C
58
star
10

ZXEmptyView

【支持tableView、collectionView、scrollView和普通View】轻松构建无数据、网络错误等占位图,简单易用,快速实现各种自定义效果!支持在根控制器中统一设置项目所有页面的空数据图,tableView与collectionView空数据图自动显示与隐藏,一劳永逸!
Objective-C
53
star
11

ZXBlockLog

【iOS逆向】根据block签名打印参数与返回值,hook block 并捕获、修改block参数解决方案的小demo
Objective-C
37
star
12

iOSSignatureAnalysis

iOSApp+Springboot后端sign签名+aes加密原理&逆向破解分析示例(class-dump+Logos+monkeyDev+IDA),含iOS端+JAVA后端源码。
Objective-C
27
star
13

JsonToModelOnLine

1JSON:Json字符串转模型类在线工具,支持任意层级Json解析,支持Java、PHP、Objective-C、Swift、C#、Vue、Typescript、Flutter等语言模型类属性名生成
JavaScript
26
star
14

DocumentLightMarkWipeTool

Python文档水印批量去除工具
Python
22
star
15

ZXTableView

快速、高效地构建TableView,节省80%以上重复代码,无需设置数据源和代理。
Objective-C
20
star
16

uni-z-tabs

【基于uni-app】一个简单轻量的tabs标签,全平台兼容,支持nvue、vue3
Vue
18
star
17

Candy

Candy是一只Windows上通过HOOK系统鼠标,监测鼠标位置与点击事件来实现的追着鼠标跑的小猫,有上下左右等多个方向,睡觉,惊醒等状态。
C#
15
star
18

ZXDataHandle

简单易用的数据转换和存储框架,支持一行代码将模型、模型数组、Json字符串、字典互转;支持模型映射到sqlite3数据库,无需书写sql
Objective-C
15
star
19

ZXCircleProgressView

类似温度计效果的进度条
Objective-C
13
star
20

ZXPagingScrollView

【基于MJRefresh】,两行代码搞定全部tableView与collectionView分页加载逻辑和效果
Objective-C
13
star
21

AppStoreMonitor

🌈 实时监控AppStore上的App,并在其版本更新生效时通知您
JavaScript
12
star
22

ZXSlideSelectTableView

快速、轻松地实现滑动选择tableView,支持各种自定义显示效果
Objective-C
12
star
23

aboutHttp

浅谈http、https与数据加密
11
star
24

ZXAgreementLabel

【基于YYText】超简单!一行代码实现点击同意协议Label
Objective-C
10
star
25

WXRobot

基于itchat的微信机器人小demo,记录好友消息和群消息,自动下载聊天文件,将消息记录存储到数据库中
Python
8
star
26

JsonToModelForMac

Mac上的一个协助开发小工具,通过Json字符串生成对应的Model代码,支持字典字符串的解析,支持多层级Json或字典字符串的解析
Objective-C
8
star
27

z-notify-api

一个基于spring-boot开发的RESTful风格的应用统一在线管理平台api端,为单机应用提供的版本管理、通知管理、通用文本管理、反馈管理、用户流量统计&分析等服务
Java
8
star
28

ZXTextSwitchView

可分割选中文字的颜色
Objective-C
8
star
29

PlantsVsZombiesPlug-In

使用C#编写的通过查找对应内存基址,并修改指定内存区域来达到修改植物大战僵尸阳光,关卡进度,金币数量等目的。
C#
7
star
30

FnPanel

flutter中类似Chome Network的调试面板,用于监听、分析、调试项目请求与响应
Dart
7
star
31

ZXBaseTableView

基于系统tableView的自定义封装,快速构造,极简的代码风格,无需设置代理和数据源,与业务无关部分内部自动处理,包含无数据占位图,分页封装,网络错误占位图,点击重新加载等,大量减少重复代码。
Objective-C
7
star
32

uni-z-paging-x

z-paging uniapp x版
SCSS
7
star
33

ZXFormValidate

iOS上表单校验的统一化和规范化,一行代码完成表单校验,数据赋值,回显
Objective-C
6
star
34

MagicPureGrayOutput

在线将图片转换为纯净的“灰色”(【图片叠加、图中藏图】营造预览一张图,大图另一张图的效果)
JavaScript
6
star
35

ColorfulQRCodeForJava

Java分区域彩色/渐变二维码
Java
5
star
36

TNewsPicker

腾讯新闻视频提取小工具,零广告、超轻量
Vue
3
star
37

ZXCrashRecord

简单的App崩溃检测类,可以仅获取崩溃次数,或设定自动清除崩溃次数的时间(用于检测连续崩溃),用户杀死App或App在后台被系统杀死不计为崩溃。
Objective-C
3
star
38

githubissue_h5

统计、整理github的issue
JavaScript
2
star
39

SmileZXLee.github.io

HTML
2
star
40

uni-z-paging-doc

z-paging文档,基于vuePress
2
star
41

SmileZXLee

1
star
42

ZXKVO

使用block方式一行代码实现kvo监听
Objective-C
1
star
43

EasyClip

使用C#编写的一款简单易用的Windows剪切板历史管理工具
1
star
44

fivein-a-rowBasics

使用C#编写的五子棋人机对战,包含权重计算和输赢判定等,算法比较基础。
C#
1
star
45

ZXCollectionView

快速、高效地构建CollectionView,节省80%以上重复代码,无需设置数据源和代理。
Objective-C
1
star
46

cooper-java

一个对接第三方服务的Java库,尽可能抹平与第三方的交互逻辑,使用最少的代码实现高效快速的对接。目前已实现:微信小程序登录、获取用户信息、获取手机号;微信公众号获取jsapi配置、登录、获取用户信息;阿里云发送手机短信。其他功能后续会继续添加
Java
1
star
47

z-notify-admin-vue

一个基于Ant Design Vue Pro开发的应用统一在线管理平台web端,为单机应用提供的版本管理、通知管理、通用文本管理、反馈管理、用户流量统计&分析等服务
Vue
1
star