iOS-嵌入SM3算法

OC方法

-(void)sm3Method:(NSString *)password

{

NSData *testData = [password dataUsingEncoding: NSUTF8StringEncoding];

Byte *input = (Byte *)[testData bytes];

 

const char *byteLength = [password UTF8String];

size_t length = strlen(byteLength);

Word* hash = SM3::hash(input, length);

NSMutableString *result = [NSMutableString string];

for (int i = 0; i < 8; i++) {

printf(“%x “, hash[i]);

[result appendFormat:@”%x”,hash[i]];

}

NSLog(@”result = %@”,result);

}

C++文件 .h

#ifndef SM3_SM3_H

#define SM3_SM3_H

#include <vector>

typedef uint32_t Word;

typedef uint8_t Byte;

class SM3 {

private:

static void CF(Word* V, Byte* B);

static Word P0(Word X);

static Word P1(Word X);

static Word FF(int j, Word X, Word Y, Word Z);

static Word GG(int j, Word X, Word Y, Word Z);

static Word T(int j);

public:

static Word* hash(Byte* input, uint64_t inputLen);

};

#endif //SM3_SM3_H

C++文件 .cpp
#include “SM3.h”

#define ROTATELEFT(X, n)  (((X)<<(n)) | ((X)>>(32-(n))))

Word *SM3::hash(Byte *input, uint64_t inputLen) {

Word VI[] = {0x7380166f, 0x4914b2b9, 0x172442d7, 0xda8a0600, 0xa96f30bc, 0x163138aa, 0xe38dee4d, 0xb0fb0e4e};

Word* state = new Word[8];

memcpy(state, VI, 8*sizeof(VI));

Byte buf[64];

int inputPtr = 0;

int bufPtr = 0;

while (inputPtr < inputLen) {

buf[bufPtr] = input[inputPtr];

inputPtr++;

bufPtr++;

if (bufPtr == 64) {

CF(state, buf);

bufPtr = 0;

}

}

buf[bufPtr++] = 0x80;

if (64 – bufPtr < 8) {

while (bufPtr < 64) buf[bufPtr++] = 0;

bufPtr = 0;

CF(state, buf);

}

while (bufPtr < 56) buf[bufPtr++] = 0;

inputLen *= 8;

buf[63] = static_cast<Byte>(inputLen & 0x00000000000000ff);

buf[62] = static_cast<Byte>((inputLen & 0x000000000000ff00) >> 8);

buf[61] = static_cast<Byte>((inputLen & 0x0000000000ff0000) >> 16);

buf[60] = static_cast<Byte>((inputLen & 0x00000000ff000000) >> 24);

buf[59] = static_cast<Byte>((inputLen & 0x000000ff00000000) >> 32);

buf[58] = static_cast<Byte>((inputLen & 0x0000ff0000000000) >> 40);

buf[57] = static_cast<Byte>((inputLen & 0x00ff000000000000) >> 48);

buf[56] = static_cast<Byte>((inputLen & 0xff00000000000000) >> 56);

CF(state, buf);

return state;

}

void SM3::CF(Word *V, Byte *Bi) {

auto W = std::vector<Word>(68, 0); // W

auto WW = std::vector<Word>(64, 0); // W’

for (int i = 0; i < 16; ++i) {

W[i] = 0;

W[i] |= ((Word) Bi[i * 4] << 24);

W[i] |= ((Word) Bi[i * 4 + 1] << 16);

W[i] |= ((Word) Bi[i * 4 + 2] << 8);

W[i] |= ((Word) Bi[i * 4 + 3]);

}

for (int i = 16; i <= 67; ++i) {

W[i] = P1(W[i – 16] ^ W[i – 9] ^ ROTATELEFT(W[i – 3], 15)) ^ ROTATELEFT(W[i – 13], 7) ^ (W[i – 6]);

}

for (int i = 0; i <= 63; ++i) {

WW[i] = W[i] ^ W[i + 4];

}

constexpr int A = 0, B = 1, C = 2, D = 3, E = 4, F = 5, G = 6, H = 7;

Word reg[8];

for (int j = 0; j < 8; ++j) {

reg[j] = V[j];

}

for (int j = 0; j <= 63; ++j) {

Word SS1, SS2, TT1, TT2;

SS1 = ROTATELEFT(ROTATELEFT(reg[A], 12) + reg[E] + ROTATELEFT(T(j), j), 7);

SS2 = SS1 ^ ROTATELEFT(reg[A], 12);

TT1 = FF(j, reg[A], reg[B], reg[C]) + reg[D] + SS2 + WW[j];

TT2 = GG(j, reg[E], reg[F], reg[G]) + reg[H] + SS1 + W[j];

reg[D] = reg[C];

reg[C] = ROTATELEFT(reg[B], 9);

reg[B] = reg[A];

reg[A] = TT1;

reg[H] = reg[G];

reg[G] = ROTATELEFT(reg[F], 19);

reg[F] = reg[E];

reg[E] = P0(TT2);

}

for (int i = 0; i < 8; ++i) {

V[i] ^= reg[i];

}

}

Word SM3::P0(Word X) {

return X ^ ROTATELEFT(X, 9) ^ ROTATELEFT(X, 17);

}

Word SM3::P1(Word X) {

return X ^ ROTATELEFT(X, 15) ^ ROTATELEFT(X, 23);

}

Word SM3::T(int j) {

if (j <= 15) {

return 0x79cc4519;

} else {

return 0x7a879d8a;

}

}

Word SM3::FF(int j, Word X, Word Y, Word Z) {

if (j <= 15) {

return X ^ Y ^ Z;

} else {

return (X & Y) | (X & Z) | (Y & Z);

}

}

Word SM3::GG(int j, Word X, Word Y, Word Z) {

if (j <= 15) {

return X ^ Y ^ Z;

} else {

return (X & Y) | ((~X) & Z);

}

}

iOS*安全?细数iOS曝过的安全漏洞|苹果|iOS|漏洞

昨天,苹果iOS/OS X被曝出重大安全漏洞,攻击者可以通过此漏洞窃取多达上千个应用的密码,漏洞一旦被黑客掌握,其后果将是毁灭性的。不过好在这个漏洞的发现者是一群研究人员,而且他们已将漏洞问题汇报给苹果公司。

这个号称*安全的操作系统,既能吸引全世界的关注目光,自然就会受到更家严格的审视和要求。下面,雷锋网和大家一同来回顾从iOS 6开始,iOS系统上出现过的那些安全漏洞。

