【问题标题】:VirtualAllocEx throws ERROR_INVALID_HANDLEVirtualAllocEx 抛出 ERROR_INVALID_HANDLE
【发布时间】:2020-09-13 22:04:16
【问题描述】:

OpenProcess 不返回 NULL 并返回似乎是有效句柄的内容。我正在运行启用 SE_DEBUG_PRIVILEGE,因此访问级别应该没问题。有什么帮助吗?

            void* processHandle = OpenProcess(PROCESS_ALL_ACCESS, false, processID);
            printf("%p\n", processHandle);

            void* DLLPATH = VirtualAllocEx(processHandle, 0, (strlen(dllPATH) + 2), MEM_COMMIT, PAGE_READWRITE);
            printf("%p\n", DLLPATH);

这一切看起来都很好,但是 VirtualAllocEx 抛出了一个无效的句柄错误。有帮助的小伙伴吗?为响应干杯!

编辑:我调试了我正在研究的程序,发现它试图关闭我创建的类似于反作弊的句柄。这就是导致无效句柄错误的原因(据我所知)。

【问题讨论】:

  • 当我尝试在 Windows 10 x64 v1903, build 18362.836 上运行此代码时,我无法复制此代码。我正在对一个没有设置任何奇怪保护的用户模式应用程序执行此操作。您能否分享更多关于您尝试执行此操作的进程的详细信息,以及是否可能涉及任何保护,例如防病毒或反作弊模块?
  • 我正在尝试将 dll 注入一个名为 Razer Synapse Service.exe 的进程中,该进程可能对其具有某种保护,因为它在进程资源管理器中显示为红色并查看 dll 快照其中我必须以管理员身份运行 Process Explorer(顺便说一句,我以管理员身份运行注入器本身并启用了 SE_DEBUG_PRIVALEGE)。仍然没有运气。如果我不得不猜测它是某种驱动程序。但是一件奇怪的事情是,当我将文件复制到另一个位置(如桌面)时,我可以使用 x64dbg 进行调试并做一些事情。我猜它有某种保护它的签名。
  • 我通常无法使用 x64dbg btw 进行调试。
  • 首先,PROCESS_ALL_ACCESS 请求的权限太多。注入 DLL 不需要那么多权限。其次,您没有显示验证VirtualAllocEx() 正在报告ERROR_INVALID_HANDLE 的代码,您显示的代码中没有错误处理,那么您怎么知道它实际上是这样做的?据我们所知,printf() 可能会在您检索错误代码之前对其进行重置。请提供minimal reproducible example 展示您的真实代码。
  • 根据我的 Process Explorer 副本,浅红色仅表示它是 NT 服务。

标签: c++ winapi memory


【解决方案1】:

会话 0 隔离。它是一项服务,实际上不允许您从交互式会话中访问会话 0 中的进程,反之亦然。

干净的方式?将其从服务上下文中提取出来,或者自己从服务上下文中进行调试。

丑陋的方式?使用您的调试权限打开winlogon.exe,读取它的安全令牌并模拟它。该进程具有一些未记录的隐藏权限,允许它忽略会话 0 的隔离。

【讨论】:

  • 我查看了该进程的调试器并发现了类似于反作弊的东西,它调用 NtQuerySystemInformationEx 来获取句柄列表,并调用 NtQueryObject 来检查该句柄是否对该进程打开,如果是,它正在关闭它 - 这是我可以告诉的导致无效句柄错误代码的原因。感谢您的回应!
猜你喜欢
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
相关资源
最近更新 更多