freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

    windows10 19H1中冷门的反调试方法 金币
    2021-01-10 00:37:39

    windows 19H1中PsSuspendProcess新加了一点代码:

    1610210043_5ff9dafbe8a318c3037ca.png!small

    以前的是没有的:

    1610210001_5ff9dad11e7c31e16e7eb.png!small?1610210002258

    if ( !targetThread->Tcb.MiscFlags.BypassProcessFreeze )

    总所周知 调试器都要用这个函数挂起线程、进程
    因此如果我们给线程设置一个参数(THREAD_CREATE_FLAGS_BYPASS_PROCESS_FREEZE为0x40):

    NtCreateThreadEx(&handle, MAXIMUM_ALLOWED, nullptr, NtCurrentProcess(),
                     &printer, nullptr, THREAD_CREATE_FLAGS_BYPASS_PROCESS_FREEZE,
                     0, 0, 0, nullptr);

    那么这个线程将无法暂停!
    那么 如何利用为反调试呢?
    继续看KeSuspendThread:

    1610210122_5ff9db4acfb7129cc2646.png!small

    可以看到 Thread->Tcb.SuspendCount 在成功暂停线程的时候会增加! 也就是说我们可以利用那个新的flag阻止线程暂停 这样子这个count就不会增加 当调试器调用NtResumeProcess的时候 计数就会减少! 利用这一点我们就可以知道自己是否被调试:

    for(size_t i = 0; i < 128; ++i)
      NtSuspendThread(thread, nullptr);
    
    while(true) {
      if(NtSuspendThread(thread, nullptr) != STATUS_SUSPEND_COUNT_EXCEEDED)
        std::puts("I was suspended\n");
      Sleep(1000);
    }

    本文作者:, 转载请注明来自FreeBuf.COM

    被以下专辑收录,发现更多精彩内容
    + 收入我的专辑
    评论 按时间排序

    登录/注册后在FreeBuf发布内容哦

    相关推荐
    • 0 文章数
    • 0 评论数
    • 0 关注者
    登录 / 注册后在FreeBuf发布内容哦
    收入专辑