iOS6

无法根治的锁屏漏洞

它可使攻击者绕过锁屏界面查看联系人、语音邮件和照片。具体操作过程则是在拨打紧急电话时迅速取消,然后再按下电源按钮后可直接进入联系人和通话界面。在这一漏洞面前,保护手机隐私的锁屏功能成为摆设。在这里我还是要推荐下我自己建的iOS开发学习群:680565220,群里都是学ios开发的,如果你正在学习ios ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是软件开发党,不定期分享干货(只有iOS软件开发相关的),包括我自己整理的一份2018*新的iOS进阶资料和高级开发教程

苹果公司在修复这一漏洞后,仍多次栽在这同一个坑,可谓修修补补,就是不见根治。

被删短信死而复生

被删短信死而复生
iPhone短信在被用户删除后,通过手机自带的搜索功能,输入关键字竟能让原本已删的短信“死而复生”。

有网友调侃,在男友的iPhone里搜‘我爱你’,如果蹦出的不是你,只能祝你……不少网友都把这个功能当成了斗小三、起底枕边人的新武器。乔帮主果然是条有情有义、嫉恶如仇的真汉子!

魔性的阿拉伯字符漏洞,可致程序崩溃

魔性的阿拉伯字符漏洞,可致程序崩溃
这是一个远程拒*服务漏洞,发送一段阿拉伯字符串到iOS或Mac用户的聊天软件、邮件或短信,将导致应用闪退甚至程序崩溃。

受到该漏洞影响的只有iOS6和OSX 10.8系统响,在后续的ios7和osX10.9中该漏洞已被修复。虽是如此,建议用户还是不要轻易尝试这自带魔性的阿拉伯字符。

iOS7

从苹果在WWDC全球开发者大会上推出iOS7操作系统以来,用户们不断发现新系统存在BUG多如牛毛。

又见锁屏漏洞

iOS6的锁屏漏洞在新发布的iOS7系统依然存在,并且操作更加方便,发现这一漏洞的是国外一名闲着没事的士兵——如果可以这样说的话。

不过,想要避免这个漏洞,用户只需要在设置菜单当中选择在锁屏界面当中禁用控制中心即可。对于这一屡次出现的锁屏BUG,苹果一再地修复又一再被发现漏洞,真是相当让人怀疑苹果是否真的严肃对待了这个问题。

不越狱设备也可被监控

在这一漏洞出现之前,很多人认为,只要不越狱,苹果设备就会受到苹果安全系统的保护,是安全的。但网络安全公司FireEye却发现,iOS7中存在漏洞,能让黑客绕过苹果应用审核,直接在设备上安装监控程序。所安装的监控程序可在用户不知情的情况下,记录所有的用户操作行为并发送至指定的服务器上,黑客可以轻松获取用户的相关信息。

看来越狱不越狱对于真正技术高超且有心做坏事的人来说,真的没有什么差别。

邮件短信可轻松被拦截

邮件短信可轻松被拦截
与以往都是用户或研究者曝出iOS系统存在漏洞不同,这一次,苹果自己发公告称iOS系统存在重大安全漏洞,黑客可利用漏洞拦截有待加密的电子邮件和其他通信。

自己认错不代表就能被原谅。安全专家表示,分分钟就能利用这一漏洞攻破iPhone。对于苹果的安全技术部门而言,再次被打脸。

“找到我的iPhone”找不到了

“找到我的iPhone”找不到了
用于帮助用户丢失手机后找回的“找到我的iPhone”(Find My iPhone)功能,在iOS7的漏洞面前彻底失灵。利用这项安全漏洞,可以绕开密码关闭“找到我的iPhone”选项,同时还能删除设备上的iCloud账户。

具体操作是:在iCloud设置面中同时按下“删除帐号”以及关闭Finde My iPhone功能的开关,然后只需要在系统弹出密码输入框时按住电源键关闭手机然后再开机,便可以绕过密码验证程序。

又一项iPhone引以为傲的功能失灵了,尽管有这项功能也不一定能找得到丢失的手机……

iOS8

iPhone6首次亮相时,iOS8那数目繁多的BUG再次惊呆了业界的小伙伴们,评论已将iOS8形容为苹果史上BUG*多的操作系统。

惊呆全世界的好莱坞“艳照门”

惊呆全世界的好莱坞“艳照门”
去年,好莱坞艳照门事件的发生与苹果iCloud 服务存在的漏洞脱不开关系。

国外黑客借助密码破解漏洞攻击了iCloud云端,造成美国好莱坞女星詹妮弗-劳伦斯、克里斯汀-邓斯特、凯特-阿普顿、歌手蕾哈娜等数十位当红女星卷入艳照外泄事件。事件发生之后,苹果单方面的撇清了自己的责任,称没有证据证明iCloud平台或是“查找我的手机”功能的漏洞,导致用户个人照片被盗。

但是为了保险起见,苹果采取两部认证的方法来加强iCloud服务的安全性。除了用户密码之外,用户还需要输入验证码,两步认证让大量的自动破解工具无功而返。

通过WiFi热点发动攻击:

通过WiFi热点发动攻击:
以色列安全公司Skycure在RSA信息安全大会上公布了这项iOS8的漏洞,黑客可强制iOS设备接入虚假WiFi热点,主要利用了WifiGate漏洞。

如果基于iOS8的iPhone或iPad遭到攻击,大部分连接到互联网的应用都无法使用,一启动就会崩溃,甚至还会导致iOS8设备无限重启。这种攻击手段主要利用了iOS的SSL漏洞,导致一项应用在试图与服务器建立安全连接时出现崩溃。

“死亡短信”,威力堪比“阿拉伯字符”:

别以为只要堤防那一串魔性的阿拉伯字符就够了,由英文、阿拉伯文、马拉地文和中文组成的“死亡短信”同样会令你的iOS8设备死机或重启。

只要向iOS8使用者发送一条含特定字符的短信,便可以令收信息人的iPhone、iPad或Watch死机并自动重启。

这项漏洞*先由社交网站reddit的网民发现,并迅速传遍全球,不少人拿来跟朋友开玩笑,甚至有人故意在twitter发出“死亡短信”,这些人也是够了。

更严重的漏洞,涉及数千应用的密码:

*后就是*近曝出的这一漏洞了。恶意应用借助漏洞可以绕过沙箱及其他安全保护措施进入App Store,然后从其他应用的钥链中获取密码,窃取其他应用的隐私数据,劫持网络端口,并假扮不同的应用拦截某些对话。

可以想象,这一漏洞如被攻击者利用,所造成的后果将是毁灭性的。由于,发现这一漏洞的研究人员半年前就已将漏洞报告给苹果公司,所以,对于即将到来的iOS 9系统究竟是否仍然存在这一漏洞,才是我们真正关注的。

iOS平台Dyld库函数遍历进程内的模块信息

源码:

dyld.h [plain text]
/*
* Copyright (c) 1999-2005 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the ‘License’). You may not use this file except in
* compliance with the License. Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this
* file.
*
* The Original Code and all software distributed under the License are
* distributed on an ‘AS IS’ basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
*
* @APPLE_LICENSE_HEADER_END@
*/
#ifndef _MACH_O_DYLD_H_
#define _MACH_O_DYLD_H_

#if __cplusplus
extern “C” {
#endif /* __cplusplus */

#include <stddef.h>
#include <stdint.h>
#if __cplusplus
/* C++ has bool type built in */
#else
#include <stdbool.h>
#endif
#include <mach-o/loader.h>
#include <AvailabilityMacros.h>

#ifndef ENUM_DYLD_BOOL
#define ENUM_DYLD_BOOL
#undef FALSE
#undef TRUE
enum DYLD_BOOL {
FALSE,
TRUE
};
#endif /* ENUM_DYLD_BOOL */

/*
* The high level NS… API.
*/

/* Object file image API */
typedef enum {
NSObjectFileImageFailure, /* for this a message is printed on stderr */
NSObjectFileImageSuccess,
NSObjectFileImageInappropriateFile,
NSObjectFileImageArch,
NSObjectFileImageFormat, /* for this a message is printed on stderr */
NSObjectFileImageAccess
} NSObjectFileImageReturnCode;

typedef struct __NSObjectFileImage* NSObjectFileImage;

/* limited implementation, only MH_BUNDLE files can be used */
extern NSObjectFileImageReturnCode NSCreateObjectFileImageFromFile(
const char *pathName,
NSObjectFileImage *objectFileImage);
extern NSObjectFileImageReturnCode NSCreateCoreFileImageFromFile(
const char *pathName,
NSObjectFileImage *objectFileImage);
extern NSObjectFileImageReturnCode NSCreateObjectFileImageFromMemory(
const void *address,
size_t size,
NSObjectFileImage *objectFileImage);
extern bool NSDestroyObjectFileImage(
NSObjectFileImage objectFileImage);
/*
* API on NSObjectFileImage’s for:
* “for Each Symbol Definition In Object File Image” (for Dynamic Bundles)
* and the same thing for references
*/
extern uint32_t NSSymbolDefinitionCountInObjectFileImage(
NSObjectFileImage objectFileImage);
extern const char * NSSymbolDefinitionNameInObjectFileImage(
NSObjectFileImage objectFileImage,
uint32_t ordinal);
extern uint32_t NSSymbolReferenceCountInObjectFileImage(
NSObjectFileImage objectFileImage);
extern const char * NSSymbolReferenceNameInObjectFileImage(
NSObjectFileImage objectFileImage,
uint32_t ordinal,
bool *tentative_definition); /* can be NULL */
/*
* API on NSObjectFileImage:
* “does Object File Image define symbol name X” (using sorted symbol table)
* and a way to get the named objective-C section
*/
extern bool NSIsSymbolDefinedInObjectFileImage(
NSObjectFileImage objectFileImage,
const char *symbolName) AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4;
extern void * NSGetSectionDataInObjectFileImage(
NSObjectFileImage objectFileImage,
const char *segmentName,
const char *sectionName,
size_t *size); /* can be NULL */
/* SPI first appeared in Mac OS X 10.3 */
extern bool NSHasModInitObjectFileImage(
NSObjectFileImage objectFileImage)
AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER;

/* module API */
typedef struct __NSModule* NSModule;
extern const char * NSNameOfModule(
NSModule m);
extern const char * NSLibraryNameForModule(
NSModule m);

/* limited implementation, only MH_BUNDLE files can be linked */
extern NSModule NSLinkModule(
NSObjectFileImage objectFileImage,
const char *moduleName,
uint32_t options);
#define NSLINKMODULE_OPTION_NONE 0x0
#define NSLINKMODULE_OPTION_BINDNOW 0x1
#define NSLINKMODULE_OPTION_PRIVATE 0x2
#define NSLINKMODULE_OPTION_RETURN_ON_ERROR 0x4
#define NSLINKMODULE_OPTION_DONT_CALL_MOD_INIT_ROUTINES 0x8
#define NSLINKMODULE_OPTION_TRAILING_PHYS_NAME 0x10

/* limited implementation, only modules loaded with NSLinkModule() can be
unlinked */
extern bool NSUnLinkModule(
NSModule module,
uint32_t options);
#define NSUNLINKMODULE_OPTION_NONE 0x0
#define NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED 0x1
#define NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES 0x2

/* not yet implemented */
extern NSModule NSReplaceModule(
NSModule moduleToReplace,
NSObjectFileImage newObjectFileImage,
uint32_t options);

/* symbol API */
typedef struct __NSSymbol* NSSymbol;
extern bool NSIsSymbolNameDefined(
const char *symbolName) AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4;
extern bool NSIsSymbolNameDefinedWithHint(
const char *symbolName,
const char *libraryNameHint) AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4;
extern bool NSIsSymbolNameDefinedInImage(
const struct mach_header *image,
const char *symbolName) AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4;
extern NSSymbol NSLookupAndBindSymbol(
const char *symbolName) AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4;
extern NSSymbol NSLookupAndBindSymbolWithHint(
const char *symbolName,
const char *libraryNameHint) AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4;
extern NSSymbol NSLookupSymbolInModule(
NSModule module,
const char *symbolName);
extern NSSymbol NSLookupSymbolInImage(
const struct mach_header *image,
const char *symbolName,
uint32_t options);
#define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND 0x0
#define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW 0x1
#define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_FULLY 0x2
#define NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR 0x4
extern const char * NSNameOfSymbol(
NSSymbol symbol);
extern void * NSAddressOfSymbol(
NSSymbol symbol);
extern NSModule NSModuleForSymbol(
NSSymbol symbol);

/* error handling API */
typedef enum {
NSLinkEditFileAccessError,
NSLinkEditFileFormatError,
NSLinkEditMachResourceError,
NSLinkEditUnixResourceError,
NSLinkEditOtherError,
NSLinkEditWarningError,
NSLinkEditMultiplyDefinedError,
NSLinkEditUndefinedError
} NSLinkEditErrors;

/*
* For the NSLinkEditErrors value NSLinkEditOtherError these are the values
* passed to the link edit error handler as the errorNumber (what would be an
* errno value for NSLinkEditUnixResourceError or a kern_return_t value for
* NSLinkEditMachResourceError).
*/
typedef enum {
NSOtherErrorRelocation,
NSOtherErrorLazyBind,
NSOtherErrorIndrLoop,
NSOtherErrorLazyInit,
NSOtherErrorInvalidArgs
} NSOtherErrorNumbers;

extern void NSLinkEditError(
NSLinkEditErrors *c,
int *errorNumber,
const char **fileName,
const char **errorString);

typedef struct {
void (*undefined)(const char *symbolName);
NSModule (*multiple)(NSSymbol s, NSModule oldModule, NSModule newModule);
void (*linkEdit)(NSLinkEditErrors errorClass, int errorNumber,
const char *fileName, const char *errorString);
} NSLinkEditErrorHandlers;

extern void NSInstallLinkEditErrorHandlers(
const NSLinkEditErrorHandlers *handlers);

/* other API */
extern bool NSAddLibrary(
const char *pathName) AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4;
extern bool NSAddLibraryWithSearching(
const char *pathName) AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4;
extern const struct mach_header * NSAddImage(
const char *image_name,
uint32_t options);
#define NSADDIMAGE_OPTION_NONE 0x0
#define NSADDIMAGE_OPTION_RETURN_ON_ERROR 0x1
#define NSADDIMAGE_OPTION_WITH_SEARCHING 0x2
#define NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED 0x4
#define NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME 0x8
extern int32_t NSVersionOfRunTimeLibrary(
const char *libraryName);
extern int32_t NSVersionOfLinkTimeLibrary(
const char *libraryName);
extern int _NSGetExecutablePath( /* SPI first appeared in Mac OS X 10.2 */
char *buf,
uint32_t *bufsize);

/*
* The low level _dyld_… API.
* (used by the objective-C runtime primarily)
*/
extern bool _dyld_present(
void);

extern uint32_t _dyld_image_count(
void);
extern const struct mach_header * _dyld_get_image_header(
uint32_t image_index);
extern intptr_t _dyld_get_image_vmaddr_slide(
uint32_t image_index);
extern const char * _dyld_get_image_name(
uint32_t image_index);

extern void _dyld_register_func_for_add_image(
void (*func)(const struct mach_header *mh, intptr_t vmaddr_slide));
extern void _dyld_register_func_for_remove_image(
void (*func)(const struct mach_header *mh, intptr_t vmaddr_slide));
extern void _dyld_register_func_for_link_module(
void (*func)(NSModule module));
/* not yet implemented */
extern void _dyld_register_func_for_unlink_module(
void (*func)(NSModule module));
/* not yet implemented */
extern void _dyld_register_func_for_replace_module(
void (*func)(NSModule oldmodule, NSModule newmodule));
extern void _dyld_get_objc_module_sect_for_module(
NSModule module,
void **objc_module,
size_t *size);
extern void _dyld_bind_objc_module(
const void *objc_module);
extern bool _dyld_bind_fully_image_containing_address(
const void *address);
extern bool _dyld_image_containing_address(
const void* address);
/* SPI first appeared in Mac OS X 10.3 */
extern const struct mach_header * _dyld_get_image_header_containing_address(
const void* address)
AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER;

extern void _dyld_moninit(
void (*monaddition)(char *lowpc, char *highpc));
extern bool _dyld_launched_prebound(
void);
/* SPI first appeared in Mac OS X 10.3 */
extern bool _dyld_all_twolevel_modules_prebound(
void)
AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER;

extern void _dyld_lookup_and_bind(
const char *symbol_name,
void **address,
NSModule* module) AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4;
extern void _dyld_lookup_and_bind_with_hint(
const char *symbol_name,
const char *library_name_hint,
void **address,
NSModule* module) AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4;
extern void _dyld_lookup_and_bind_objc(
const char *symbol_name,
void **address,
NSModule* module);
extern void _dyld_lookup_and_bind_fully(
const char *symbol_name,
void **address,
NSModule* module);

extern int _dyld_func_lookup(
const char *dyld_func_name,
void **address);

#if __cplusplus
}
#endif /* __cplusplus */

