0

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

Mumble(腐败功能):

0:000> DQ user32.dll中+ 0x023918
77a63918 47c30042 44696841 4770df010c16f241
77a63928 4770df01 0c18f241 0c17f241 4770df0177a63938
4770df01 0c1af241 77a63948 4770df01 0c1cf241 77a63958 0c19f241 4770df014770df01
0c1ef241 0c1bf241 4770df0177a63968
4770df01 0c1df241 4770df015c81f44f
77a63978 0c1ff241 4770df014770df01
0c22f241 0c21f241 4770df0177a63988
4770df01 0c23f241 4770df010c24f241
0:000>üuser32.dll中+ 0x023918
* ERROR:符号文件能找不到。
默认为C:\windows\system32\user32.dll导出符号-
user32!WindowFromPoint:
77a63918 6841 ldr r1,[r0,#4]
77a6391a 4469 add 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 4770df010c16f241
77a63928 4770df01 0c18f241 0c17f241 4770df0177a63938
4770df01 0c1af241 77a63948 4770df01 0c1cf241 77a63958 0c19f241 4770df014770df01
0c1ef241 0c1bf241 4770df0177a63968
4770df01 0c1df241 4770df015c81f44f
77a63978 0c1ff241 4770df014770df01
0c22f241 0c21f241 4770df0177a63988
4770df01 0c23f241 4770df010c24f241
0:000>üuser32.dll中+ 0x23918
* ERROR:符号文件能找不到。默认为 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 代码中的特定于平台的钩子导致了我的麻烦。解决了。

4

1 回答 1

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,直到找到被调用以加载钩子的静态初始化程序。

于 2013-01-28T22:30:51.800 回答