跳到主要内容
版本:3.0.3

🪝 设备伪装模块

设备伪装模块 - specs

限制
  • 受限于你所在地区的法律法规,你可能无法取得、使用此模块。
  • 无法在受到著作权保护的 App 中调用(你只能在自己开发的 App 中调用它们)。
提示
  • 此模块支持以 OpenAPI 方式独立调用。
  • 此模块 不包含 反越狱检测功能。

生成随机伪装参数 (specs.generate)

声明

伪装参数表, 失败原因 = specs.generate {
-- 二选一
bundleIdentifier = 标识符,
bundleIdentifiers = { 标识符, 标识符1, 标识符2, ... },
-- 可选参数
country = 国家代码,
preferredLanguage = 语言代码,
includedDevices = 设备型号列表,
includedOperatingSystems = 操作系统版本列表,
useSmartLocation = 是否启用智能定位,
preferredCarriers = 运营商名称列表,
}

参数及返回值

  • 标识符
  • 国家代码
    • 文本型可选,请参阅 ISO 3166-1 alpha-2。若留空,则按大致人口数量为权重,加权随机选取国家
  • 语言代码
    • 文本型可选,请参阅 ISO 639-1。默认为 国家代码 的首选语言代码
  • 设备型号列表
    • 文本型顺序表可选,将从此列表中随机选择一个设备型号,例如 { "iPhone10,1", "iPhone10,4", ... }
    • 顺序表可选,将从此列表中加权随机选择一个设备型号,格式为:
    {
    -- 型号,权重
    -- iPhone 8
    { ["iPhone10,1"] = 0.2,
    ["iPhone10,4"] = 0.3 },
    -- iPhone 8 Plus
    { ["iPhone10,2"] = 0.2,
    ["iPhone10,5"] = 0.3 },
    -- iPhone X
    { ["iPhone10,3"] = 0.4,
    ["iPhone10,3"] = 0.6 },
    -- Other Devices
    ...
    }
  • 操作系统版本列表
    • 文本型顺序表可选,将从此列表中随机选择一个 iOS 版本,支持通配符 *。例如 { "13.4", "14", "15*", ... }
    • 顺序表可选,将从此列表中加权随机选择一个 iOS 版本,格式为:
    -- 9/9* - all versions of iOS 9.*, 9.*.*
    -- 9.0/9.1/9.1.1/9.2 - only iOS 9.0/9.1/9.1.1/9.2
    -- 9.0*/9.1*/9.2* - includes iOS 9.0/9.1/9.2/9.0.*/9.1.*/9.2.*
    -- 9.0.*/9.1.*/9.2.* - versions of iOS 9.0.*/9.1.*/9.2.*, except iOS 9.0/9.1/9.2
    -- 9.* - versions of iOS 9.*, e.g. iOS 9.0/9.1/9.2
    -- 9.*.* - versions of iOS 9.*.*, i.e. iOS 9.0.1/9.1.1/9.2.1/9.2.2
    {
    -- 版本号,权重
    -- iOS 13
    { ["13.0"] = 0.1, -- 匹配 iOS 13.0
    ["13.1*"] = 0.1, -- 匹配 iOS 13.1/13.1.1/13.1.2/13.1.3
    ["13.2.*"] = 0.1, -- 匹配 iOS 13.2.2/13.2.3,不匹配 iOS 13.2
    ["13.3.1"] = 0.1, -- 匹配 iOS 13.3.1
    ["13.4"] = 0.1 }, -- 匹配 iOS 13.4
    -- iOS 14
    { ["14"] = 0.5 }, -- 匹配 iOS 14 的所有版本
    -- iOS 15
    { ["15*"] = 0.4 }, -- 匹配 iOS 15 的所有版本
    -- Other Versions
    ...
    }
  • 是否启用智能定位
    • 布尔型可选,如果设置为 true,则返回的 伪装参数表 中将包含一个名为 Location关联表,其中的地理位置信息可另用于 gps.fake 函数。默认为 false
  • 运营商名称列表
  • 失败原因 文本型
  • 伪装参数表 关联表

