跳到主要内容
版本:3.0.2

🪝 设备伪装模块

设备伪装模块 - 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"
},
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",
BuildVersion = "15B202",
CPU = {
Arch = "arm64",
Code = "T8010",
Cores = 4,
Family = 1741614739,
SubType = 1,
Type = 16777228
},
DeviceName = "iPhone",
ECID = "3483265919445",
EID = "89030299380567233565840920250423",
HasFaceID = false,
HasTouchID = true,
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,
Size = 2049063785,
UserSize = 1831088705
},
MLBSerialNumber = "LKQQ72U6MKZ4PZR42",
ModelNumber = "D10AP",
PlatformUUID = "0E58D8B7-87C2-406A-8613-7785D3E9AB49",
ProductName = "iPhone OS",
ProductType = "iPhone9,1",
ProductVersion = "11.1.2",
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",
WiFiMAC = "00:f4:b9:39:9e:16"
},
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
},
Networking = {
BSSID = "00:08:7f:e4:44:1c", -- (*)
CarrierName = "PACE",
CellularType = 3,
CountryCode = "310",
CurrentRadioAccessTechnology = "LTE",
EthernetIPv4 = "192.168.62.237", -- (*)
EthernetMask = "255.255.255.0", -- (*)
EthernetIPv6 = "fe80::aede:48ff:fe00:1122",
EthernetGatewayIPv4 = "192.168.62.1", -- (*)
EthernetGatewayIPv6 = "fe80::aede:48ff:fe00:1122",
DNSResolverV4 = "192.168.62.1",
DNSResolverV6 = "fe80::aede:48ff:fe00:1122",
HideVPN = true, -- (*)
HideWiFi = true, -- (*)
ICCID = "90673471744445112370",
IMEI = "025508329113107",
MEID = "02550832911310",
NetworkCode = "870",
NetworkType = 5,
SIMStatus = "Ready",
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 版本中随机选取。

警告
  • 这些参数不是真实的设备参数,仅用于测试目的。
  • 如果希望得到更好的伪装效果,建议收集并使用真实的设备参数。

示例

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 下次启动时将不再执行任何伪装。