相关疑难解决方法(0)

Swift容易受到代码注入的影响吗?

我正在阅读有关CycriptCydia Substrate以及它们如何用于iOS应用程序的代码注入攻击的内容.如果您在高安全性环境中工作,这样的代码应该吓到您.(忽略/ etc/password部分,只考虑使用crackedMessage替换originalMessage的能力.)

cy# MS.hookFunction(fopen, function(path, mode) {
cy>     if (path == "/etc/passwd")
cy>         path = "/var/passwd-fake";
cy>     var file = (*oldf)(path, mode);
cy>     log.push([path, mode, file]);
cy>     return file;
cy> }, oldf)
Run Code Online (Sandbox Code Playgroud)

我读了一篇博客(我没有保存)说Swift没有Objective-C那么脆弱,因为它没有那么动态.然后,我还读到你可以在Swift中进行方法调配,所以我不清楚Swift是否提供任何针对代码注入攻击的保护措施.

那么,Swift是否容易受到代码注入攻击?

code-injection ios swift

19
推荐指数
1
解决办法
2540
查看次数

Swift isa指针重映射或其他支持的方法调配

Swift类是否具有可以重新映射的isa指针?

我们已经看到Swift 使用比Objective-C 更静态的方法调度,它(除非来自Foundation/NSObject的类设备)在运行时基于重映射方法实现防止了调配风格.

我想知道我们将如何实现基于方法拦截的动态功能,如观察者模式,通知等?目前所有这些东西都是由Objective-C层提供的,可以很容易地集成到Swift中.但是,如果我们想在我们自己的框架(或应用程序)中提供这些类型的功能,是否有必要在Objective-C中实现它们?我认为有一种方法可以"原生"地完成它.

另一种对Objective-C来说很常见的混合是重新映射isa-pointer来动态生成一个子类.Swift是否支持这种调配?如果没有什么拦截任意的方法调用的支持呢?

编辑: 正如@jatoben指出的那样,从arm64开始重新映射必须通过调用object_setClass()而不是直接访问该值来完成.这仍然被称为'isa指针调配'

objective-c objective-c-runtime swift

12
推荐指数
1
解决办法
3068
查看次数

方法在Swift中调整

UINavigationBar我正试图克服一个小问题.当您prefersStatusBarHidden()在视图控制器中使用方法隐藏状态栏时(我不想禁用整个应用程序的状态栏),导航栏会丢失属于状态栏的高度的20pt.基本上导航栏缩小了.

在此输入图像描述 在此输入图像描述

我正在尝试不同的解决方法,但我发现它们中的每一个都有缺点.那时,我发现这次来到类别,其使用方法交叉混合,添加了一个名为属性fixedHeightWhenStatusBarHiddenUINavigationBar解决了这个问题类.我在Objective-C中进行了测试,但它确实有效.以下是原始Objective-C代码的标题实现.

现在,因为我在Swift中使用我的应用程序,所以我尝试将其转换为Swift.

我遇到的第一个问题是Swift扩展无法存储属性.所以我不得不解决计算属性来声明fixedHeightWhenStatusBarHidden使我能够设置值的属性.但这引发了另一个问题.显然,您无法为计算属性赋值.像这样.

self.navigationController?.navigationBar.fixedHeightWhenStatusBarHidden = true
Run Code Online (Sandbox Code Playgroud)

我得到错误无法分配给这个表达式的结果.

无论如何,下面是我的代码.它编译没有任何错误,但它不起作用.

import Foundation
import UIKit

extension UINavigationBar {

    var fixedHeightWhenStatusBarHidden: Bool {
        return objc_getAssociatedObject(self, "FixedNavigationBarSize").boolValue
    }

    func sizeThatFits_FixedHeightWhenStatusBarHidden(size: CGSize) -> CGSize {

        if UIApplication.sharedApplication().statusBarHidden && fixedHeightWhenStatusBarHidden {
            let newSize = CGSizeMake(self.frame.size.width, 64)
            return newSize
        } else {
            return sizeThatFits_FixedHeightWhenStatusBarHidden(size)
        }

    }
    /*
    func fixedHeightWhenStatusBarHidden() -> Bool {
        return objc_getAssociatedObject(self, "FixedNavigationBarSize").boolValue
    }
    */

    func setFixedHeightWhenStatusBarHidden(fixedHeightWhenStatusBarHidden: Bool) …
Run Code Online (Sandbox Code Playgroud)

objective-c ios swift method-swizzling

10
推荐指数
1
解决办法
9135
查看次数

Swift运行时文档

我一直在探索Apple的快速文档,现在我在这里问.

是否有关于Swift运行时的文档?

我读过The Swift Programming Language一书.https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11

我看过WWDC视频.https://developer.apple.com/videos/wwdc/2014/

我试过搜索Swifts编译器源代码或运行时库源代码.

但是我什么都没发现,除了几个实际上关于Obj-c Swift函数调配/运行时的问题

我的意思是,每个人都知道obj-​​c是如何工作的.isa指针,cmd,我们如何调用方法,动态绑定等.我们知道寄存器如何传递参数.我们可以使用MachOView来定义二进制中使用的所有方法和类.有很多关于obj-c运行时,开源运行时库的文档.Clang是开源的.但是迅速呢?

此信息存在于Objective-C的集中位置.我要求相当于Obj-C运行时库文档.

swift

7
推荐指数
1
解决办法
3052
查看次数

方法Swizzling不起作用

我想利用方法调配,但我甚至无法得到简单的例子来为我工作.我可能误解了这个概念是什么,但据我所知,它允许交换方法实现.

给定两个方法A和B,我想交换它们的实现,这样调用A就会执行B.我遇到了一些混合的例子(example1example2).我创建了一个带有类的新项目来测试它.

class Swizzle: NSObject
{
    func method()
    {
        print("A");
    }
}

extension Swizzle
{
    override class func initialize()
    {
        struct Static
        {
            static var token: dispatch_once_t = 0;
        }

        // make sure this isn't a subclass
        if (self !== Swizzle.self)
        {
            return;
        }

        dispatch_once(&Static.token)
        {
            let originalSelector = Selector("method");
            let swizzledSelector = Selector("methodExt");

            let originalMethod = class_getInstanceMethod(self, originalSelector);
            let swizzledMethod = class_getInstanceMethod(self, swizzledSelector);

            print(method_getImplementation(originalMethod));
            print(method_getImplementation(swizzledMethod));

            let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));

            if didAddMethod
            { …
Run Code Online (Sandbox Code Playgroud)

xcode ios swift method-swizzling swift2

6
推荐指数
1
解决办法
2584
查看次数