iOS NSData探秘

2024-05-28 01:58
文章标签 ios 探秘 nsdata

本文主要是介绍iOS NSData探秘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请先参考

http://zhiwei.li/text/2012/03/objetive-c内存布局/

http://zhiwei.li/text/2010/11/objective-c中的meta-class/

http://zhiwei.li/text/2010/05/objective-c类对象/

 

 

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/System/Library/Frameworks/Foundation.framework/Headers

NSObject.h

NSData.h
Foundation.h

CFData 和 NSData也可进行强制转换

NSString和CFStringRef可以实现强制转换

http://www.opensource.apple.com/source/CF/CF-744.12/CFData.c

 

struct __CFData {
CFRuntimeBase _base;
CFIndex _length; /* number of bytes */
CFIndex _capacity; /* maximum number of bytes */
CFAllocatorRef _bytesDeallocator; /* used only for immutable; if NULL, no deallocation */
uint8_t *_bytes; /* compaction: direct access to _bytes is only valid when data is not inline */
};

/*
Bit 0 = is mutable
Bit 1 = growable
Bit 2 = bytes inline
Bit 3 = use given CFAllocator
Bit 5 = allocate collectable memory

Bits 1-0 are used for mutability variation

Bit 6 = not all bytes have been zeroed yet (mutable)
*/

enum {
__kCFMutable = 0×01,
__kCFGrowable = 0×02,
__kCFMutableVarietyMask = 0×03,
__kCFBytesInline = 0×04,
__kCFUseAllocator = 0×08,
__kCFAllocatesCollectable = 0×20,
};

enum {
kCFImmutable = 0×0, /* unchangable and fixed capacity; default */
kCFFixedMutable = 0×1, /* changeable and fixed capacity */
kCFMutable = 0×3 /* changeable and variable capacity */
};

CF_INLINE void __CFDataSetInfoBits(CFDataRef data, UInt32 v) {__CFBitfieldSetValue(((CFRuntimeBase *)data)->_cfinfo[CF_INFO_BITS], 5, 0, v);}

http://www.opensource.apple.com/source/CF/CF-744.12/CFRuntime.h

/* All CF “instances” start with this structure. Never refer to
* these fields directly — they are for CF’s use and may be added
* to or removed or change format without warning. Binary
* compatibility for uses of this struct is not guaranteed from
* release to release.
*/

typedef struct __CFRuntimeBase {
    uintptr_t _cfisa;
    uint8_t _cfinfo[4];
    #if __LP64__
         uint32_t _rc;
    #endif
} CFRuntimeBase;

isa info 与NSObject 对应

 


(lldb) reg read

General Purpose Registers:

        r0 = 0x1f5ac970

        r1 = 0x1fa00000

        r2 = 0x1fa00084

        r3 = 0x0000009f

        r4 = 0x398f25c1  libobjc.A.dylib`objc_msgSend + 1

        r5 = 0×00000070

        r6 = 0x000fa69c  “dataWithBytes:length:”

        r7 = 0x2fd08338

        r8 = 0x000fa6dc  (void *)0x39f4e7f0: NSData

        r9 = 0x00291c01

       r10 = 0x000fa64c  “alloc”

       r11 = 0x000fa6d8  (void *)0x000fa750: AESCryptor

       r12 = 0×39903231  libobjc.A.dylib`-[NSObject autorelease] + 1

        sp = 0x2fd08300

        lr = 0x000f8f51  xi`-[AESCryptor signUpUrl] + 117 at AESCryptor.m:86

        pc = 0x000f8f52  xi`-[AESCryptor signUpUrl] + 118 at AESCryptor.m:87

      cpsr = 0×00000030

 

 

 

 

 

 

 

(lldb) memory read –size 4 –format x –count 0×20 0x2fd0831c

0x2fd0831c: 0x1f5ac970 0x000f99b6 0x20855af0 0x000fa684

 

 

 

(lldb) memory read –size 4 –format x –count 0×20 0x1f5ac970

