浅谈 iOS Device ID 的修改

Dark side of the Force

最近有一篇 文章 介绍了如何实现 AppStore App 自动下载,笔者看后收获良多。不过文中只介绍了如何去模拟用户的操作来完成下载,并没有涉及抹机、IP 更换等内容。所以笔者打算在此分享一下自己对这些方面的经验。

FBI WARNING

  1. 以下内容可能会引起很多人不适,请读者自酌。
  2. 18 岁以下请在家长陪同下观看!
  3. 部分内容可能违反你所在地相关法律,请谨慎模仿

为什么要修改 iOS Device ID ?

修改设备唯一可识别标识可以做很多事前,比如防止根据 UUID 追踪,避免大数据「杀熟」等。但是在 iOS 设备上目前想做到修改的前提是越狱,所以为了多领几个美团红包而选择承担越狱的风险,是否值得还是要考虑清楚的。 不过在业界有大量应用这种技术的产业,比如积分墙、ASO 的刷榜…… 不过这些产业就属于 “灰黑产” 了,涉及到了原力的黑暗面,所以笔者不建议涉世不深的读者继续阅读下去。

当你凝视深渊,深渊也在凝视着你。

现状

在开始讲如何做之前,笔者决定先简单介绍一下业界现在已经能做什么:

一款常见的改机软件

如图所示,这是一款在业内非常常见的改机软件。由于作者不可考(不过理应如此,毕竟为了自己的人生安全),源码遗失已经 iOS 版本的多次更新,现在已经不值钱了。但是麻雀虽小五脏俱全,它能够修改设备的五码、机型、配置 Apple ID 和一键越狱等。 前人的成功告诉了我们这是可行的,剩下的只是模仿,因此笔者深入逆向并研究了这款软件,在当我看到了一大堆用汇编写的混淆之后…… 放弃了。 所以下面的内容都是笔者编的,大家有兴趣看个开心就好,基本上可以点关闭按钮了 (●°u°●)​ 」

如何破解一款程序?

笔者依稀记得 狗神 在他那本著名的 小黄书 中提到,逆向一款软件最重要的不是最终成品的代码,而是过程的分析与思路。所以经常可以看到一款软件的破解代码重要的也许只有两三行,但是过程有多艰辛也许只有破解者才知道。例如破解 Mac 版 QQ 音乐下载需要 VIP 权限的限制的代码也许加上注释也不到一百行:

/* How to Hook with Logos
Hooks are written with syntax similar to that of an Objective-C @implementation.
You don't need to #include <substrate.h>, it will be done automatically, as will
the generation of a class list and an automatic constructor.

%hook ClassName

// Hooking a class method
+ (id)sharedInstance {
	return %orig;
}

// Hooking an instance method with an argument.
- (void)messageName:(int)argument {
	%log; // Write a message about this call, including its class, name and arguments, to the system log.

	%orig; // Call through to the original function with its original arguments.
	%orig(nil); // Call through to the original function with a custom argument.

	// If you use %orig(), you MUST supply all arguments (except for self and _cmd, the automatically generated ones.)
}

// Hooking an instance method with no arguments.
- (id)noArguments {
	%log;
	id awesome = %orig;
	[awesome doSomethingElse];

	return awesome;
}

// Always make sure you clean up after yourself; Not doing so could have grave consequences!
%end
*/


%config(generator = internal)

#import <Foundation/Foundation.h>
#include <substrate.h>

%hook DownLoadTask

- (BOOL)checkHaveRightToDownload:(int)argument {
	return YES;
}

%end

unsigned int (*old_GetFlexBOOL)(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8);
unsigned int  new_GetFlexBOOL(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
{
  return 1;
}

%ctor {
    NSLog(@"!!!!!!inject success!!!!!!!");

    void * Symbol = MSFindSymbol(MSGetImageByName("/Applications/QQMusic.app/Contents/MacOS/QQMusic"), "_GetFlexBOOL");
    MSHookFunction(Symbol, &new_GetFlexBOOL, (void *)&old_GetFlexBOOL);
}
复制代码

而真正重要的是找出思路和逆向分析的过程,操作系统本质上也是一个软件,修改 Device ID 其实和破解一款音乐 VIP 限制本质上是一样的,只是一个只需要把 checkHaveRightToDownload 的返回值改成 YES ,另一个则需要与操作系统斗智斗勇罢了。

思路

综上所述,在我们对系统下黑手之前应该先理清思路。顺便说一句以下内容皆是我瞎编的,如有雷同实属巧合:

graph TD
A[硬件出厂获得 UUID] -->| 内核读取硬件信息 | B(XNU)
B -->| 将读取到信息写入某处 | C(经过加密处理的缓存)
C -->| 提供一系列接口供其他应用读取 | D{API}
D -->| 直接调用 | E[daemon]
D -->| 直接调用 | F[上层应用]
D -->| 再封装 | G[私有 API]
E --> | 从 deamon 读取 | F[上层应用]
G --> | 调用私有 API|F[上层应用]
复制代码

~~ 少 (bian) 女(bu)祈 (xia) 祷(qu)中(le)~~

猜你喜欢

转载自juejin.im/post/5c556ec0518825629a779a25