对macho文件有一定理解后,了解下optool是如何给macho文件增加动态库等功能的

optool 源码

环境

macOS 13.4 (22F66)
Xcode 14.3.1

0x0 编译

下载源码

1
$ git clone --recurse-submodules https://github.com/alexzielenski/optool.git

修改下Deployment Target,比如改成11.0,不修改会报

阅读更多

Mach-O基本结构

  1. Header: :文件类型、目标架构类型等
  2. Load Commands:描述文件在虚拟内存中的逻辑结构、布局
  3. Data: 在Load commands中定义的Segment的数据

阅读更多

仅记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<dict>
<key>URL</key>
<string>http://dev.skyfox.org/udid/receive.php</string> <!--接收数据的接口地址-->
<key>DeviceAttributes</key>
<array>
<string>UDID</string>
<string>IMEI</string>
<string>ICCID</string>
<string>VERSION</string>
<string>PRODUCT</string>
</array>
</dict>
<key>PayloadOrganization</key>
<string>dev.skyfox.org</string> <!--组织名称-->
<key>PayloadDisplayName</key>
<string>查询设备UDID</string> <!--安装时显示的标题-->
<key>PayloadVersion</key>
<integer>1</integer>
<key>PayloadUUID</key>
<string>3C4DC7D2-E475-3378-489C-0BB8D737A653</string> <!--自己随机填写的唯一字符串-->
<key>PayloadIdentifier</key>
<string>dev.skyfox.profile-service</string>
<key>PayloadDescription</key>
<string>本文件仅用来获取设备ID</string> <!--描述-->
<key>PayloadType</key>
<string>Profile Service</string>
</dict>
</plist>

Socket

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

大部分系统都提供了一组基于TCP或者UDP的应用程序编程接口(API),该接口通常以一组函数的形式出现,也称为套接字(Socket)

阅读更多

前言

  平常用的颜色宏大概如下

1
#define RGBHex(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

  考虑到蓝湖中获得的十六进制颜色值为#FF0000,cv时需要先删除#再添加0x,想省略这部分

实现

  C语言宏中’#’称之为字符串化操作符(Stringizing Operator),它将函数宏的实际参数转换为对应的字符串常量。利用这个特点定义如下的颜色宏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define HEXA(COLOR,A) ({ \
char *color = #COLOR;\
NSString *colorString = [NSString stringWithUTF8String:color]; \
colorString = [colorString stringByReplacingOccurrencesOfString:@"#" withString:@""]; \
colorString = [colorString stringByReplacingOccurrencesOfString:@"0x" withString:@""]; \
unsigned int red,green,blue; \
NSRange range; \
range.length = 2; \
range.location = 0; \
[[NSScanner scannerWithString:[colorString substringWithRange:range]] scanHexInt:&red]; \
range.location = 2; \
[[NSScanner scannerWithString:[colorString substringWithRange:range]] scanHexInt:&green]; \
range.location = 4; \
[[NSScanner scannerWithString:[colorString substringWithRange:range]] scanHexInt:&blue]; \
[UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:A]; \
})

#define HEX(COLOR) HEXA(COLOR,1.0)

  支持0xFF0000/#FF0000/FF0000这三种格式

环境

macOS Mojave 10.14.3
Xcode10.1
iPhone6S 10.0.1

获得崩溃日志

方式一:Xcode

菜单 > Window > Devices and Simulators

选择设备并查看设备日志(View Device Logs)

方式二:手机

设置 > 隐私 > 诊断与用量 > 诊断与用量数据

阅读更多

前言

  以前想获取应用的 .ipa 文件可以从 iTunes 下载,macOS 上的 iTunes 升级成 12.7 后,无法再获得 .ipa 文件, 而iOS 9 后就不能从 iTools 之类的辅助工具中导出 .ipa 文件。

  后面 Apple 官网又提供了一个 12.6.3 的链接
  
  出于好奇心,想试试直接导出.ipa文件,并重签名安装到未越狱的设备上。

阅读更多

前言

最近发现 Mac 上的 iTunes 中的 AppStore 总是无法访问,出现如下三种错误

  • 400 Bad Request
  • 502
  • Your iTunes Store Session has expired (再次登陆还是报这个错)

阅读更多

导语

 

在上一篇中简单分析了 Weak 属性是如何被存储,获取和销毁的,其中的 SideTable 结构体当做黑盒进行处理。本文尝试对 SideTable 的结构进行一些分析。

观察

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct SideTable {
spinlock_t slock;
RefcountMap refcnts;
weak_table_t weak_table;

SideTable() {
memset(&weak_table, 0, sizeof(weak_table));
}

~SideTable() {
_objc_fatal("Do not delete SideTable.");
}

void lock() { slock.lock(); }
void unlock() { slock.unlock(); }
void forceReset() { slock.forceReset(); }

// Address-ordered lock discipline for a pair of side tables.

template<HaveOld, HaveNew>
static void lockTwo(SideTable *lock1, SideTable *lock2);
template<HaveOld, HaveNew>
static void unlockTwo(SideTable *lock1, SideTable *lock2);
};

SideTable 主要分为 3 部分

  • weak_table_t: weak 引用的全局 hash
  • RefcountMap : 引用计数的 hash
  • slock: 保证原子操作的自旋锁

阅读更多

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×