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安全攻防之结构体保护使用的更多相关文章

  1. iOS 用KVC设置结构体

    iOS 用KVC设置结构体 在Fundation中KVC提供的键值路径只能访问对象,不能访问结构体.这很不面向对象. 执行下面的语句将会报错: [self setValue:@() forKeyPat ...

  2. iOS学习06C语言结构体

    1.结构体的概述 在C语言中,结构体(struct)指的是一种数据结构,是C语言中构造类型的其中之一. 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高 ...

  3. iOS开发——C篇&结构体与枚举

    一:结构体与枚举的介绍: 结构体与枚举:是一种存储复杂的数据结构体:是用户自定义的一种类型,不同类型的集合,而数组是相同类型变量的集合. 二:结构体的创建 struct user {     char ...

  4. iOS - 常用的CG结构体

    CGPoint.CGSize.CGRect.CGRectEdge实际上都是结构体 一,几个常用的结构体 CGPoint   定义一个点,设置x坐标和y坐标 struct CGPoint { CGFlo ...

  5. c语言结构体

    [C语言]21-结构体 本文目录 一.什么是结构体 二.结构体的定义 三.结构体变量的定义 四.结构体的注意点 五.结构体的初始化 六.结构体的使用 七.结构体数组 八.结构体作为函数参数 九.指向结 ...

  6. iOS 阶段学习第十天笔记(结构体)

    iOS学习(C语言)知识点整理 一.数据结构 1)概念:数据结构是指计算机程序中所操作的对象——数据以及数据元素之间的相互关系和运算. 2)结构体必须有struct 关键字修饰. 实例代码: stru ...

  7. iOS Foundation框架简介 -1.常用结构体的用法和输出

    1.安装Xcode工具后会自带开发中常用的框架,存放的地址路径是: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.plat ...

  8. 李洪强iOS开发之Foundation框架—结构体

    Foundation框架—结构体 一.基本知识 Foundation—基础框架.框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础. 如果要想使用foundation框 ...

  9. ios结构体httpPost头结构

    ios结构体httpPost头结构 by 吴雪莹 NSString* urlStr = @"; NSURL* url = [NSURL URLWithString:urlStr]; NSMu ...

随机推荐

  1. python黑魔法之metaclass

    最近了解了一下python的metaclass,在学习的过程中,把自己对metaclass的理解写出来和大家分享. 首先, metaclass 中文叫元类,这个元类怎么来理解呢.我们知道,在Pytho ...

  2. GitHub上非常受开发者欢迎的iOS开源项目(二)

    "每一次的改变总意味着新的开始."这句话用在iOS上可谓是再合适不过的了.GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x ...

  3. 一个例子简要说明include和require的区别

    先编辑command.php文件 echo 'hello'.PHP_EOL; 然后编辑console.php文件 for($i=1;$i<=3;++$i){ require 'command1. ...

  4. 不完全CSS3图解

    温故而知新.用XMind总结了下CSS3,打钩的代表比较常用的.希望对大家整体上理解CSS3有所帮助吧.

  5. VirtulBox虚拟机搭建Linux Centos系统

    简要说明 该文章目的是基于搭建hadoop的前置文章,当然也可以搭建Linux的入门文章.那我再重复一下安装准备软件. 环境准备:http://pan.baidu.com/s/1dFrHyxV  密码 ...

  6. 如何将angular-ui的分页组件封装成一个指令

    准备工作: (1)一如既往的我还是使用了requireJS进行js代码的编译 (2)必须引入angualrJS , ui-bootstrap-tpls-1.3.2.js , bootstrap.css ...

  7. (转)详解JS位置、宽高属性之一:offset系列

    很多初学者对于JavaScript中的offset.scroll.client一直弄不明白,虽然网上到处都可以看一张图(图1),但这张图太多太杂,并且由于浏览器差异性,图示也不完全正确. 图一 不知道 ...

  8. Python之函数知识

    Python函数分类 a,内置函数 b,自定义函数 c,导入函数 一个函数就相当于一个功能块,比如获取数据库,更新数据库,函数其实就是代码的分块,调用函数来执行代码块 一块就代表一个功能 内置函数有以 ...

  9. hdu4764 Stone 博弈

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4764 很水的博弈题目 代码: #pragma comment(linker, "/STAC ...

  10. linux 下 查看是32位还是64位系统 命令

    文章引自:http://zhidao.baidu.com/question/583981849.html 方法1:getconf LONG_BIT 查看 如下例子所示: 32位Linux系统显示32, ...