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 > 12) {
        return YES;
    }
    return NO;
}

static CGFloat _totalAmont() {
    NSLog(@"==== totalAmount");
    return 1900;
}

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) : 0;
    protectUtil = NULL;
}

@end

  调用时:  

[StructProtectUtil sharedUtil] -> isPermission(1000);
[StructProtectUtil sharedUtil] -> totalAmont();
[StructProtectUtil sharedUtil] -> somePraviteMethod(@"ParaStr", 3820);

  

  然后对工程进行 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 后看到的。

  

  

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { }

时间: 2024-10-09 20:01:59

iOS安全攻防之结构体保护使用的相关文章

小白学开发(iOS)OC_ 常用结构体(2015-08-14)

// //  main.m //  常用结构体 // //  Created by admin on 15/8/13. //  Copyright (c) 2015年 admin. All rights reserved. // #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //      1. 表示范围:NSRange 结构体 NSRange ran

IOS开发把一个结构体放到数组中

oc中的可变数组NSMutableArray里面只能存放object,对于结构体类型,必须进行转换才能放入可变数组 NSMutableArray *coordinateArray = [NSMutableArray array]; CLLocationCoordinate2D coor; coor.latitude = item.latitude; coor.longitude = item.longitude; NSValue *value = [NSValue value:&coor wit

蓝懿IOS静态变量/结构体/枚举

静态方法(类方法)只能访问静态变量,+(void)类方法名苹果的东西我们只能commend点击看到.h文件.m文件我们是看不见代码空间里存在代码区 ,静态区 , 栈区 , 堆区 , 常量static 修饰完变量,存在于静态区, ,大家一起共享 所有地方共用调对象的属性依托于自己的对象存在,对象创建时候产生,对象销毁的时候跟着销毁 静态的属性随着整体程序开始产生,程序结束时销毁当整个程序要很多地方用到同一个数据时可以声明静态变量 静态方法和静态变量都存在于静态区和对象销毁的创建销毁没有关系.在静态

ios开发-CGRect,CGSize等结构体与NSString字符串互相转换

ios/oc中的结构体如何 转为  一个 NSString 方法呢? 或者一个字符串如何转换为 结构体呢? 系统已经为我们提供了很多好用的方法了! 此处列举一下: 结构体转字符串 NSString *NSStringFromCGPoint(CGPoint point); NSString *NSStringFromCGVector(CGVector vector); NSString *NSStringFromCGSize(CGSize size); NSString *NSStringFrom

iOS安全攻防(二十四):敏感逻辑的保护方案(1)

iOS安全攻防(二十四):敏感逻辑的保护方案(1) Objective-C代码容易被hook,暴露信息太赤裸裸,为了安全,改用C来写吧! 当然不是全部代码都要C来写,我指的是敏感业务逻辑代码. 本文就介绍一种低学习成本的,简易的,Objective-C逻辑代码重写为C代码的办法. 也许,程序中存在一个类似这样的类: @interface XXUtil : NSObject + (BOOL)isVerified; + (BOOL)isNeedSomething; + (void)resetPass

(ios开发)基本数据类型和结构体的封装与解封

ios开发基本数据类型和结构体的封装与解封 -- 妖妖 //知识: //因为基本数据类型和结构体不是继承自NSObject,所以它们不可以直接存放到数组和字典中. //数组和字典中只能存储对象类型,其他基本类型和结构体是没有办法放到数组和字典中的,当然你也是无法给它们发送消息的(也就是说有些NSObject的方法是无法调用的),这个时候通常会用到装箱(boxing)和拆箱(unboxing).但是在ObjC中装箱的过程必须手动实现,ObjC不支持自动装箱. //在ObjC中我们一般将基本数据类型

IOS 阶段学习第十天笔记(结构体)

IOS学习(C语言)知识点整理 一.数据结构 1)概念:数据结构是指计算机程序中所操作的对象——数据以及数据元素之间的相互关系和运算. 2)结构体必须有struct 关键字修饰. 实例代码: 1 struct Person{ 2 char name[20]; 3 int age; 4 float height; 5 }; 6 7 int main(){ 8 struct Person Tom={"Tom",22,180};//struct Person 是数据结构 9 //Tom 是变

IOS开发语言Swift入门连载---类和结构体

IOS开发语言Swift入门连载-类和结构体 类和结构体是人们构建代码所用的一种通用且灵活的构造体.为了在类和结构体中实现各种功能,我们必须要严格按照常量.变量以及函数所规定的语法规则来定义属性和添加方法. 与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意: 通常一个类 的实例被称为对象 .然而在Swift 中,类和结构体的关系要比在其他语言中更加的密切,本

iOS中结构体数组

在ios开发中我们经常要使用结构体,但是我们在使用结构体数组的时候xcode会有黄色警告提示. BMKMapPoint *points = new BMKMapPoint[pointCount]; BMKMapPoint 是一个结构体,我动态声明一个结构体数组. delete [] points; 释放一个结构体数组. 编写函数希望返回一个结构体数组的时候 + (CLLocationCoordinate2D *)arrayTransformCoordinate:(NSArray *)array