我正在阅读有关Cycript和Cydia 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是否容易受到代码注入攻击?
Swift类是否具有可以重新映射的isa指针?
我们已经看到Swift 使用比Objective-C 更静态的方法调度,它(除非来自Foundation/NSObject的类设备)在运行时基于重映射方法实现防止了调配风格.
我想知道我们将如何实现基于方法拦截的动态功能,如观察者模式,通知等?目前所有这些东西都是由Objective-C层提供的,可以很容易地集成到Swift中.但是,如果我们想在我们自己的框架(或应用程序)中提供这些类型的功能,是否有必要在Objective-C中实现它们?我认为有一种方法可以"原生"地完成它.
另一种对Objective-C来说很常见的混合是重新映射isa-pointer来动态生成一个子类.Swift是否支持这种调配?如果没有什么是拦截任意的方法调用的支持呢?
编辑: 正如@jatoben指出的那样,从arm64开始重新映射必须通过调用object_setClass()而不是直接访问该值来完成.这仍然被称为'isa指针调配'
UINavigationBar我正试图克服一个小问题.当您prefersStatusBarHidden()在视图控制器中使用方法隐藏状态栏时(我不想禁用整个应用程序的状态栏),导航栏会丢失属于状态栏的高度的20pt.基本上导航栏缩小了.

我正在尝试不同的解决方法,但我发现它们中的每一个都有缺点.那时,我发现这次来到类别,其使用方法交叉混合,添加了一个名为属性fixedHeightWhenStatusBarHidden的UINavigationBar解决了这个问题类.我在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) 我一直在探索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运行时库文档.
我想利用方法调配,但我甚至无法得到简单的例子来为我工作.我可能误解了这个概念是什么,但据我所知,它允许交换方法实现.
给定两个方法A和B,我想交换它们的实现,这样调用A就会执行B.我遇到了一些混合的例子(example1和example2).我创建了一个带有类的新项目来测试它.
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)