新手向|LE 手游助手逆向分析:反调试机制与关键检测点解析
LE新版手游助手分析交流文档
LE 新版手游助手分析文档(QuickAssistant 2.0.1.1)
一、目标软件与研究背景
软件信息
|
项目 |
内容 |
|
名称 |
QuickAssistant 2.0.1.1 |
|
类型 |
Android 实时投屏 / 控制工具(Qt 程序,USB / libusb / 驱动) |
|
GitHub |
本次分析 已取得作者明确授权,仅用于学习、研究与技术交流,不涉及任何商业用途,也不会提供或传播可执行程序、补丁或破解成品。
研究目的
- 分析异常退出、蓝屏、反调试行为
- 理解用户态 (R3) 与内核态 (R0) 交互、驱动检测、反分析机制
- 对比原版 QtScrcpy / LE 助手,定位二次开发新增逻辑
项目概述
对一款商业化Android投屏工具(QuickAssistant 2.0.1.1)进行了完整的逆向工程分析,该软件集成了多层安全验证机制,包括时间授权、反调试、硬件指纹和驱动级保护。
软件展示:
分析之后:无需登录正常使用所有功能
技术挑战
- 多层防护体系:应用层、系统API层、内核驱动层协同防护
- 动态检测机制:运行时环境监控与异常行为检测
- 复杂验证逻辑:时间授权、硬件绑定、调试环境的多维验证
- 反分析技术:多种反调试、反逆向技术的组合应用
关键技术分析
- 验证机制架构分析
- 识别并分析了基于Qt框架的时间授权验证系统
- 解析了用户态-内核态通信模型(DeviceIoControl/Nt API)
- 揭示了硬件指纹采集与验证的完整流程
- 安全防护技术研究
- Windows NT Native API在安全防护中的应用(NtSetInformationThread等)
- 多线程环境下的实时监控与检测机制
- 异常处理链的干扰与保护技术
- 系统级交互分析
- 驱动通信协议与IOCTL控制码解析
- 进程间通信(管道/共享内存)的安全实现
- 系统服务调用的监控与拦截点分析
分析方法与工具链
- 静态分析:IDA Pro/Ghidra二进制分析,PE结构解析
- 动态调试:x64dbg/Cheat Engine运行时分析
- 系统监控:Process Monitor/API Monitor系统调用跟踪
- 流量分析:Wireshark网络通信分析(预留验证通道)
技术成果
- 完整的安全架构图:绘制了从应用层到驱动层的防护体系
- 关键技术实现文档:详细记录了各验证点的实现原理
- 分析方法论总结:形成了针对多层防护软件的分析流程
- 潜在攻击面分析:识别了安全机制的薄弱环节和改进方向
能力体现
- 逆向工程能力:复杂商业软件的完整逆向分析
- 系统安全理解:Windows安全机制的深度掌握
- 架构分析能力:多层安全防护体系的分析与理解
- 问题解决能力:系统性分析方法的建立与应用
- 文档编写能力:技术细节的清晰表达与结构化呈现
技术栈应用
- Windows系统编程(NT API、驱动通信)
- 二进制逆向分析(x86/x64汇编、PE格式)
- 调试技术(用户态/内核态调试)
- 安全机制(反调试、代码保护、验证体系)
二、初期现象总结(问题导向)
1️⃣ 调试异常与蓝屏
- 在调试状态下,程序可能导致 蓝屏
- 蓝屏触发点:
- 检测常用调试器模块
- R3 ↔ R0 驱动交互
- 执行特权相关操作 → 系统崩溃
- 判断:属于刻意的反调试/反分析逻辑
2️⃣ 程序行为异常
- 即使绕过调试:
- 程序能运行一段时间
- 后续无提示退出
- 调用链发现:
- ntdll!NtTerminateProcess
- kernel32!ExitProcess
- 结论:逻辑自杀 / 条件退出,而非崩溃
三、静态分析(IDA Pro)
1️⃣ 导入表与关键 API
- 关键 API:
- DeviceIoControl
- NtSetInformationThread
- NtCreateFile
- NtDeviceIoControlFile
- FindWindow
- 说明:
- 用户态 → 驱动通信能力
- 系统级反调试能力
2️⃣ 反调试 API / 字符串
- API 检测:
- IsDebuggerPresent
- CheckRemoteDebuggerPresent
- NtQueryInformationProcess(ProcessDebugPort / ProcessDebugFlags / ProcessDebugObjectHandle)
- 窗口级:
- 进程枚举:
- CPU / 寄存器检测:
- 异常干扰:
- EXCEPTION_SINGLE_STEP
- 内存不可执行(NX)
- 人为制造 0xC0000005
3️⃣ 驱动 / 设备交互线索
- 关键设备 / 管道:
- \\.\pipe\libwdi-installer
- \\.\pipe\crashpad_%lu_
- 说明:
- libusb、USB 枚举、Crashpad 日志收集
- 自定义驱动或安装器存在
- NtDeviceIoControlFile 调用:
- 检测异常来源 → 驱动层非当前突破口
四、运行时与线程分析
1️⃣ 用户态线程
- 主线程:
- ntdll!RtlUserThreadStart
- kernel32!BaseThreadInitThunk
- ntdll!KiUserExceptionDispatcher
- 异常类型:
- EXCEPTION_SINGLE_STEP
- EXCEPTION_ACCESS_VIOLATION
- NX 执行异常
- 说明:程序主动制造异常干扰调试器
2️⃣ Qt 生命周期
- Qt 主循环:
- QApplication::exec()
- 布局字符串:QLayout: Attempting to add QLayout "%ls"
- 说明:反调逻辑嵌入 Qt 程序生命周期
五、动态行为分析(火绒剑观察)
- 程序后台启动 WMIC.exe
- 用途:
- 收集硬件信息
- 查询注册表 / WMI
- 生成环境指纹
- 效果:
- 驱动不存在 / 调试被发现 → 程序自杀 (ExitProcess)
- 判断:WMIC 是二次开发新增环节
# WMIC可能收集的信息类型
WMIC_QUERIES = {
"bios": "wmic bios get SerialNumber", # BIOS序列号
"baseboard": "wmic baseboard get Product,SerialNumber", # 主板信息
"cpu": "wmic cpu get ProcessorId", # CPU ID
"diskdrive": "wmic diskdrive get SerialNumber", # 硬盘序列号
"os": "wmic os get SerialNumber", # Windows序列号
"nic": "wmic nic get MACAddress", # 网卡MAC
"computersystem": "wmic computersystem get UUID" # 系统UUID
}
# 这些信息组合生成硬件指纹,用于授权绑定
六、对比分析
- 原版 QtScrcpy 与 LE 助手对比:
- Qt 主流程一致
- 新增反调逻辑 / WMIC / 驱动交互为二次开发新增
- 字符串冲突:
- "This software is completely open source" → 行为不一致
- 结论:
- 问题不在原项目
- 二次开发者增加“恶心人的反调逻辑”
七、试用时间与卡密登录校验分析
1️⃣ 关键对象与字段
2️⃣ 调试 / 修改建议
- Qt 常用时间 API:
- QDateTime::currentDateTime()
- QDateTime::currentSecsSinceEpoch()
- QElapsedTimer
- std::chrono
- 实战:
- 给这些函数下断
- 回溯调用栈
- 定位谁在读取“当前时间”
- 此处很巧的是验证时间与登录状态耦合性很高,均在这个函数内;无需再进行单独分析是否登录
八、阶段性总结
- 反调试机制多层
- API 检测、线程隐藏、异常干扰
- 驱动通信 + WMIC 环境指纹
- 非壳化,而是“堆量型反调试”
- 逻辑分散
- 目的:干扰调试、绕分析
- 试用时间判断点
- TrialManager → UserController::overstepTrialTime → UI/日志
- 核心逻辑可通过修改返回值或拦截时间 API 控制
九、实战建议(逆向 / 调试)
- 断点策略
- 条件断点:overstepTrialTime() 返回值 / 试用时间字段
- 时间 API:QDateTime、std::chrono、QElapsedTimer
- 线程分析
- 确认线程 ID / 调用栈
- 断在后台线程也能捕获逻辑
- 返回值拦截
- 直接写寄存器 / 栈 → 强制 false
- 动态行为监控
- WMIC / 驱动交互 → 可记录 / 阻断
┌───────────────────────────────┐
│ 程序启动 / 主线程 │
│ QApplication::exec() │
└─────────────┬─────────────────┘
│
▼
┌───────────────────────────────┐
│ 线程隐藏 / 异常干扰 │
│ - NtSetInformationThread │
│ - EXCEPTION_SINGLE_STEP │
│ - NX / 人为 0xC0000005 │
└─────────────┬─────────────────┘
│
▼
┌───────────────────────────────┐
│ 反调试初始化(API + 窗口) │
│ - IsDebuggerPresent │
│ - CheckRemoteDebuggerPresent │
│ - NtQueryInformationProcess │
│ - FindWindow("OLLYDBG") │
└─────────────┬─────────────────┘
│
▼
┌───────────────────────────────┐
│ 驱动 / USB / WMIC 检测 │
│ - DeviceIoControl │
│ - NtDeviceIoControlFile │
│ - libusb / Crashpad / WMIC │
│ - 特权指令 / 硬件指纹收集 │
└─────────────┬─────────────────┘
│
▼
┌───────────────────────────────┐
│ 检测调试 / 驱动失败 │
│ 条件退出 │
│ - ExitProcess / NtTerminateProcess
└─────────────┬─────────────────┘
│
▼
┌───────────────────────────────┐
│ 试用时间判定流程 │
│ 1️⃣ TrialManager 对象 │
│ - trialTime / endtime │
│ 2️⃣ UserController::overstepTrialTime │
│ - 返回 true → 超时 │
│ - 返回 false → 未超 │
│ 3️⃣ UI / 日志输出 │
│ - "Account has expired" │
│ - "Left trial time: %1" │
└─────────────┬─────────────────┘
│
▼
┌───────────────────────────────┐
│ 核心操作 / 功能执行 │
│ - Android 投屏 / 控制逻辑 │
│ - Qt 主事件循环 / 布局 │
└───────────────────────────────┘










尝试修改不同参数查看运行结果
浙公网安备 33010602011771号