iOS安全攻防之结构体保护使用
Objective-C 代码很容易被 hook,因此需要对一些重要的业务逻辑进行保护,可以改用结构体的形式,把函数名隐藏在结构体里,以函数指针成员的形式存储。这样编译后只留了下地址,去掉了名字和参数表,提高了逆向成本和攻击门槛。
例如,把以下代码进行保护:
+ (BOOL)isPermission:(int)level;
+ (CGFloat)totalAmont;
+ (void)somePraviteMethod:(NSString *)paraStr1 numberValue:(double)numberValue;
改为.h:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
typedef struct protectUtil {
    BOOL (*isPermission)(int level);
    CGFloat (*totalAmont)(void);
    void (*somePraviteMethod)(NSString *paraStr1, double numberValue);
}StructProtectUtil_t;
@interface StructProtectUtil : NSObject
+ (StructProtectUtil_t *)sharedUtil;
@end
.m 文件:
#import "StructProtectUtil.h"
static BOOL _isPermission (int level) {
    NSLog(@"****** level = %d", level);
    if (level > ) {
        return YES;
    }
    return NO;
}
static CGFloat _totalAmont() {
    NSLog(@"==== totalAmount");
    return ;
}
static void _somePraviteMethod (NSString *paraStr1, double numberValue) {
    NSLog(@"paraStr1 = %@, numberValue = %f", paraStr1, numberValue);
}
static StructProtectUtil_t *protectUtil = NULL;
@implementation StructProtectUtil
+ (StructProtectUtil_t *)sharedUtil
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        protectUtil = malloc(sizeof(StructProtectUtil_t));
        protectUtil->isPermission = _isPermission;
        protectUtil->totalAmont = _totalAmont;
        protectUtil->somePraviteMethod = _somePraviteMethod;
    });
    return protectUtil;
}
+ (void)destory
{
    protectUtil ? free(protectUtil) : ;
    protectUtil = NULL;
}
@end
调用时:
[StructProtectUtil sharedUtil] -> isPermission();
[StructProtectUtil sharedUtil] -> totalAmont();
[StructProtectUtil sharedUtil] -> somePraviteMethod(@"ParaStr", );
然后对工程进行 class-dump:
class-dump -H /Users/zhangtibin/Library/Developer/Xcode/DerivedData/TestSecurityAdvance-gflhcslxswowdrfflsfchjmlzfdt/Build/Products/Debug-iphoneos/TestSecurityAdvance.app/TestSecurityAdvance -o /Users/zhangtibin/class-dump/Struct
查看反编译后的文件,结果如下:
  
这样就实现了敏感逻辑的保护。
以下对没有保护的文件进行 Class-dump 后看到的。
  
iOS安全攻防之结构体保护使用的更多相关文章
- iOS 用KVC设置结构体
		
iOS 用KVC设置结构体 在Fundation中KVC提供的键值路径只能访问对象,不能访问结构体.这很不面向对象. 执行下面的语句将会报错: [self setValue:@() forKeyPat ...
 - iOS学习06C语言结构体
		
1.结构体的概述 在C语言中,结构体(struct)指的是一种数据结构,是C语言中构造类型的其中之一. 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高 ...
 - iOS开发——C篇&结构体与枚举
		
一:结构体与枚举的介绍: 结构体与枚举:是一种存储复杂的数据结构体:是用户自定义的一种类型,不同类型的集合,而数组是相同类型变量的集合. 二:结构体的创建 struct user { char ...
 - iOS - 常用的CG结构体
		
CGPoint.CGSize.CGRect.CGRectEdge实际上都是结构体 一,几个常用的结构体 CGPoint 定义一个点,设置x坐标和y坐标 struct CGPoint { CGFlo ...
 - c语言结构体
		
[C语言]21-结构体 本文目录 一.什么是结构体 二.结构体的定义 三.结构体变量的定义 四.结构体的注意点 五.结构体的初始化 六.结构体的使用 七.结构体数组 八.结构体作为函数参数 九.指向结 ...
 - iOS 阶段学习第十天笔记(结构体)
		
iOS学习(C语言)知识点整理 一.数据结构 1)概念:数据结构是指计算机程序中所操作的对象——数据以及数据元素之间的相互关系和运算. 2)结构体必须有struct 关键字修饰. 实例代码: stru ...
 - iOS Foundation框架简介 -1.常用结构体的用法和输出
		
1.安装Xcode工具后会自带开发中常用的框架,存放的地址路径是: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.plat ...
 - 李洪强iOS开发之Foundation框架—结构体
		
Foundation框架—结构体 一.基本知识 Foundation—基础框架.框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础. 如果要想使用foundation框 ...
 - ios结构体httpPost头结构
		
ios结构体httpPost头结构 by 吴雪莹 NSString* urlStr = @"; NSURL* url = [NSURL URLWithString:urlStr]; NSMu ...
 
随机推荐
- CTF入门指南(0基础)
			
ctf入门指南 如何入门?如何组队? capture the flag 夺旗比赛 类型: Web 密码学 pwn 程序的逻辑分析,漏洞利用windows.linux.小型机等 misc 杂项,隐写,数 ...
 - Spark源码分析之分区器的作用
			
最近因为手抖,在Spark中给自己挖了一个数据倾斜的坑.为了解决这个问题,顺便研究了下Spark分区器的原理,趁着周末加班总结一下~ 先说说数据倾斜 数据倾斜是指Spark中的RDD在计算的时候,每个 ...
 - 【react学习】关于react框架使用的一些细节要点的思考
			
( _(:3 」∠)_给园友们提个建议,无论是API文档还是书籍,一定要多看几遍!特别是隔一段时间后,会有意想不到的收获的) 这篇文章主要是写关于学习react中的一些自己的思考: 1.set ...
 - ReentrantLock 以及 AQS 实现原理
			
什么是可重入锁? ReentrantLock是可重入锁,什么是可重入锁呢?可重入锁就是当前持有该锁的线程能够多次获取该锁,无需等待.可重入锁是如何实现的呢?这要从ReentrantLock ...
 - Ubuntu中文本地化后字体改变
			
ubuntu中文本地化后会安装2个字体 fonts-arphic-ukai fonts-arphic-uming 找到这两个字体删除之.. sudo apt- get remove fonts-arp ...
 - Android系统--输入系统(八)Reader线程_使用EventHub读取事件
			
Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...
 - SourceTree 无法查看组织仓库
			
error log: Pushing to remote: Repository not found. 在使用SourceTree进行版本控制,代替git命令行,而且作为免费 跨平台 功能完备的git ...
 - 【小瑕疵】表单中的button会自动提交?
			
在表单中使用button标签的时候会发现,即使什么类型都没有设置,但是在点击的时候会发现,表单会自动提交 比如: 我在一个表单的button中添加一个函数,当点击这个按钮时会增加一行内容: 但是当我实 ...
 - FancyBox – 经典 Lightbox 效果插件
			
效果演示 插件下载
 - Measuring & Optimizing I/O Performance
			
By Ilya Grigorik on June 23, 2009 Measuring and optimizing IO performance is somewhat of a black art ...