ios逆向初探

ios 信息

iOS的越狱(Jailbreaking)是指通过绕过Apple设备上的操作系统限制,从而获得对设备操作系统更深层次的访问权限的过程。这通常是为了能够安装和运行未经Apple认证的第三方应用程序和修改系统设置,提供更大的自由度。

iOS砸壳是指通过技术手段解密和破解iOS应用程序的加密保护,以便绕过App Store的审查机制,查看应用的内部代码,或修改其行为。

  1. 解密IPA文件:iOS应用程序通常以IPA文件格式存在,其中包含了应用的二进制文件、资源和相关数据。这些文件在发布到App Store之前,Apple会对其进行加密处理,以防止逆向工程和破解。砸壳的目的是通过绕过或破解这种加密,提取出应用的二进制文件。
  2. 绕过代码签名:iOS应用程序在执行时需要通过Apple的代码签名验证,确保应用来自合法开发者且未被篡改。砸壳通常包括绕过这个签名机制,使应用可以在越狱设备或非App Store渠道上运行。

ios一般逆向流程

一般来说流程为 脱壳->class-dump-抓包->逆向分析,然后分析软件的核心算法,这些步骤基本就和正常逆向区别不大了。

苹果市场会对应用进行加壳。可以使用frida进行dump脱壳。ios的一些函数可以在Apple Development上进行查找

ios用hopper可以还原出swift的伪代码,地址Linux]Hopper Disassembler v5.7.7 Full Version - 吾爱破解 - 52pojie.cn

Objective-CSwift 是两种 iOSmacOS 应用开发中常用的编程语言,它们用于编写 iOS 应用的核心代码,处理应用的逻辑、界面、与硬件的交互等功能。它们是 Apple 提供的主要编程语言,并且密切与 iOS 开发相关。

Objective-C 是 Apple 推出的传统编程语言,它基于 C 语言,并且增加了面向对象编程的特性。Objective-C 是苹果公司开发 iOSmacOS 应用的主要语言之一,直到 2014 年 Swift 发布之前,它几乎是唯一的选择。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

- (void)viewDidLoad;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"Hello, Objective-C!");
}

@end

Swift 是 Apple 于 2014 年推出的现代化编程语言,它被设计为 Objective-C 的替代品,提供了更高效、更安全、更易读的编程体验。Swift 专为开发 iOS、macOS、watchOS 和 tvOS 应用而设计,已成为 Apple 生态中首选的编程语言。

1
2
3
4
5
6
7
8
9
import UIKit

class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("Hello, Swift!")
}
}

跟java挺像的

这里使用ByteCtf的一道作为例题

Demo

看名字能知道有很多个button

bottom1

image-20250925212406499

bottom1是将随机数跟一个数比对,没什么逻辑

bottom2

image-20250925212920069

主逻辑

image-20250925213628427

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
id __cdecl -[ViewController first](ViewController *self, SEL a2)
{
return CFSTR("ffb53588");
}
id __cdecl -[ViewController second](ViewController *self, SEL a2)
{
return CFSTR("b092");
}
id __cdecl -[ViewController third](ViewController *self, SEL a2)
{
return CFSTR("bd3e");
}
id __cdecl -[ViewController fourth](ViewController *self, SEL a2)
{
return CFSTR("e777");
}
id __cdecl -[ViewController fifth](ViewController *self, SEL a2)
{
return CFSTR("a67be199da4b");
}

image-20250925213833512

1
{a67be199da4b-b092-bd3e-e777-a67be199da4b}
1
5 2 3 4 5

image-20250925214221688

这里做了置换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import hashlib
expected_segments = [
"ffb53588",
"b092",
"bd3e",
"e777",
"a67be199da4b",
]
letters_from = ["a", "b", "c", "d", "e"]
letters_to = ["b", "c", "d", "e", "f"]
template = "{{{4}-{1}-{2}-{3}-{4}}}".format(*expected_segments)
digest = hashlib.sha256(template.encode()).hexdigest()
start = 1
final_parts = []
for length, src, dst in zip(map(len, expected_segments), letters_from, letters_to):
piece = digest[start:start+length]
final_parts.append(piece.replace(src, dst))
start += length + 1
flag = "ByteCTF{" + "-".join(final_parts) + "}"
print(flag)

ByteCTF{c9838b3c-810c-b263-ee59-0b8547c09a7a}

hopper:

image-20250925215358257