0x1f5ac970: 0x3a04a97c 0×00000001 0×00000070 0×00000070

0x1f5ac980: 0x90ba060e 0xffc7b64d 0x3ad1b110 0xd1b9059b

0x1f5ac990: 0x8f5999b6 0xfbca0345 0x603a133b 0x66e0f845

0x1f5ac9a0: 0xa2d1d7d4 0xd32c8271 0x2d7584b9 0xef77c1aa

0x1f5ac9b0: 0x8106a0f4 0xb3c83ded 0x58ac007c 0x418137e9

 

metaClass     ISA

Type               1

Length           0×70

Max      0×70

后面跟着的就是数据

(lldb) reg read

General Purpose Registers:

        r0 = 0x39f4e7f0  (void *)0x39f4e7dc: NSData

        r1 = 0x384656c5  “dataWithBytesNoCopy:length:”

        r2 = 0x1f5ad090

        r3 = 0×00000060

        r4 = 0×00000010

        r5 = 0x000fa858  iv

        r6 = 0x1f5ac980

        r7 = 0x2fd082a4

        r8 = 0×00000070

        r9 = 0x398f25c1  libobjc.A.dylib`objc_msgSend + 1

       r10 = 0x1f5ad090

       r11 = 0×00000080

       r12 = 0x3b8a67f0  (void *)0x39d54915: OSSpinLockUnlock$VARIANT$mp + 1

        sp = 0x2fd08214

        lr = 0x39d3706f  libsystem_c.dylib`free + 171

        pc = 0x000f9174  Fonexi`-[AESCryptor decryptv2:withKey:] + 312 at AESCryptor.m:124

      cpsr = 0×60000030

 

(lldb) memory read –size 4 –format x –count 0×20 0x1f5ad090

0x1f5ad090: 0x8b5e543e 0xb82436ef 0x500dc3e4 0x230688f4

0x1f5ad0a0: 0xa46710e6 0x545b659e 0x852adec4 0xd21781f0

0x1f5ad0b0: 0xf71d5333 0xd72ebc0c 0xbffb5d37 0x2a93c3c1

0x1f5ad0c0: 0xbb98a8e4 0x767af3a0 0x3cc44626 0x6e99bc20

0x1f5ad0d0: 0xfc3febf7 0xe5b15ef0 0xcc456b3d 0xd522fcf3

0x1f5ad0e0: 0xb94973c5 0xa022a02f 0xa32ff49f 0x00db5aa0

0x1f5ad0f0: 0×00000000 0x1f5ad0e4 0×00000000 0x07aca020

0x1f5ad100: 0×00000000 0×00000000 0×00000000 0×00000000

 

 

 

 

(lldb) memory read –size 4 –format x –count 0×20 0x1f5b2e70

0x1f5b2e70: 0x3a04a97c 0×00000002 0×00000060 0×00000060

0x1f5b2e80: 0x1f5ad090 0×00000000 0×00000000 0×00000000

 

ISA  0x3a04a97c,就是所谓NSConcreateData

但类型已经变成 02了,长度和容量 是 0×60

接下来的0x1f5ad090 就是指针, 

 

dataWithBytesNoCopy 就是这个效果

 

(lldb) memory read –size 4 –format x –count 0×40  0x21df00

error: failed to sent packet: ‘m21de00,200′

(lldb) memory read –size 4 –format x –count 0×40  0x21df00

0x0021df00: 0x3a04a97c 0×00000002 0x00000eaa 0x00000eaa

0x0021df10: 0x00ba4600 0×00000000 0×00000000 0×00000000

明显 info = 0×2 可以增长,但是不能修改内容
(lldb) memory read –size 1  –count 0×100 –outfile /tmp/1.bin –binary  0x00ba4a00
256 bytes written to ‘/tmp/1.bin’
(lldb) memory read –size 1  –count 0×100 –outfile /tmp/1.bin –binary –append-outfile 0x00ba4b00
256 bytes appended to ‘/tmp/1.bin’
(lldb) memory read –size 1  –count 0×100 –outfile /tmp/1.bin –binary –append-outfile 0x00ba4c00
256 bytes appended to ‘/tmp/1.bin’

这篇关于iOS NSData探秘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009221

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

Spring Boot 注解探秘:HTTP 请求的魅力之旅

在SpringBoot应用开发中,处理Http请求是一项基础且重要的任务。Spring Boot通过提供一系列丰富的注解极大地简化了这一过程,使得定义请求处理器和路由变得更加直观与便捷。这些注解不仅帮助开发者清晰地定义不同类型的HTTP请求如何被处理,同时也提升了代码的可读性和维护性。 一、@RequestMapping @RequestMapping用于将特定的HTTP请求映射到特定的方法上

iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)

摘要 剪贴板同步能够提高很多的效率,免去复制、发送、复制、粘贴的步骤,只需要在手机上复制,就可以直接在电脑上 ctrl+v 粘贴,这方面在 Apple 设备中是做的非常好的,Apple 设备之间的剪贴板同步功能(Universal Clipboard)确实非常方便,它可以在 iPhone、iPad 和 Mac 之间无缝传输剪贴板内容,从而大大提高工作效率。 但是,iPhone 如何和 Wind

iOS项目发布提交出现invalid code signing entitlements错误。

1、进入开发者账号,选择App IDs,找到自己项目对应的AppId,点击进去编辑, 2、看下错误提示出现  --Specifically, value "CVYZ6723728.*" for key "com.apple.developer.ubiquity-container-identifiers" in XX is not supported.-- 这样的错误提示 将ubiquity

我的第一次份实习工作-iOS实习生-第三个月

第三个月 这个月有一个考核项目,是一个电子书阅读器,组长说很重要,是我的实习考核项目。 我的项目XTReader,这是我参考网上的一些代码,和模仿咪咕阅读做的,功能还不完善,数据的部分是用聚合数据做的。要收费的。   还有阅读页面,基本功能实现了一下。使用了autolayout,自适应布局,也是第一次用网络,第一次用数据库,第一次用自动布局。还有很多不足。 做了一周多,有个问题一直没

我的第一次份实习工作-iOS实习生-公司使用过的软件

bittorrentsync 素材,文件同步软件 cornerstone svn 软件开发合作 mark man 测量坐标的软件 SQLLite Manager 数据库操作软件

我的第一次份实习工作-iOS实习生-第二个月

第二个月 来公司过了一个月了。每天早上9点上班,到晚上6.30下班,上下班要指纹打卡,第一个月忘了打卡好多次(),然后还要去补打卡单。公司这边还安排了,工资卡办理,招商银行卡。开了一次新员工大会,认识了公司的一些过往,公司的要求等,还加了一下公司的企业QQ,还有其他的羽毛球群,篮球群。我加了下羽毛球群,也去打了一两次。第二个月的感受,感觉跟组里面的交流跟沟通都好少,基本上还有好多人不认识。想想也

我的第一次份实习工作-iOS实习生-第一个月

实习时间:2015-08-20 到 2015-12-25  实习公司;福建天棣互联有限公司 实习岗位:iOS开发实习生 第一个月: 第一天来公司,前台报道后,人资带我去我工作的地方。到了那,就由一个组长带我,当时还没有我的办公桌,组长在第三排给我找了一个位置,擦了下桌子,把旁边的准备的电脑帮我装了下,因为学的是iOS,实习生就只能用黑苹果了,这是我实习用的电脑。 帮我装了一下电脑后,开机

iOS如何隐藏系统状态栏

这里主要说明一下iOS7系统给状态栏的适配及隐藏带来的改变。 变化一: 不隐藏状态栏的情况下,StatusBar会直接显示在当前页面上,当前页面的会延伸到 StatusBar下方,顶到最上头。 这种显示方式在iOS7上是无法改变的,也无法通过设置或者配置类达到iOS6的状态栏效果。       所以在iOS7上进行页面布局的时候要考虑