#endif /* _MACH_O_DYLD_H_ */

iOS 7.X完美越狱工具放出 支持所有iOS设备

今晚,evad3rs越狱团队放出了*新的全系列iOS设备 完美越狱工具evasi0n。支持所有的iPhone、iPod touch、iPad、和iPad mini,可实现 ios7越狱。

越狱前注意事项如下:

1、越狱前需要关闭锁屏密码(设置-通用-密码),关闭iTunes;

2、将iOS设备连接到电脑,打开越狱工具evasi0n,并对电脑进行“信任”授权;

3、勾选Cydia后点击“Jailbreak”;

4、等待重启后点击屏幕中新出现的“evasi0n太*7”图标,点击后再次等待重启即可

此次越狱可在3~5分钟完成,目前新浪微博中已经有iPhone 5s和iPad的成功越狱分享。(完)

ios 7 完美越狱总结

圣诞节前夕,越狱大神终于放出了ios 7 的完美越狱,兑现了之前的承诺。不过由于太*助手的原因,越狱发布后就引起了一番激烈的辩论,而且越狱工具不太稳定,经常出现白苹果。 现将这几天总结的越狱心得写出,做个总结。

越狱之前的准备工作:

1、备份!!! 这个十分重要,因为很难保证越狱一定会成功,如果越狱出现白苹果,就可以通过备份恢复到之前的状态,不会使宝贵的数据丢失。

推荐的几种备份方式:1、官方备份:采用iTunes 优点:操作简便 缺点:备份时间较长,而且修改备份位置较复杂,很有可能挤占原本就不那么富裕的C盘空间。

2、iCloud备份:操作简便,节省空间  缺点:如果网速较慢的话,恢复的时间很长。

3、使用同步推等第三方助手进行备份  这种备份可以备份所有数据,缺点是操作略微复杂。