伪装参数表

由于参数众多且部分参数缺少权威解释,你通常无需关注并修改此表中的字段。

{
_ = {
CreatedAt = 1672758216.496033, -- 创建时间
Identifiers = {
"com.apple.Preferences",
"com.apple.AppStore"
}, -- 关联 App 标识符
Iterations = 1, -- 迭代次数 (*)
ModifiedAt = 1672758216.496033 -- 修改时间 (*)
},
AudioSession = {
InputPort = "MicrophoneBuiltIn", -- 输入端口 (*)
OutputPort = "Speaker", -- 输出端口 (*)
OutputVolume = 0.4191359281539917 -- 输出音量 (*)
},
BnB = {
BatteryLevel = 0.28341255722442416, -- 剩余电量百分比 (*)
BatteryState = 1, -- 电池状态 (*)
BatteryStateDescription = "Unplugged", -- 电池状态描述 (*)
BatteryTimingOffset = 1672751783.4171035, -- 电池循环偏移 (*)
BatteryTimingRoutine = 18000, -- 电池循环周期 (*)
BootTime = 1668262388, -- 启动时间戳 (*)
ScreenBrightness = 0.64934379424651711, -- 屏幕亮度百分比 (*)
SysUptimeOffset = 44204 -- 设备启动秒数 (*)
},
GameKit = {
Alias = "Sabrina",
DisplayName = "Sabrina",
GamePlayerID = "327401709",
PlayerID = "161612537",
TeamPlayerID = "171286256"
},
General = {
BatteryCapacity = 1.96, -- 电池容量(安时)
BatterySerial = "8KYUW1X4KEXH4WV8C", -- 电池序列号
BluetoothMAC = "00:f4:b9:e7:db:14", -- 蓝牙 MAC
BuildVersion = "15B202", -- iOS 构建号
CPU = {
Arch = "arm64", -- CPU 指令集
Code = "T8010", -- CPU 代号
Cores = 4, -- CPU 核心数
Family = 1741614739,
SubType = 1,
Type = 16777228
},
DeviceName = "iPhone", -- 产品名称
ECID = "3483265919445",
EID = "89030299380567233565840920250423",
HasFaceID = false, -- 是否有面容 ID
HasTouchID = true, -- 是否有触控 ID
HostName = "Sabrina’s iPhone", -- 设备名称
HWModel = "D10AP", -- 硬件型号
HWTargetType = "D10",
I18N = {
ISOCountryCode = "US", -- 国家代码
LocaleIdentifier = "en_US", -- 区域代码
LocaleLanguageCode = "en", -- 语言代码
LocaleLanguageIdentifier = "en-US", -- 方言代码
LocalizedCountryName = "United States", -- 国家名称
LocalizedLocaleLanguageName = "English",
LocalizedLocaleName = "English (United States)",
Timezone = "America/Nome", -- 时区代码
TimezoneAbbreviation = "AKST", -- 时区缩写
TimezoneOffsetInMinutes = -540 -- 时区偏移分钟数
},
IDFA = "AA98AA88-39E3-4D66-97D3-53605C556496",
IDFV = "4CED7CC5-A5B1-489A-B8D0-B5086D9ACC30",
Kernel = {
Release = "17.2.0", -- 内核版本
Version = "Darwin Kernel Version 17.2.0: Fri Sep 29 18:14:51 PDT 2017; root:xnu-4570.20.62~4/RELEASE_ARM64_T8010"
},
MarketingDeviceName = "iPhone 7", -- 产品营销名称
MarketingProductName = "iOS",
Memory = {
Capacity = 2, -- 运存容量(GB)
Size = 2049063785, -- 运存容量(字节)
UserSize = 1831088705 -- 可用容量(字节)
},
MLBSerialNumber = "LKQQ72U6MKZ4PZR42", -- 主板序列号
ModelNumber = "D10AP", -- 型号
PlatformUUID = "0E58D8B7-87C2-406A-8613-7785D3E9AB49",
ProductName = "iPhone OS",
ProductType = "iPhone9,1", -- 设备代码
ProductVersion = "11.1.2", -- iOS 版本
Screen = {
Bounds = {
Height = 667,
Width = 375
}, -- 屏幕宽高
InnerBounds = {
Height = 553,
Width = 375
}, -- 浏览器内宽高
NativeBounds = {
Height = 1334,
Width = 750
}, -- 物理分辨率
NativeScale = 2, -- 物理缩放比例
OuterBounds = {
Height = 667,
Width = 375
}, -- 浏览器外宽高
Scale = 2 -- 逻辑缩放比例
},
SEID = "15c30eca96577937d43e1b76c6fc91963200e566287b0013",
SerialNumber = "F2YC5WAQHG7G", -- 序列号
Storage = {
Capacity = 128, -- 存储容量
SpaceAll = 118.46553209710888, -- 存储空间(字节)(*)
SpaceLeft = 88.77200326453243 -- 剩余存储空间(字节)(*)
},
UDID = "e68e0b9effb70ab1190653c1be45bccf4cf171f5",
UserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_1_2 like Mac OS X) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0 Mobile/15B202 Safari/604.1", -- 浏览器 User-Agent
WiFiMAC = "00:f4:b9:39:9e:16" -- 无线网卡 MAC
},
Location = {
Altitude = 208.17298889160199, -- 海拔高度(米)
City = "Naperville", -- 城市名称
Country = "United States", -- 国家名称
Latitude = 41.7483, -- 纬度
Longitude = -88.165700000000001, -- 经度
Province = "Illinois", -- 行政区名称
SmartDeviation = {
H = 2000,
V = 10
} -- 智能偏移(米)
},
MGCopyAnswer = {
ArtworkTraits = {
ArtworkDeviceIdiom = "phone",
ArtworkDeviceProductDescription = "iPhone 7",
ArtworkDeviceScaleFactor = 2,
ArtworkDeviceSubType = 2436,
ArtworkDisplayGamut = "P3",
ArtworkDynamicDisplayMode = 0,
CompatibleDeviceFallback = "iPhone9,1",
DevicePerformanceMemoryClass = 4,
GraphicsFeatureSetClass = "APPLE3",
GraphicsFeatureSetFallbacks = "APPLE3v1:APPLE2:APPLE1:GLES2,0"
},
RegionCode = "LL", -- 销售区域代号
RegionInfo = "LL/A", -- 销售版本代号
SupportsForceTouch = false -- 是否支持 Force Touch
},
Networking = {
BSSID = "00:08:7f:e4:44:1c", -- (*)
CarrierName = "PACE", -- 运营商名称
CellularType = 3, -- 蜂窝网络类型
CountryCode = "310", -- 国家网络代码
CurrentRadioAccessTechnology = "LTE", -- 蜂窝网络类型名称
EthernetIPv4 = "192.168.62.237", -- 以太网 IPv4 (*)
EthernetMask = "255.255.255.0", -- 以太网子网掩码 (*)
EthernetIPv6 = "fe80::aede:48ff:fe00:1122",
EthernetGatewayIPv4 = "192.168.62.1", -- 以太网默认网关 IPv4 (*)
EthernetGatewayIPv6 = "fe80::aede:48ff:fe00:1122",
DNSResolverV4 = "192.168.62.1", -- 以太网 DNSv4
DNSResolverV6 = "fe80::aede:48ff:fe00:1122",
HideVPN = true, -- 隐藏 VPN (*)
HideWiFi = true, -- 隐藏无线网络 (*)
ICCID = "90673471744445112370",
IMEI = "025508329113107",
MEID = "02550832911310",
NetworkCode = "870", -- 网络代码
NetworkType = 5, -- 网络类型
SIMStatus = "Ready", -- SIM 卡状态
SSID = "NETGEAR-1ef2f4" -- 无线网络名称 (*)
}, -- 网络相关
Notification = {
Token = "0f81ac15272e9d93099e06ba836fc4ab40e09eab2f2bc9676eb384336421148f"
} -- 推送通知相关(令牌)
}

