首页
社区
课程
招聘
[原创]新手向|LE手游助手 手工逆向分析:反调试机制与关键检测点解析
发表于: 2天前 470

[原创]新手向|LE手游助手 手工逆向分析:反调试机制与关键检测点解析

2天前
470

LE 新版手游助手分析文档(QuickAssistant 2.0.1.1)

一、目标软件与研究背景

软件信息

项目

内容

名称

QuickAssistant 2.0.1.1

类型

Android 实时投屏 / 控制工具(Qt 程序,USB / libusb / 驱动)

GitHub

barry-ran/QuickAssistant

本次分析 已取得原作者明确授权,仅用于学习、研究与技术交流,不涉及任何商业用途,也不会提供或传播可执行程序、补丁或破解成品。

研究目的

  1. 分析异常退出、蓝屏、反调试行为
  2. 理解用户态 (R3) 与内核态 (R0) 交互、驱动检测、反分析机制
  3. 对比原版 QtScrcpy / LE 助手,定位二次开发新增逻辑


项目概述

对一款商业化Android投屏工具(QuickAssistant 2.0.1.1)进行了完整的逆向工程分析,该软件集成了多层安全验证机制,包括时间授权、反调试、硬件指纹和驱动级保护。

软件展示:

分析之后:
无需登录正常使用所有功能

技术挑战

  • 多层防护体系:应用层、系统API层、内核驱动层协同防护
  • 动态检测机制:运行时环境监控与异常行为检测
  • 复杂验证逻辑:时间授权、硬件绑定、调试环境的多维验证
  • 反分析技术:多种反调试、反逆向技术的组合应用

关键技术分析

  1. 验证机制架构分析
    • 识别并分析了基于Qt框架的时间授权验证系统
    • 解析了用户态-内核态通信模型(DeviceIoControl/Nt API)
    • 揭示了硬件指纹采集与验证的完整流程
  1. 安全防护技术研究
    • Windows NT Native API在安全防护中的应用(NtSetInformationThread等)
    • 多线程环境下的实时监控与检测机制
    • 异常处理链的干扰与保护技术
  1. 系统级交互分析
    • 驱动通信协议与IOCTL控制码解析
    • 进程间通信(管道/共享内存)的安全实现
    • 系统服务调用的监控与拦截点分析

分析方法与工具链

  • 静态分析:IDA Pro二进制分析,PE结构解析
  • 动态调试:x64dbg/Cheat Engine运行时分析
  • 系统监控:Process Monitor/API Monitor系统调用跟踪

技术成果

  1. 完整的安全架构图:绘制了从应用层到驱动层的防护体系
  2. 关键技术实现文档:详细记录了各验证点的实现原理
  3. 分析方法论总结:形成了针对多层防护软件的分析流程


能力体现

  • 逆向工程能力:复杂商业软件的完整逆向分析
  • 系统安全理解: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 / 字符串

  • 反调试APINtSetInformationThreadThreadHideFromDebugger
  • 关键字符串示例:"noUsbDebugMode"
  • API 检测:
    • IsDebuggerPresent
    • CheckRemoteDebuggerPresent
    • NtQueryInformationProcessProcessDebugPort / 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!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️⃣ 关键对象与字段

层次

对象 / 字段

用途

管理层

TrialManager

, trialTime

, endtime

存储试用状态、时间字段

判定层

UserController::overstepTrialTime

判断是否过期

结果层

"Account has expired"

, "Left trial time: %1 minutes"

, "Remaining trial time: {}"

UI / 日志显示 / 状态消费

2️⃣ 调试 / 修改建议

  • Qt 常用时间 API:
    • QDateTime::currentDateTime()
    • QDateTime::currentSecsSinceEpoch()
    • QElapsedTimer
    • std::chrono
  • 实战:
    1. 给这些函数下断
    2. 回溯调用栈
    3. 定位谁在读取“当前时间”
    4. 可直接修改 UserController::overstepTrialTime 返回值


      尝试修改不同参数查看运行结果
    5. 此处很巧的是验证时间与登录状态耦合性很高,均在这个函数内;无需再进行单独分析是否登录

八、阶段性总结

反调试机制多层
    • API 检测、线程隐藏、异常干扰
    • 驱动通信 + WMIC 环境指纹
非壳化,而是“堆量型反调试”
    • 逻辑分散
    • 目的:干扰调试、绕分析
试用时间判断点
    • TrialManagerUserController::overstepTrialTime → UI/日志
    • 核心逻辑可通过修改返回值或拦截时间 API 控制

九、实战建议(逆向 / 调试)

断点策略
    • 条件断点:overstepTrialTime() 返回值 / 试用时间字段
    • 时间 API:QDateTime、std::chrono、QElapsedTimer
线程分析
    • 确认线程 ID / 调用栈
    • 断在后台线程也能捕获逻辑
返回值拦截
    • 直接写寄存器 / 栈 → 强制 false
动态行为监控
    • WMIC / 驱动交互 



传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回