无论采用何种方式,做好备份都是*位,毕竟我们并不希望我们之前珍藏的数据因为越狱而付之一炬。

2、准备好自己设备对应版本的固件,可以到威锋网固件中心进行下载

3、注意自己是否为ota升级方式,若是,则需要重新刷一次机,确保系统版本为线刷版本

4、下载evasi0n越狱工具,进行越狱。

注意:目前的版本并不支ipad2的越狱,如果你是ipad2 用户,请再耐心等待,现在越狱只会出现白苹果。

iPhoneX && iOS11 适配

*近实在是蛮闲的,这都得益于苹果爸爸给力的审核,已经半个月了(委屈)

这个问题已经很久了,但是还是希望分享给各位,当然网上的教程的确很多;


 

1、automaticallyAdjustsScrollViewInsets

automaticallyAdjustsScrollViewInsets是在iOS11之前为ScrollView自动处理内边距的,讲实话这个属性我从来都是禁止的,不喜欢被别人自动控制,主要原因还是因为控制不住别人的自动控制。

当设置为YES时(默认YES),如果视图里面存在唯一一个UIScrollView或其子类View,那么它会自动设置相应的内边距,这样可以让scroll占据整个视图,又不会让导航栏遮盖。

当controller上的*个子视图不是scrollview以及其子类的时候,就会取消内边距。此时原本全屏的scrollview设置的frame(0,0,self.view.frame.size.width,xx)就会从状态栏开始算起,如果应用有导航栏的话,那么就会遮盖住视图的64个高度

当然这很绕,简单的方法就是不要去管他,当视图出现故障的时候一定要*时间想起它!

在iOS11,你会发现这个属性失效了,查询可以看到下面的说明:在iOS11使用UIScrollView’s contentInsetAdjustmentBehavior instead

@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets API_DEPRECATED(“Use UIScrollView’s contentInsetAdjustmentBehavior instead”, ios(7.0,11.0),tvos(7.0,11.0)); // Defaults to YES

你可以这样做:

if (@available(iOS 11.0, *)) {
    self.scrollview.contentInsetAdjustmentBehavior = UIApplicationBackgroundFetchIntervalNever;
} else {
    self.automaticallyAdjustsScrollViewInsets = false;
}

swift:

  if #available(iOS 11.0, *) {
            tableView.contentInsetAdjustmentBehavior = .never
        } else {
            self.automaticallyAdjustsScrollViewInsets = false
        }

有位大神写了个宏供各位参考:

#define  adjustsScrollViewInsets_NO(scrollView,vc)\
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
if ([UIScrollView instancesRespondToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\
[scrollView   performSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:") withObject:@(2)];\
} else {\
vc.automaticallyAdjustsScrollViewInsets = NO;\
}\
_Pragma("clang diagnostic pop") \
} while (0)

或者下面屌丝一点的宏定义:

#define AdjustsScrollViewInsetNever(controller,view) if(@available(iOS 11.0, *)) {view.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;} else if([controller isKindOfClass:[UIViewController class]]) {controller.automaticallyAdjustsScrollViewInsets = false;}

 

2 、齐刘海 

众所周知,导航的高度为64,在哪个手机上面都是不变的,iPhone X没出来之前是对的,随便写64,iPhone X出来后,大家都傻眼了,导航栏高度变了有可能为88,傻眼了吧,如果你纯码写的都是64,这时候你写出了下面的代码:

-(UITableView *)goodsTypeTableView{
    if (!_goodsTypeTableView) {
        _goodsTypeTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, kScreen_width, kScreen_height - 64 - 49) style:UITableViewStylePlain];
        _goodsTypeTableView.delegate = self;
        _goodsTypeTableView.dataSource = self;
        [_goodsTypeTableView registerClass:[XJMarketGoodsTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XJMarketGoodsTableViewCell class])];

    }
    return _goodsTypeTableView;
}

哇赛!很炸天嘛,你发现要么是上面的内容被遮挡了,要么是下面的内容被遮挡了,这都是因为写死了64和49造成的。所以你应该这样做:

    #define SafeAreaTopHeight (kScreen_height == 812.0 ? 88 : 64)

&&

  #define SafeAreaBottomHeight (kScreen_height == 812.0 ? 83 : 49)

 

3 、UIBarButtonItem

%title插图%num

在iOS 11 里面使用 CustomView创建的item造成frame错乱以及设置边距item.width = -20等失效问题,归根结底是因为苹果更改了iOS11上面uinavigationBar的结构

%title插图%num

iOS 11以前的navigationBar添加的right和left直接添加到navigationBar上面,并且使用的是frame布局的

 iOS 11 navigationBar结构图:
%title插图%num

有图我们可以看到, 添加的right和leftUIBarButtonItem并不是直接添加到nagitionBar上面。而是在外面嵌套了一个uibuttonBarStackView,而StackView并不是使用的frame,而是用的约束来布局,所以必须得用 AutoLayout 了!

 /// 适配iOS11 UIBarButtonItem 添加自定义布局
 if (@available(iOS 9.0,*)) { /// 强迫症的朋友这里也是可以写成11.0
    [backbtn.widthAnchor constraintEqualToConstant:size.width].active = true;
    [backbtn.heightAnchor constraintEqualToConstant:size.height].active = true;
  }

iOS11里面正确效果:

%title插图%num

 4 、tableView

iOS11 tableView默认启用了Self-Sizing,这个应该是UITableView*大的改变。我们知道在iOS8引入Self-Sizing 之后,我们可以通过实现estimatedRowHeight相关的属性来展示动态的内容,实现了estimatedRowHeight属性后,得到的初始contenSize是个估算值,是通过estimatedRowHeight 乘以 cell的个数得到的,并不是*终的contenSize,只是当前屏幕能够显示的cell个数,滑动时,tableView不停地得到新的cell,更新自己的contenSize。

Self-Sizing在iOS11下是默认开启的,Headers, footers, and cells都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension:

如果目前项目中没有使用estimateRowHeight属性,在iOS11的环境下就要注意了,因为开启Self-Sizing之后,tableView是使用estimateRowHeight属性的,这样就会造成contentSize和contentOffset值的变化,如果是有动画是观察这两个属性的变化进行的,就会造成动画的异常,因为在估算行高机制下,contentSize的值是一点点地变化更新的,所有cell显示完后才是*终的contentSize值。因为不会缓存正确的行高,tableView reloadData的时候,会重新计算contentSize,就有可能会引起contentOffset的变化。

