gpt4 book ai didi

ios - 防止 iOS 上的反射(objc/runtime)

转载 作者:可可西里 更新时间:2023-11-01 03:31:33 25 4
gpt4 key购买 nike

我正在开发一个处理敏感数据的静态库。使用该库的开发人员必须不能在该库上使用反射。

在 Android 上,我们通过开发一个带有 serviceaar 文件并将 service 运行到单独的进程中来解决这个问题;(当服务正在运行到另一个进程中,然后开发人员无法使用反射)但我想知道 iOS 中是否存在类似的东西?

我们可以将静态库执行到一个单独的进程中吗?如果不是,我们如何避免对我们的静态库进行反射?

例如:

        MyTestObject *obj = [[[myTestView alloc] init ];

//===========================================

Class clazz = [obj class];
u_int count;
Ivar* ivars = class_copyIvarList(clazz, &count);
NSMutableArray* ivarArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
const char* ivarName = ivar_getName(ivars[i]);
[ivarArray addObject:[NSString stringWithCString:ivarName encoding:NSUTF8StringEncoding]];
}
free(ivars);

objc_property_t* properties = class_copyPropertyList(clazz, &count);
NSMutableArray* propertyArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
const char* propertyName = property_getName(properties[i]);
[propertyArray addObject:[NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding]];
}
free(properties);

Method* methods = class_copyMethodList(clazz, &count);
NSMutableArray* methodArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
SEL selector = method_getName(methods[i]);
const char* methodName = sel_getName(selector);
[methodArray addObject:[NSString stringWithCString:methodName encoding:NSUTF8StringEncoding]];
}
free(methods);

NSDictionary* classDump = [NSDictionary dictionaryWithObjectsAndKeys:
ivarArray, @"ivars",
propertyArray, @"properties",
methodArray, @"methods",
nil];

NSLog(@"%@", classDump);

//======================================================

int v2 = [[obj valueForKey:@"testValue"] intValue];

SEL s = NSSelectorFromString(@"wannatTestIt");
[obj performSelector:s];

MyTestObject 是我的库中的一个类。在第一行中,我从此类中初始化了一个对象。

在下一行中,我读取了类的变量、方法和属性列表并将其记录下来。这是结果:

    {
ivars = (
testValue
);
methods = (
printTestValue,
wannatTestIt,
"initWithFrame:"
);
properties = (
);
}

wannaTestIt 是私有(private)方法,testValue 是私有(private)变量。所以我希望使用该库的开发人员无法访问它们。但是,由于库的用户可以获得名称,因此用户最终可以调用该方法来读取 iVar 的值。

我怎样才能避免这种情况?

最佳答案

如果你想完全“阻止”反射,那么,你必须使用不同的语言。反射是 Objective C 中的关键事物,不可能“阻止”或“禁用”它。

但是,您可以通过混淆来降低此运行时信息对研究人员的用处。例如,看看这个工具:https://github.com/Polidea/ios-class-guard .这只是一个例子。我与这个特定项目无关,您可以自由选择不同的混淆器或编写您自己的混淆器。

如果您只需要将反射限制为公共(public) API,甚至公开一定数量 私有(private)方法和 ivar(没有它们的实际名称)对您来说都不好,那么您别无选择用不同的语言为您编写敏感代码。您可以使用 Pimpl设计模式来实现你想要的。这样,您的类将只有公共(public)方法和一个私有(private) ivar _impl(或类似的东西)。其中 _impl 是用 C++(如果需要访问 ObjC API,则为 Objective C++)编写的实现类的实例,所有公共(public)方法都充当代理。像这样:

- (NSInteger)computeSuperSensitiveStuffWithFoo:(Foo *)foo Bar:(Bar *)bar {
return _impl->computeStuff(foo, bar);
}

这样,您所有的私有(private)数据和方法都将封装在 MyClassImpl 类中。如果您将此类的声明和实现保密(即不要将 MyClassImpl.h 文件与您的库一起分发)并使用像 C++ 这样的语言来实现它,那么您将实现您想要的。

另请注意,如果您选择 Objective C++,则 MyClassImpl 应该是 C++ 类(使用 class 关键字声明)而不是 Objective C 类(使用 @ 声明) interface/@end block 并在 @implementation/@end block 内实现)。否则,无论如何您的所有私有(private)数据都可用于反射,但需要研究人员执行几个额外的步骤。

关于ios - 防止 iOS 上的反射(objc/runtime),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39807792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com