说明

生成一套随机但比较合理的设备伪装参数。

此函数调用将优先从 设备型号列表 中选取一台随机设备,再考虑从 操作系统版本列表 中随机选取该设备可用的一个 iOS 版本。
例如,你希望从 iPhone 8 iPhone10,4iPad Air (5th generation) iPad13,16 中选取一台 iOS 13 或 iOS 15 的设备,并通过如下代码来生成一套伪装参数:

specs.generate { country = "KR", includedDevices = { "iPhone10,4", "iPad13,16" }, includedOperatingSystems = { "13", "15" } }

则生成的伪装参数的可能组合只有:

  • iPhone 8 iPhone10,4 和 iOS 13
  • iPhone 8 iPhone10,4 和 iOS 15
  • iPad Air (5th generation) iPad13,16 和 iOS 15

因为 iPad Air (5th generation) iPad13,16 的初始 iOS 版本为 15.4,所以它绝不可能搭载 iOS 13。
需要注意的是,如果指定的范围内没有该设备可用的 iOS 版本,则忽略 操作系统版本列表 参数,从该设备的历史 iOS 版本中随机选取。

警告
  • 这些参数不是真实的设备参数,仅用于测试目的。
  • 如果希望得到更好的伪装效果,建议收集并使用真实的设备参数。
  • 内建的设备参数数据集位于 /usr/local/xxtouch/etc/specs/rsc。你可以在此数据集中添加新设备、新 iOS 版本或修改现有设备的 iOS 版本。

