在 Winx64 上使用 User32InitializeImmEntryTable?
Posted
技术标签:
【中文标题】在 Winx64 上使用 User32InitializeImmEntryTable?【英文标题】:Using User32InitializeImmEntryTable on Winx64? 【发布时间】:2015-05-01 15:26:33 【问题描述】:https://github.com/jay/gethooks 使用 User32InitializeImmEntryTable 来获取 SharedInfo,而 SharedInfo 又用于获取全局事件挂钩列表。
该程序在 Win32 上运行,但在 Win7x64 上运行,如何解决?
根据您是为 Win32 还是 x64 构建,存在不同的问题。
在 x64 构建中,失败的代码来自 prog.c:
p = (char *)User32InitializeImmEntryTable;
for( i = 0; i < 127; ++i )
if( ( *p++ == 0x50 ) && ( *p == 0x68 ) )
*( (char *)&SharedInfo + 0 ) = *++p;
*( (char *)&SharedInfo + 1 ) = *++p;
*( (char *)&SharedInfo + 2 ) = *++p;
*( (char *)&SharedInfo + 3 ) = *++p;
break;
0x50, 0x68 (push eax) 没有找到。
在 Win32 上构建上述工作,但 EnumDesktopsW 没有,在 desktop.c 的函数 add_all_desktops 中。
我也不确定修复该部分是否会让程序在 x64 上正常运行,但我想这是一个开始。我也不确定构建 Win32 或 x64 可执行文件哪个更好,哪个更容易让它工作?
我希望这是一个好的问题,AFAIK 获得创建全局挂钩的应用程序列表是一件好事,例如查找键盘记录器、故障排除或 w/e。因此,修复该 gethooks 程序将使社区受益,无论它最终以何种方式修复。任何反对票,我保证会立即删除。
【问题讨论】:
这属于严重不支持的类别。如果我猜是因为 win64 上的调用约定是普遍的*__fastcall
而不是 __stdcall
*mangling 是所有变化,vectorcall 是唯一的例外
【参考方案1】:
在 Windows 7 中非常简单:
SHAREDINFO *SharedInfo = (SHAREDINFO *)GetProcAddress(LoadLibraryA("user32"), "gSharedInfo");
但是 Windows 8/10 是一个不同的故事,我将提出一个新问题。
【讨论】:
以上是关于在 Winx64 上使用 User32InitializeImmEntryTable?的主要内容,如果未能解决你的问题,请参考以下文章
mysql-8.0.16-winx64/Linux修改root用户密码