半生听风吟 2025-09-25 10:00 采纳率: 98.7%
浏览 6
已采纳

易语言如何检测QQ进程判断登录状态?

如何通过易语言检测QQ进程并准确判断用户登录状态?常见问题在于仅通过“qq.exe”进程存在与否判断登录,容易误判(如进程残留或双开QQ)。此外,部分新版QQ采用子进程分离或加密通信,导致主进程存在但实际未登录。如何结合窗口句柄、内存特征码或网络连接状态实现精准识别?
  • 写回答

1条回答 默认 最新

  • 璐寶 2025-09-25 10:01
    关注

    一、基础检测:通过进程名判断QQ运行状态

    最简单的检测方式是通过枚举系统进程,查找是否存在名为“qq.exe”的进程。易语言中可通过调用API函数CreateToolhelp32Snapshot实现进程遍历。

    .版本 2
    .子程序 检测QQ进程, 逻辑型
    .局部变量 快照句柄, 整数型
    .局部变量 进程信息, 进程信息数据结构
    快照句柄 = CreateToolhelp32Snapshot (#TH32CS_SNAPPROCESS, 0)
    如果真 (快照句柄 ≠ 0)
        进程信息.长度 = 296
        如果真 (Process32First (快照句柄, 进程信息))
            循环首 ()
                如果真 (到文本 (进程信息.可执行文件名) = “qq.exe”)
                    CloseHandle (快照句柄)
                    返回 (真)
                结束如果
                如果真 (Process32Next (快照句柄, 进程信息) = 假)
                    跳出循环
                结束如果
            循环尾 ()
        结束如果
        CloseHandle (快照句柄)
    结束如果真
    返回 (假)

    此方法实现简单,但存在明显缺陷:无法区分进程残留(僵尸进程)或双开实例中的未登录状态。

    二、进阶识别:结合窗口句柄与类名进行状态验证

    QQ在登录后会创建特定的主窗口,其类名通常为“TXGuiFoundation”。通过FindWindowEnumWindows枚举窗口可进一步确认用户是否真正进入主界面。

    窗口类名对应状态
    TXGuiFoundation主程序已启动
    QQMainForm已登录主界面
    QQLoginWin正在登录中
    无匹配窗口未登录或已退出

    示例代码片段:

    .子程序 是否存在QQ登录窗口, 逻辑型
    .局部变量 窗口句柄, 整数型
    窗口句柄 = FindWindow (“TXGuiFoundation”, )
    返回 (窗口句柄 ≠ 0 且 IsWindowVisible (窗口句柄))

    该方法可有效排除仅运行后台进程但未打开UI的情况。

    三、深度分析:内存特征码扫描定位登录凭证

    新版QQ采用多进程架构,主进程可能不包含登录信息。需附加到子进程(如“QQProtect.exe”或“QQExternal.exe”)并扫描内存中固定偏移处的特征码。

    1. 使用OpenProcess获取目标进程句柄
    2. 调用ReadProcessMemory读取内存段
    3. 搜索特征签名(如“QQToken@”或加密Session Key前缀)
    4. 校验特征码有效性与时效性
    5. 结合CRC32或MD5哈希比对防止误匹配
    6. 定期轮询更新状态以应对动态内存布局

    注意:需处理ASLR(地址空间布局随机化)和DEP(数据执行保护)等安全机制。

    四、网络层验证:监控QQ相关网络连接状态

    真实登录状态下,QQ客户端会建立与腾讯服务器的稳定TCP连接。可通过GetTcpTableiphlpapi.dll获取当前连接列表。

    .子程序 获取QQ网络活动, 逻辑型
    .局部变量 表, TCP连接表
    .局部变量 i, 整数型
    表 = 取TCP连接表 ()
    循环首 (i = 1 到 表.数量)
        如果真 (表[i].本地端口 ∈ (4000, 8000, 51000) 且 表[i].状态 = “ESTABLISHED”)
            如果真 (解析IP归属地为腾讯云或深圳机房)
                返回 (真)
            结束如果
        结束如果
    循环尾 ()
    返回 (假)

    此方法能有效识别“假在线”或离线挂机行为。

    五、综合判定模型:多维度融合判断策略

    单一维度易受干扰,建议构建加权评分系统:

    graph TD A[开始] --> B{存在qq.exe?} B -- 否 --> C[未运行] B -- 是 --> D{存在TXGuiFoundation窗口?} D -- 否 --> E[进程残留/后台守护] D -- 是 --> F{内存含Token特征?} F -- 否 --> G[未登录] F -- 是 --> H{有活跃TCP连接?} H -- 否 --> I[疑似异常登录] H -- 是 --> J[已登录]

    最终状态由多个信号共同决定,提升准确率至98%以上。

    六、反规避设计:应对新版QQ的加密与分离架构

    现代QQ采用以下技术增加检测难度:

    • 子进程沙箱化:登录逻辑移至独立可信进程
    • 内存混淆:关键数据频繁加密/解密
    • 通信隧道化:使用TLS封装IM流量
    • 热补丁机制:运行时动态替换函数体

    应对策略包括:

    1. Hook关键API(如send, recv)捕获明文通信
    2. 使用驱动级访问绕过用户态保护
    3. 模拟鼠标键盘事件触发UI响应以验证活性
    4. 结合OCR识别验证码弹窗状态

    此类方案需谨慎使用,避免违反软件许可协议。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 9月25日