示例

specs.generate
-- 生成一套完全随机的伪装参数
tab, err = specs.generate()
specs.generate
-- 生成一套伪装参数,设备型号为 iPhone 8 Plus,iOS 版本为 13.4 至 13.7
tab, err = specs.generate { includedDevices = {"iPhone10,2", "iPhone10,5"},
includedOperatingSystems = {"13.4*", "13.5*", "13.6*", "13.7"} }
specs.generate
specs.generate {
-- 目标 “设置” App
bundleIdentifier = "com.apple.Preferences",
-- 国家代码为美国
country = "US",
-- 偏好语言为英语
preferredLanguage = "en",
-- iPhone 12 mini, iPhone 12, iPhone 12 Pro, iPhone 12 Pro Max
includedDevices = {"iPhone13,1", "iPhone13,2", "iPhone13,3", "iPhone13,4"},
-- iOS 14 或 iOS 15
includedOperatingSystems = {"14", "15"},
-- 开启智能定位
useSmartLocation = true
}
specs.generate
specs.generate {
-- 目标 “设置” 和 “Safari” App
bundleIdentifiers = {"com.apple.Preferences", "com.apple.mobilesafari"},
-- 国家代码为澳大利亚
country = "AU",
-- 偏好语言为英语
preferredLanguage = "en",
-- iPhone 13 mini, iPhone 13, iPhone 13 Pro, iPhone 13 Pro Max
includedDevices = {
["iPhone14,2"] = 0.1, -- iPhone 13 Pro 的概率为 15%
["iPhone14,3"] = 0.15, -- iPhone 13 Pro Max 的概率为 15%
["iPhone14,4"] = 0.05, -- iPhone 13 mini 的概率为 5%
["iPhone14,5"] = 0.65 -- iPhone 13 的概率为 65%
},
-- iOS 14 或 iOS 15
includedOperatingSystems = {
["14"] = 0.2, -- iOS 14 的概率为 20%
["15"] = 0.8 -- iOS 15 的概率为 80%
},
-- 关闭智能定位
useSmartLocation = false
}

伪装设备参数到 App (specs.apply)