iOS11下不想使用Self-Sizing的话,可以通过以下方式关闭:

//添加以下代码

self.tableView.estimatedRowHeight =0;

self.tableView.estimatedSectionHeaderHeight =0;

self.tableView.estimatedSectionFooterHeight =0;

或者进行全局的配置:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    //适配iOS11的tableView问题
    [UITableView appearance].estimatedRowHeight = 0;
    [UITableView appearance].estimatedSectionHeaderHeight = 0;
    [UITableView appearance].estimatedSectionFooterHeight = 0;

    if (@available(iOS 11, *)) {
        [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; 
//iOS11 解决SafeArea的问题,同时能解决pop时上级页面scrollView抖动的问题
    }
    return YES;
}

如果你发现你的表头表尾单元格突然变得大了,问题就在这里!

5 、tableView分割线

iOS 7 引入separatorInset属性,用以设置 cell 的分割线边距,在 iOS 11 中对其进行了扩展。可以通过新增的UITableViewSeparatorInsetReference枚举类型的separatorInsetReference属性来设置separatorInset属性的参照值。

 

typedef NS_ENUM(NSInteger, UITableViewSeparatorInsetReference) {

    // The value set to the separatorInset property is interpreted as an offset from the edges of the cell.

    UITableViewSeparatorInsetFromCellEdges,

    

    // The value set to the separatorInset property is interpreted as an offset from the automatic separator insets.

    UITableViewSeparatorInsetFromAutomaticInsets

API_AVAILABLE(ios(11.0), tvos(11.0));

他们的效果是这样的 :
%title插图%num%title插图%num
一般我们都会设置分割线左边顶个:使用下面的全局配置:
  1. – (void)_setTableViewAppearace {
  2. [[UITableView appearance]setTableFooterView:[UIView new]];
  3. [[UITableView appearance]setSeparatorInset:UIEdgeInsetsZero];
  4. }

 


基本就是这样了,如果有其它的问题会继续补充!

《深入解析Mac OS X & iOS操作系统》读书笔记

本书对OS XiOS的底层细节讲的非常详细,各方面都有所涉及,对于深入了解OS XiOS有很大帮助。对于一般App开发人员来说,我感觉本书内容并不太适合,所以完全以扩充知识面的目标读完本书,以下是以我所关心的内容整理的读书笔记,希望对大家有所帮助。

*章 达尔文主义:OS X的进化史

  1. OS X是Mac OS ClassicNeXTSTEP的融合。
  2. Darwin是操作系统的类UNIX核心,由kernel、XNU和运行时组成,是OS X和iOS的重要组成部分,OS X的Darwin是开源的,除OS X10.0对应Darwin 1.3.x之外,其他版本都符合:if (OSX.version == 10.x.y) Darwin.version = (4+x).y
  3. 从10.3(Panther)开始,苹果开发了Safari替代IE for Mac;从10.4.4(Tiger)开始,支持Intel x86架构;10.5(Leopard)有了Objective-C 2.0;10.6(Snow Leopard)开始完整支持64位,提供GCD,完全抛弃PPC架构
  4. iOS和OS X对比:
    • iOS基于ARM架构,而OS X基于Intel i386x86_64
    • iOS内核代码依然闭源,OS X内核XNU则是开源的。
    • iOS内核的编译稍有不同,关注的是嵌入式特性和一些新的API。
    • iOS的系统GUI是SpringBoard,OS X为Aqua
    • iOS的内存管理要紧凑得多,因为移动设备没有几乎无穷的交换空间可以使用。
    • iOS应用程序不允许访问底层UNIX API(即Darwin),也没有root访问权限,而且只能访问自己的目录内数据。

第二章 合众为一:OS X和iOS的架构

  1. OS X和iOS层次结构:
    • 用户体验层:包括AquaDashboardSpotlight辅助功能(Accessibility),iOS中为SpringBoard同时支持Spotlight
    • 应用框架层:包括CocoaCarbonJava,而在iOS中只有Cocoa(Cocoa Touch)
    • 核心框架:也称为图形和媒体层。包括核心框架Open GLQuickTime
    • Darwin:操作系统核心,包括内核UNIX shell环境
      %title插图%num
  2. Darwin架构:
    %title插图%num
  3. GUI是由*个用户态进程launchd启动的,支持GUI工作的主进程是WindowServer
  4. Carbon是OS 9遗留编程接口的名称,已废弃
  5. XNU包含组件:Mach微内核BSD层linkernI/O Kit

第三章 站在巨人的肩膀上:OS X和iOS使用的技术

  1. kqueue是BSD中使用的内核事件通知机制,一个kqueue指的是一个描述符,这个描述符会阻塞等待直到一个特定类型和种类的事件发生。如监视文件、Mach port、套接字、发给进程的特定信号、纳秒级定时器、虚拟内存相关通知、vnode相关。
  2. 强制访问控制(MAC),FreeBSD 5.x*早引入,是OS X隔离机制(Sandboxing,沙盒机制)和iOS的entitlement机制基础。
  3. OS X 10.4(Tiger)引入新的日志模型:Apple System Log(ASL),目标是提供比传统UNIX日志syslog更为灵活的功能。
  4. FSEvents提供了文件系统通知的API,和Linux的inotify类似。
  5. 沙盒架构:
    %title插图%num

第四章 庖丁解进程:Mach-O格式、进程以及线程内幕

  1. UNIX进程生命周期:
    %title插图%num
  2. OS X目前支持三种可执行格式:
    • 解释器脚本格式(以#!后的命令运行脚本,魔数:#!
    • 通用二进制格式(胖二进制格式,魔数:小尾0xcafebabe,大尾0xbebafeca
    • Mach-O格式(OS X原生二进制格式,魔数:32位0xfeedface,64位0xfeedfacf),系统根据魔数类型加载执行文件。
  3. 通用二进制格式本质就是各种架构的二进制文件的打包文件,通过文件头的信息以加载匹配当前架构的二进制文件。
  4. OS X上几乎所有的程序都是动态链接的,默认使用dyld作为动态链接器,这是一个用户态进程,不属于内核。
  5. 32位OS X系统中,用户态和内核态都有完整的4GB地址空间,代价是地址空间切换需要刷新CR3和TLB
  6. __PAGEZERO段,32位为一个页(4K),64位为4GB。为方便捕获空指针和将整数当做指针引用。
  7. OS X中main函数有额外参数apple:
void main (int argc, char **argv, char **envp, char **apple)

第五章 进程跟踪和调试

  1. OS X对DTrace支持较为完整,而iOS没有,需使用CHUDAppleProfileFamily
  2. 获取进程信息系统调用:sysctlproc_info
  3. 使用未文档化的stack_snapshot系统调用,可以捕获指定进程中所有的线程状态。
  4. OS X和iOS都没有使用核心转储文件,而是使用Crash Reporter生成崩溃日志,用以调试应用程序崩溃。
  5. OS X和iOS可将异常端口绑定至BSD进程底层的Mach任务,可很容易实现当应用程序崩溃时自动运行另一个程序。而在UNIX中,很难简单实现,因为只有父进程能收到子进程的死亡通知。
  6. 可使用heapleaksmalloc_history工具调试内存泄漏。

第六章 引导过程:EFI和iBoot

  1. 大部分PC使用BIOS引导(Windows),OS X使用EFI引导,iOS使用iBoot引导
  2. EFI服务提供引导服务运行时服务,前者只能只能在EFI模式下使用,后者在退出EFI模式,即操作系统加载后也能使用,I/O Kit重度使用。
  3. EFI引导完成后得到*终的BootStruct,将其和控制权交给内核完成引导。
  4. iOS引导过程:(除引导ROM外,其他步骤都是加密且数字签名的。)
    %title插图%num

第七章 launchd

  1. OS X和iOS中的launchd对应UN*X系统中的init,但相对init有许多改进。包含了如atd、crond、inetd/xinetd等daemon,支持事务、autorun和文件系统观察,整合I/O Kit。
  2. launchd区分两种后台作业:
    • 守护程序(daemon):和用户没有交互,不考虑是否有用户登录系统。
    • 代理程序(agent):可以和用户有交互,只有在用户登录时启动。
  3. iOS中的lockdownd,负责处理设备激活、备份、崩溃报告、设备同步等。
  4. OS X中的GUI shell是Finder,iOS为SpringBoard
  5. XPC是Lion和iOS5新引入的轻量级进程间通信原语,目前闭源。

第八章 内核架构

  1. 内核架构设计类型有巨内核(UNIX、Linux)、微内核(Mach)、混合内核(XNU、Windows)。
  2. 内核态、用户态转换分为自愿转换、非自愿转换。
    • 自愿转换:使用内核服务,即系统调用。
    • 非自愿转换:发生异常、中断或处理器陷阱时。
  3. XNU中系统调用有4种:UNIXMACHMDEP(机器相关调用)、DIAG(诊断调用)
  4. 32位系统下,UNIX系统调用编号为正数,MACH为负数,64位则都为正数,*高位字节包含调用类型。

第九章 由生到死——内核引导和内核崩溃

  1. XNU源码中,所有函数的实现都将函数名放在行头,即返回值在上一行,这是为了方便搜索。
  2. pid 0是内核进程kernel_task(准确说0表示没有pid),launchd是*个用户态进程,pid为1。
  3. 可通过KDP协议远程调试内核。

第十章 Mach原语:一切以消息为媒介

  1. Mach的*主要目标就是将所有功能移出内核,放在用户态中,将内核保持在*简状态。
  2. Mach同步原语:互斥体自旋锁信号量锁集。其中信号量和锁集在用户态下可见。
  3. Mach的机器层原语:主机(host)时钟处理器处理器集的抽象

第十一章 Mach调度

  1. 线程是Mach中*小执行单元,线程是包含在任务(task)中的。
  2. Mach内核中没有BSD进程概念,而是以任务表示,一个BSD进程对应一个底层Mach任务对象,kernel_task即是Mach对于内核的表示。
  3. Mach允许创建远程线程,即可以在一个任务中创建另一个任务的线程,Windows也可以实现,而UNIX和Linux不支持这种功能。
  4. Mach调度优先级有128个,Windows为32个,Linux为140个。其中数字越大,优先级越高。
  5. 控制权转交(handoff):Mach调度器允许线程主动放弃CPU,并指定某个特定线程运行。
  6. 可使用续体(continuation):线程可丢弃自己的栈,系统恢复时不需要恢复线程栈,可以明显加快上下文切换速度,此项特性在Mach中应用广泛。
  7. 通过异步软件陷阱(AST)可使内核响应外带事件,如调度事件,BSD信号基于此实现。
  8. launchd注册异常端口,其子进程也继承同样端口,崩溃报告器(crash reporter)会接受此端口发出的异常,会当发生crash时,崩溃报告器会自动根据需要启动。

第十二章 Mach虚拟内存

  1. Mach的虚拟内存子系统主要分两层:虚拟内存层(机器无关)、物理内存层(机器相关)。
  2. Mach中zone的概念相当于Linux的memory cache和Windows的Poll
  3. zone是一种内存区域,用于快速分配和释放频繁的固定大小的对象。例如,可使用zprint kalloc查看kalloczone
  4. Mach的分页器主要有:Default分页器VNode分页器Device分页器Swapfile分页器Apple-protected分页器Freezer分页器(iOS)。
  5. 分页器只是提供分页操作,不决定具体调度,调度由pageout守护线程执行。

第十三章 BSD层

  1. OS X有UNIX03认证,达到源码级兼容,即提供与UNIX统一的API。
  2. BSD层在Mach层之上,提供了POSIX API。但XNU的BSD不是完整的BSD,即移植部分BSD内容,如VFS网络架构
  3. BSD的进程和线程都是在Mach提供原语的基础上进行了封装,BSD进程和线程对应有Mach的任务和线程。
  4. XNU中内核线程都是Mach线程,没有对应的BSD线程,同样内核任务kernel_task也没有对应的进程(因此其pid为0,表示没有进程pid)。
  5. UNIX模型中,进程不能被“创建”出来,只能通过fork()系统调用复制出来。vforkforkposix_spawn系统调用,底层都是由fork1()实现,只是传入参数不同。
  6. 除了DTrace,XNU在BSD层还提供了其他UNIX具有的ptrace,但功能大大缩水,如不能读写其他进程内存。
  7. Mach通过异常机制处理底层的陷阱,BSD则在异常机制之上构建了信号处理机制。操作系统和用户产生的信号先被Mach转换为异常,然后再由BSD产生信号。

第十四章 有新有旧:BSD高级功能

  1. OS X和iOS低内存处理机制称为Jetsam,或Memorystatus。用于杀掉消耗过多太多内存的进程并抛弃占用内存。
  2. iOS中,Jetsam/Memorystatus和默认的freezer结合使用,实现内存冷冻而不是杀死。
  3. 从Mountain Lion和iOS6开始,实行内核地址空间布局随机化(KASLR),以提高系统安全性。
  4. 工作队列(work queue),作用是为应用程序提供多线程支持并扩展到多处理器支持,为GCD提供了基础。
  5. MAC是从TrustdBSD引入的强大安全特性,在OS X主要体现在沙盒机制,在iOS中主要体现为entitlement机制
  6. sandbox将所有第三方应用限制为只能访问自己的目录;AppleMobileFileIntegrity.kext(用户态守护进程amfid)负责杀掉任何代码签名不正确的进程。

第十五章 文件系统和虚拟文件系统交换

  1. XUN的文件系统是在BSD层实现的,使用了来自Solaris的VFS框架(已成为UNIX内核与文件系统实现之间的标准接口)。
  2. OS X传统上支持3种分区方案:主引导记录(MBR)Apple Partition Map(APM)GUID分区表(GPT)
  3. MBR是除OS X和64位Windows之外其他操作系统的默认分区方案,以磁盘*扇区为引导扇区。
  4. APM是苹果设计用来取代MBR的,现只存于PPC的Mac和iPad Classic和Nano中。
  5. 在苹果普遍使用的是GPT(包括iOS),属于EFI规范的一部分。
  6. LwVM是苹果的私有分区方案,继承自GPT,用于iOS5默认分区方案,它允许分区加密。
  7. CoreStorage是Lion新引入的分区类型,给OS X带来了逻辑卷管理的支持,支持全盘加密,只能创建在GPT驱动器上。
  8. 所有文件系统都提供了同样的原语,内核对文件的接口称为虚拟文件系统交换(VFS)。Mac原生的文件系统为HFS(已废弃)、HFS+
  9. 即插即用是由守护进程diskarbitrationd实现,由launchd启动。
  10. DMG格式,即磁盘镜像文件,包含了整个文件系统,属于苹果私有格式。从Lion开始,允许指定DMG文件用作根文件系统,如安装系统时。

第十六章 基于B树的HFS+文件系统

  1. DOS原生文件系统为FAT,Windows是NTFS,Linux是Ext2/3/4,OS X为HFS+,iOS为HFSX
  2. HFS+通过支持扩展属性来支持访问控制表(ACL)(精确设置任何用户任何组的具体权限)。
  3. 扩展属性可以添加很多额外信息,如文件件的颜色标签、文件下载来源等,可通过ls -l@xattr查看,但像文件压缩、ACL则在这些命令中被屏蔽了,需要更底层的方法查看。
  4. 系统中有很多文件是通过HFS+的压缩属性进行压缩的,如常用的ls命令。可通过ls的-O参数查看。
  5. HFS+使用的UTF-16编码,文件名*长255个字符。
  6. HFS+是大小写不敏感的,但保留大小写,而现版本的HFSX只是在HFS+的基础上变为大小写敏感。
  7. HFS+使用6个特殊文件维护数据:编录(catalog)B树属性B树extent溢出B树热文件B树分配文件启动文件

第十七章 遵守协议:网络协议栈

  1. 苹果原本使用自己的AppleTalk网络协议栈,后放弃才采用TCP/IP。至今仍使用的Bonjour协议AFP协议都是AppleTalk的遗产。
  2. 网络驱动程序套接字(PF_NDRV)(苹果特有),支持用户态下深入数据链路层直接修改原始数据包。
  3. 系统套接字(PF_SYSTEM)(苹果特有),提供了一种内核空间和用户空间通信的方法。
  4. 套接字在内核中是个巨大的数据结构,内核需要维护套接字和文件描述符的映射关系。
  5. XNU支持的网络层协议有:IPv4IPv6AppleTalk
  6. 在网络接口层,lo接口是唯一必须存在的,且属于原生支持接口;en接口(以太网或802.11接口)、fw接口(IP over FireWire)、pdp_ip接口(蜂窝数据连接)、ppp接口(Point-to-Point协议)都不是XNU原生支持的,而是通过内核扩展来创建的。
  7. utun是特殊的原生支持接口,使用的是系统套接字(PF_SYSTEM)*和其他进程通过这个接口提供一个伪接口,这个伪接口的流量都会重新引导到用户态进程。utun发送数据包:
    %title插图%num
  8. XNU支持一下数据包过滤机制,著名的TCPDump就是基于BPF过滤机制实现的。
    不同数据包过滤机制的比较:
    %title插图%num

第十六章 内核扩展模块

  1. OS X和iOS使用kernelcache预链接kext,kernelcache可以签名、加密(iOS就加密了)。
  2. kernelcache在OS X下是动态创建的,以加快引导进程;iOS中则是由苹果提供的一个固定的文件,不同iDevice是不一样的。
  3. OS X中大部分和kext的接口工作是由守护进程kextd完成的,以Mach消息通信,而iOS不存在。
  4. 内核内置组件会以伪kext的形式出现在kext列表中。

第十七章 驱动力——I/O Kit驱动程序框架

  1. XNU使用C++开发驱动程序,其运行时环境称为I/O Kit,是一套几乎自包含的编程环境,可方便的通过面向对象的特性开发驱动程序。
  2. libkern C++运行时是I/O Kit的基础,定义了所有I/O Kit驱动程序都可使用的基础类,如OSObject、OSMetaClass、OSArray、OSDictionary、OSString等。
  3. I/O Kit维护了一个保存所有对象及对象间关系*新信息的数据库,称之为I/O Registy
  4. I/O Kit所有驱动程序都是从公共祖先IOService继承而来的对象。
  5. I/O Kit的驱动程序分为两种:驱动程序(driver)节点(nub),节点就是指两个驱动程序之间的适配器,表示被控制的设备。
  6. I/O Kit驱动程序状态机:
    %title插图%num

OVER!

苹果新专利:AppleCar或可识别交警手势

品玩2月3日讯,据AppleInsider消息,苹果*新曝光了一份识别交通手势的新专利。专利显示,Apple Car可通过传感器识别交警的手势。此外,车辆可配备命令确认装置,用于向交警确认车辆对交通分流条件或机动命令的理解。一旦检测到并确定,从指挥交警那里收集的信息“可以与其他车辆和设备共享,或者存储在数据库中”

%title插图%num