前言:
因为帮朋友 需要用到 ios数据恢复软件,找了论坛一圈发现很多都不能用 但是找到一个还在更新的数据恢复软件商,
进入官网发现是海外的 还有很多比如安卓啊等等的,说明可以用我这里就下载ios的安装包
【建议大家支持正版,正版才几百块,我这里仅供技术娱乐】
正文:
下载打开了之后,丢到openclaw 他帮我自动分析 软件的基础信息
Qt C++:
├── Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll
├── libcurl.dll (网络)
├── libssl/libcrypto (OpenSSL)
└── .rcc 语言资源包
验证关键词模块 是在Framework.dll 这个文件 然后我就直接使用 DNSpy,反编译直接看代码
// 从 Framework.dll 提取的参数模板:
user_email=%1 // 用户邮箱
register_code=%1 // 注册码
hardware_info=%1 // 加密硬件指纹
product_id[0]=%1 // 产品ID(数组格式!)
user_email[0]=%1 // 邮箱(数组格式)
register_code[0]=%1 // 注册码(数组格式)
hardware_info_v2=%1 // 硬件指纹V2
platform=win // 平台标识
网络请求方面,请求了俩XML
<!-- v2 格式 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<code>0</code> <!-- 0=成功, 其他=失败 -->
<result>success</result>
</root>
<!-- v3 格式 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
<code>0</code>
<message>success</message>
<data><license>
<email>user@example.com</email>
<expire_date>2099-12-31</expire_date>
<type>full</type>
</license></data>
</response>
这里可以用到 win自带的抓包
# 执行powershell开始抓包
ipconfig /flushdns
netsh trace start capture=yes \
IPv4.Address=你的IP \
tracefile=C:\Users\Administrator\Desktop\capture.etl \
maxSize=500 fileMode=circular
启动好了之后,直接手动运行软件 在目标软件中执行注册操作, 你的桌面就会出一个 etl文件 然后ETL 转 XML
执行图中的命令,得到XML之后,就开始提取HTTPS 服务器的证书信息
原始 ETL offset 863588 解码:
Let's Encrypt ← CA机构
R13 ← 中间证书
260404064238Z ← 生效日期: 2026-04-04
260703064237Z ← 到期日期: 2026-07-03
idr.aokreg.com ← 证书CN = 真实服务器域名!
http://r13.i.****.org/ ← OCSP
当然请求抓包的时候,也能看到他的xml响应格式
<!-- v2 格式 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<code>0</code> <!-- 0=成功, 其他=失败 -->
<result>success</result>
</root>
<!-- v3 格式(更完整) -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
<code>0</code>
<message>success</message>
<data><license>
<email>user@example.com</email>
<expire_date>2099-12-31</expire_date>
<type>full</type>
</license></data>
</response>
还原硬件指纹构造
// 从 Framework.dll 的格式字符串还原:
QString strUserID = getMachineUserID(); // HKLM\.aku 或类似隐藏键
QString SN = getHardDiskSerialNumber(); // WMI Win32_DiskDrive SerialNumber
QString IDPost = generateMachineCode(); // 自定义哈希算法
// 日志输出格式:
"Reg strUserID : %s, SN : %d, IDPost : %s"
// 本机实际值示例:
userID: 57a0ab4cf9074c02a7b573646dd27abd
SN: VMWare NVME_0000
IDPost: JCCPDRGVGENUWRSUBCDUNWIAKVNPZPQS
关键回调函数定位
// Qt 信号槽机制(C++ mangled names):
AkClientAuthorization::authorizationCheckResult(int, const QString&)
↓ 触发
AkRegisterDlg::onAuthorizationCheckResult(int, const QString&)
↓ 解析 code
code == 0 → emit c_regok
code != 0 → emit c_regreject
// 主窗口也监听此信号:
AkMainWindowBase::onAuthorizationCheckResult(int, const QString&)
// 启动定时检查:
Register::startCheckRegist()
↓ 定时调用
Register::isRegisted(const QString& productId) → bool
基础分析完了之后,就开始三连拳法
拳法1:Hosts DNS 劫持(切断与真实服务器的通信)
打开本地host \System32\drivers\etc\hosts
Bypass Start
127.0.0.1 auth.example.com
127.0.0.1 verify.example.com
127.0.0.1 license.example.com
Bypass End
拳法2:本地假验证服务器(返回伪造的成功响应)
上面我说了 他有xml返回,所以我们需要构造一个服务端 拦截伪造他返回的响应
#!/usr/bin/env python3
"""通用假注册验证服务器模板"""
import http.server, json, threading, ssl, os
class FakeAuthHandler(http.server.BaseHTTPRequestHandler):
# === 编辑这里:匹配目标软件的响应格式 ===
SUCCESS_XML = '''<?xml version="1.0" encoding="UTF-8"?>
<response><code>0</code><message>success</message></response>'''
SUCCESS_JSON = {"code": 0, "message": "success", "activated": True}
def do_GET(self): self._handle()
def do_POST(self): self._handle()
def _handle(self):
cl = int(self.headers.get('Content-Length', 0))
body = self.rfile.read(cl) if cl else b''
# 打印日志(观察真实请求内容)
print(f"[{self.command}] {self.path}")
if body:
print(f" Body: {body.decode('utf-8','replace')[:300]}")
# 根据路径和Accept头选择响应格式
ct = self.headers.get('Accept','') + self.headers.get('Content-Type','')
if 'xml' in ct or '/v2/' in self.path or '/v3/' in self.path:
data = self.SUCCESS_XML.encode()
ctype = 'application/xml; charset=utf-8'
else:
data = json.dumps(self.SUCCESS_JSON).encode()
ctype = 'application/json'
self.send_response(200)
self.send_header('Content-Type', ctype)
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
self.wfile.write(data)
def log_message(self, *a): pass # 静默
def run_server(port=80):
httpd = http.server.HTTPServer(('0.0.0.0', port), FakeAuthHandler)
print(f"[Fake Server] Listening on :{port}")
httpd.serve_forever()
if __name__ == '__main__':
import sys
port = int(sys.argv[1]) if len(sys.argv) > 1 else 80
run_server(port)
拳法3:注册表/配置文件状态注入(离线回退时的激活依据)
$regPath = "HKCU:\Software\厂商名\产品名"
# === 通用激活键值(根据 Phase 3 分析结果调整)===
$values = @{
"lastshadowtime" = "1937628991" # 2031年(试用期重置)
"Registered" = "1"
"isRegistered" = "1"
"license" = "full"
"Activated" = "1"
"activationStatus" = "activated"
"regStatus" = "success"
"regDate" = "2099-12-31"
"regExpire" = "2099-12-31"
}
foreach ($k in $values.Keys) {
Set-ItemProperty -Path $regPath -Name $k -Value $values[$k] -Force
}
这里说一下为什么要打三连拳法?
只打拳法 1:demo 连不上服务器 → 如果有离线回退则读本地状态( 不行),因为有一个检测端口 在检测,他有重启验证
只打拳法 3:demo 能连上真服务器 → 真服务器返回失败 → 清除本地状态(不行)
干脆做三层 保险起见!
然后就可以看到软件激活成功!并且有了设备数
然后我提供成品工具带服务端源码:
软件下载地址.txt
(38 Bytes, 下载次数: 4)
运行启动脚本就可以了
**仅用于安全研究和学习目的**
**尊重软件开发者的劳动成果**
如果有帮到你们 请给我:关注+评分 ,你们的支持 将是我继续分享下去的动力! 谢谢 |