User32.dll!NtUserWindowFromPoint在Windows RT上由Mumble加载时损坏

时间:2013-01-28 04:37:45

标签: windows qt corruption user32 windows-rt

我正在努力将Mumble移植到Windows RT(使用越狱),而且我遇到了一个问题,即在Mumble加载时这个函数被破坏了。

Mumble(腐败功能):

  

0:000> dq user32.dll + 0x023918
  77a63918 47c30042 44696841 4770df01 0c16f241
  77a63928 4770df01 0c17f241 4770df01 0c18f241
  77a63938 4770df01 0c19f241 4770df01 0c1af241
  77a63948 4770df01 0c1bf241 4770df01 0c1cf241
  77a63958 4770df01 0c1df241 4770df01 0c1ef241
  77a63968 4770df01 0c1ff241 4770df01 5c81f44f
  77a63978 4770df01 0c21f241 4770df01 0c22f241
  77a63988 4770df01 0c23f241 4770df01 0c24f241
  0:000> u user32.dll + 0x023918
   * 错误:找不到符号文件。默认为出口符号   C:\ windows \ system32 \ user32.dll -
  USER32 WindowFromPoint:
  77a63918 6841 ldr r1,[r0,#4]
  77a6391a 4469添加r1,r1,sp
  77a6391c 0042 lsls r2,r0,#1
  77a6391e 47c3?blx r8
  77a63920 f2410c16 mov r12,#0x1016
  77a63924 df01 svc#1

TeXworks(预期输出):

  

0:000> dq user32.dll + 0x23918
  77a63918 4770df01 0c15f241 4770df01 0c16f241
  77a63928 4770df01 0c17f241 4770df01 0c18f241
  77a63938 4770df01 0c19f241 4770df01 0c1af241
  77a63948 4770df01 0c1bf241 4770df01 0c1cf241
  77a63958 4770df01 0c1df241 4770df01 0c1ef241
  77a63968 4770df01 0c1ff241 4770df01 5c81f44f
  77a63978 4770df01 0c21f241 4770df01 0c22f241
  77a63988 4770df01 0c23f241 4770df01 0c24f241
  0:000> u user32.dll + 0x23918
   * 错误:找不到符号文件。默认导出C:\ windows \ system32 \ USER32.dll的符号 -
  !USER32 WindowFromPoint:
  77a63918 f2410c15 mov r12,#0x1015
  77a6391c df01 svc#1
  77a6391e 4770 bx lr
  77a63920 f2410c16 mov r12,#0x1016
  77a63924 df01 svc#1
  77a63926 4770 bx lr
  77a63928 f2410c17 mov r12,#0x1017
  77a6392c df01 svc#1

(对于代码不那么出色的格式表示道歉,可以在此处找到窗口的屏幕截图:http://i.imgur.com/M6mLHN1.png

Mumble使用Qt(根据我的理解,由Mumble团队定制),Protobuf,Boost和OpenSSL TeXworks使用Qt

到目前为止我所做的尝试:
禁用应用程序兼容性引擎
在加载时卸载user32.dll,然后重新加载它(调用FreeLibrary 100次,然后调用LoadLibrary)
从清单中删除任何可能看起来甚至可疑的东西(来自Qt和Mumble) 删除整个清单(来自Qt和Mumble)

如果我在Mumble启动后使用cdb修补这个功能,那么所有功能都很棒,但是如果我不修补它,那么第一个执行的操作会调用该功能在崩溃中结束。打开/关闭窗口并拖动所有调用该功能,因此它对它所在的程序非常重要。

对此的任何帮助或指示都将不胜感激。

编辑:我已经验证了它在mainCRTStartup中的某些东西正在捣乱它,试图找出它到底是什么。

编辑2:发现隐藏在Mumble代码中的特定于平台的钩子导致了我的麻烦。解决。

1 个答案:

答案 0 :(得分:1)

因为我现在终于可以回答这个问题了,Mumble隐藏了一些我不知道的钩子。我定义了一个名为mainCRTStartup的自定义入口点,因此我可以逐步完成并找到内存发生变化的确切位置,这让我直接进入了钩子。

以下是我用于此的代码:

EXTERN_C int WINAPI mainCRTStartup();
void __stdcall EntryPoint()
{
    MessageBox(HWND_DESKTOP,L"Pause(Before mainCRTStartup)",L"Pause(Before mainCRTStartup",MB_OK);
    mainCRTStartup();
    ExitProcess(0);
}

这允许我在消息框中附加调试器并逐步执行mainCRTStartup,直到找到被调用的静态初始化程序来加载钩子。