-
-
[原创]新手向|LE手游助手 手工逆向分析:反调试机制与关键检测点解析
-
发表于: 2天前 470
-
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二进制分析,PE结构解析
- 动态调试:x64dbg/Cheat Engine运行时分析
- 系统监控:Process Monitor/API Monitor系统调用跟踪
技术成果
- 完整的安全架构图:绘制了从应用层到驱动层的防护体系
- 关键技术实现文档:详细记录了各验证点的实现原理
- 分析方法论总结:形成了针对多层防护软件的分析流程
能力体现
- 逆向工程能力:复杂商业软件的完整逆向分析
- 系统安全理解:Windows安全机制的深度掌握
- 架构分析能力:多层安全防护体系的分析与理解
- 问题解决能力:系统性分析方法的建立与应用
技术栈应用
- Windows系统编程(NT API、驱动通信)
- 二进制逆向分析(x86/x64汇编、PE格式)
- 调试技术(用户态/内核态调试)
- 安全机制(反调试、代码保护、验证体系)
二、初期现象总结(问题导向)
1️⃣ 调试异常与蓝屏
- 在调试状态下,程序可能导致 蓝屏
- 蓝屏触发点:
- 检测常用调试器模块
- R3 ↔ R0 驱动交互
- 执行特权相关操作 → 系统崩溃
- 判断:属于刻意的反调试/反分析逻辑
2️⃣ 程序行为异常
- 即使绕过调试:
- 程序能运行一段时间
- 后续无提示退出
- 调用链发现:
ntdll!NtTerminateProcesskernel32!ExitProcess
- 结论:逻辑自杀 / 条件退出,而非崩溃
三、静态分析(IDA Pro)
1️⃣ 导入表与关键 API
- 关键 API:
DeviceIoControlNtSetInformationThreadNtCreateFileNtDeviceIoControlFileFindWindow
- 说明:
- 用户态 → 驱动通信能力
- 系统级反调试能力
2️⃣ 反调试 API / 字符串
- 反调试API
NtSetInformationThread→ThreadHideFromDebugger
- 关键字符串示例:
"noUsbDebugMode"
- API 检测:
IsDebuggerPresentCheckRemoteDebuggerPresentNtQueryInformationProcess(ProcessDebugPort/ProcessDebugFlags/ProcessDebugObjectHandle)
- 窗口级:
FindWindow("OLLYDBG")、WinDbgFrameClass
- 进程枚举:
CreateToolhelp32Snapshot→ 枚举 x64dbg、IDA、CheatEngine 等
- CPU / 寄存器检测:
GetThreadContext→ Dr0–Dr3、Dr6、Dr7
- 异常干扰:
EXCEPTION_SINGLE_STEP- 内存不可执行(NX)
- 人为制造
0xC0000005
3️⃣ 驱动 / 设备交互线索
- 关键设备 / 管道:
\\.\pipe\libwdi-installer\\.\pipe\crashpad_%lu_\\.\libusb0-%04u
- 说明:
- libusb、USB 枚举、Crashpad 日志收集
- 自定义驱动或安装器存在
- NtDeviceIoControlFile 调用:
- 检测异常来源 → 驱动层非当前突破口
四、运行时与线程分析
1️⃣ 用户态线程
- 主线程:
ntdll!RtlUserThreadStartkernel32!BaseThreadInitThunkntdll!KiUserExceptionDispatcher
- 异常类型:
EXCEPTION_SINGLE_STEPEXCEPTION_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️⃣ 关键对象与字段
层次 | 对象 / 字段 | 用途 |
管理层 |
, , | 存储试用状态、时间字段 |
判定层 |
| 判断是否过期 |
结果层 |
, , | UI / 日志显示 / 状态消费 |
2️⃣ 调试 / 修改建议
- Qt 常用时间 API:
QDateTime::currentDateTime()QDateTime::currentSecsSinceEpoch()QElapsedTimerstd::chrono
- 实战:
- 给这些函数下断
- 回溯调用栈
- 定位谁在读取“当前时间”
- 可直接修改
UserController::overstepTrialTime返回值

尝试修改不同参数查看运行结果
- 此处很巧的是验证时间与登录状态耦合性很高,均在这个函数内;无需再进行单独分析是否登录
八、阶段性总结
反调试机制多层- API 检测、线程隐藏、异常干扰
- 驱动通信 + WMIC 环境指纹
- 逻辑分散
- 目的:干扰调试、绕分析
TrialManager→UserController::overstepTrialTime→ UI/日志- 核心逻辑可通过修改返回值或拦截时间 API 控制
九、实战建议(逆向 / 调试)
断点策略- 条件断点:
overstepTrialTime()返回值 / 试用时间字段 - 时间 API:QDateTime、std::chrono、QElapsedTimer
- 确认线程 ID / 调用栈
- 断在后台线程也能捕获逻辑
- 直接写寄存器 / 栈 → 强制
false
- WMIC / 驱动交互
赞赏
赞赏
雪币:
留言: