开发者社区> 蓝容蓝胖子> 正文

iOS安全使用私有framework

简介:
+关注继续查看
获取私有framework中某subview对象

博客:using private iOS APIs safely
深度递归查找子view,修改其属性:
You are not prevented from modifying a view that is part of a UIKit object, you just need to do it publicly. The [UIView subviews]method is public, and you can use this to dig through the view hierarchy looking for a private view to change, no private method calls required

1. [UIView subviews]
NS_INLINE UIView *UIFindSubview(UIView *view, Class viewClass)
{
    for (UIView *subview in view.subviews)
    {
        if ([subview isKindOfClass:viewClass])
        {
            return subview;
        }
        else
        {
            UIView *rect = UIFindSubview(subview, viewClass);
            if (rect) {
                return rect;
            }
        }
    }
    return nil;
}

调用此方法获取一个subView

UIView *view = findSubview(picker.view, [NSClassFromString(@"CMKVideoPreviewView") class]);
2.[[subview class] description]

博客:Removing reorder cell shadows from a UITableView

我们无法直接使用私有类的声明,但是我们可以用[[subview class] description]来获取class的信息。
[[[subview class] description] isEqualToString:@”UIShadowView”]
You don’t have a class declaration for the private classes, but that’s fine, instead you can evaluate that it is correct based on class string description, [[[subview class] description] isEqualToString:@”UIShadowView”]

//    iOS7
    for(UIView* subview in wrapperView.subviews)
    {
        if([[[subview class] description] isEqualToString:@"UIShadowView"])
            [subview setHidden:YES];
    }
私有头文件

You can use a tool like class-dump or a private class reference to see every Objective-C method each class in iOS has – the truth is nothing in Objective-C is truly ‘private’, you can see any method compiled into the binary.

我们可以用class-dump o 或者 private class reference这些工具看到iOS中所有class的方法.但是私有头API会随时下掉,所以建议用
respondsToSelector:performSelector:来检查一下该方法是否可以用

访问实例变量

如何访问类中私有变量?
比如下面,[xxxx valueForKey:@”_internal”] 可以返回 private变量 _internal 。

NS_CLASS_AVAILABLE_IOS(2_0) @interface UIWebView : UIView  { 
 @private
    UIWebViewInternal *_internal;
}

但是如果,我们 请求的变量不存在(根据我们输入的key值没有找到相应的value),程序会 crash。为了防止这种情况,我们可以在 NSObject的categorise中或者 写一个子类继承该类,并重写valueForUndefinedKey方法。

- (id) valueForUndefinedKey:(NSString *)key
{
    //    No crashes please...
    return nil;
}

我们有时候改变只读属性的实例变量的值,就可以这样用。我之前试过
强制设置orientation属性值

Method Swizzling

Method Swizzling
Method Swizzling
Method Swizzling lets you inject code in the middle of two existing classes, which can be a lot more beneficial compared to a subclass that will only add your code on top of one class that must be subclassed.
example

访问私有枚举变量

私有枚举变量,本质上就是一些数字。比如下面的例子,返回的按钮UIButtonType的值是101, 私有不公开。我们可以直接设置:

UIButton* back = [UIButton buttonWithType:101];
[back sizeToFit];
[back setTitle:@"Back" forState:UIControlStateNormal];
Screen-Shot-2013-01-11-at-5.49.58-PM.png
image
C方法

One half of Objective-C is pure C, and with that all the tricks to incorporate private C APIs into your app, such as defining external functions。
例子:截屏并保存图片

CGImageRef screenshot = UIGetScreenImage();
UIImage* image = [UIImage imageWithCGImage:screenshot];

[UIImagePNGRepresentation(image) writeToFile:@"/maybe-change-this.png" atomically:NO];
重写私有方法和类

重写私有方法和类,并不会让app被App store拒绝,但是你的app会变的不稳定。每次版本更新,都需要去检查,你的方法或者类是否正常工作。我们可以重写public或者private 类的私有方法。如果是私有类,直接重写会导致编译错误,但是你可以为它添加一个fake interface,categorise.

例子:重写UIStatusBar类

@interface UIStatusBar : UIView
@end

@interface UIStatusBar (Override)
@end

@implementation UIStatusBar (Override)

- (void) drawRect:(CGRect)rect
{
    NSArray* subviews = self.subviews;

    if(subviews.count < 2)
        return;

    UIView* background = [subviews objectAtIndex:0];
    UIView* foreground = [subviews objectAtIndex:1];

    [UIView animateWithDuration:2 animations:^{

        [self setTransform:CGAffineTransformMakeTranslation(0, 100)];

        [background setTransform:CGAffineTransformMakeTranslation(-160, 0)];
        [foreground setTransform:CGAffineTransformMakeTranslation(160, 0)];
    }];
}

@end

private framework使用
dylib注射
获取私有api
ios逆向工程


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
iOS开发 - 不用copy修饰的字符串属性什么情况下不安全
iOS开发 - 不用copy修饰的字符串属性什么情况下不安全
21 0
iOS逆向-day2:逆向环境搭建-SSH 安全连接(下)
iOS逆向-day2:逆向环境搭建-SSH 安全连接(下)
93 0
iOS逆向-day2:逆向环境搭建-SSH 安全连接(上)
1、SSH与OpenSSH简介 2、Mac远程登录到iPhone 3、iOS下的2个常用账户:root、mobile 4、SSL和OpenSSL 5、建立安全连接与服务器公钥的保存和变更 6、SSH-客户端认证 7、SSH-远程拷贝-文件权限 8、22端口 9、通过USB进行SSH登录 10、usbmuxd-使用 11、利用sh脚本设置快捷方式 12、Mac连接iPhone终端的中文乱码问题
98 0
iOS隐私安全:用户协议及隐私政策弹框(包含超链接属性、demo支持中英文切换)
iOS隐私安全:用户协议及隐私政策弹框(包含超链接属性、demo支持中英文切换)
856 0
iOS传感器开发——为APP添加手机密码、指纹进行安全验证
iOS传感器开发——为APP添加手机密码、指纹进行安全验证
114 0
iOS开发如何避免安全隐患
现在很多iOS的app没有做任何的安全防范措施,导致存在很多安全隐患和事故,今天我们就聊聊iOS开发人员平时怎么做才更安全。
2072 0
BlackHat & DEFCON现场秀:阿里安全专家演示“视频水印叠加”和“一分钟越狱iOS 11.4”
两大世界顶级信息安全会议BlackHat和DEFCON将在美国拉斯维加斯正式揭幕。来自全球的数万名白帽黑客、安全厂商、高校学者、政府机构等安全从业人员齐聚,高度关注这两场盛会将来带来怎样的前沿技术饕餮盛宴,阿里安全八大实验室多名安全专家受邀参会,带来的三大议题和两项演示备受瞩目。
1618 0
【阿里聚安全·安全周刊】一种秘密窃取数据的新型 Android 木马|iOS 11相机惊现BUG
阿里安全周刊第九十期,分享本周移动安全热点和技术知识。
1695 0
阿里安全潘多拉实验室龙磊:越狱 iOS 11.2,我选了一条最难走的路
苹果越狱不好搞,但他们居然两个月内针对三个最新版系统“越”了三次,这就很神奇了。
3667 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Facebook iOS App技术演化十年之路
立即下载
From Java_Android to Swift iOS
立即下载
深入剖析 iOS 性能优化
立即下载