声明:伪装单个 App

操作成败, 失败原因 = specs.apply(伪装参数表, 标识符)

声明:批量伪装多个 App

操作成败, 失败原因 = specs.apply(伪装参数表, 标识符列表)

参数及返回值

说明

伪装设备参数到指定的一个或多个 App,传入的 伪装参数表 将在这些 App 下次启动时生效。

示例

specs.apply
-- 随机生成一套日本的设备参数,并伪装到 “设置” App
specs.apply(specs.generate { country = "JP" }, "com.apple.Preferences")
specs.apply
-- 随机生成一套法国的设备参数,并伪装到 “设置” App 和 “Safari” App
specs.apply(specs.generate { country = "FR" }, { "com.apple.Preferences", "com.apple.mobilesafari" })

查询已伪装到 App 的设备参数 (specs.select)

声明

伪装参数表, 失败原因 = specs.select(标识符)

参数及返回值

说明

获取曾经通过 specs.apply 伪装到指定 App 的 伪装参数表

示例

specs.select
--
-- 查询并获取伪装到 “设置” App 的设备参数表
local ok, tab, err
tab, err = specs.select("com.apple.Preferences")
--
-- 如果 “设置” App 当前未伪装任何附加的设备参数,则随机生成一套
if tab == nil then
tab = specs.generate { country = "US" }
end
--
-- 修改伪装参数表中的自定义名称,并重新执行伪装
tab.General.HostName = "Administrator’s iPhone"
ok, err = specs.apply(tab, "com.apple.Preferences")
--
-- 如果伪装失败则打印失败原因
if not ok then
print(err)
end
--
-- 以可读性更好的 YAML 格式打印伪装参数表
print(yaml.dump(tab))
提示

YAML 模块的使用方法请参考 属性表模块

获取已伪装的 App 标识符列表 (specs.list)

声明

{
Bundles = 标识符列表,
Executables = 进程名称列表
}, 失败原因 = specs.list()

参数及返回值

  • 标识符列表
  • 进程名称列表
    • 文本型顺序表,已伪装的服务进程名称(通常不需要关注)
  • 失败原因 文本型

说明

此函数调用仅返回已伪装的 App 标识符列表,不会返回详细的伪装参数表。

示例

specs.list
local bundles, err = specs.list()
bundles = bundles.Bundles
print("已伪装的 App 标识符列表:")
for i, bundle in ipairs(bundles) do
print(i, bundle)
end

推演已伪装到 App 的设备参数 (specs.update)

声明:推演单个 App

操作成败, 失败原因 = specs.update(标识符)

声明:批量推演多个 App

操作成败, 失败原因 = specs.update(标识符列表)

参数及返回值

  • 标识符
  • 标识符列表 文本型顺序表
  • 失败原因 文本型
  • 操作成败 布尔型

说明

此函数调用将自动更新已经伪装到指定的一个或多个 App 的 伪装参数表伪装参数表 中标有 (*) 的字段将随着时间推移按照预先设置的规律发生变化(推演),包括电池剩余电量增加或减少、屏幕亮度改变、输出音量改变或存储剩余空间变化等。

推演后的效果将在这些 App 下次启动时生效。

移除已伪装到 App 的设备参数 (specs.remove)

声明:移除单个 App

操作成败, 失败原因 = specs.remove(标识符)

声明:批量移除多个 App

操作成败, 失败原因 = specs.remove(标识符列表)

参数及返回值

  • 标识符
  • 标识符列表 文本型顺序表
  • 失败原因 文本型
  • 操作成败 布尔型

说明

移除已经伪装到指定的一个或多个 App 的 伪装参数表。这些 App 下次启动时将不再执行任何伪装。

清空所有伪装参数 (specs.truncate)

声明

操作成败, 失败原因 = specs.truncate()

参数及返回值

  • 失败原因 文本型
  • 操作成败 布尔型

说明

经过伪装的 App 下次启动时将不再执行任何伪装。