我想学习如何在运行 Windows 的 wine 应用程序中预加载和 Hook 函数。
我正在尝试在 Arch Linux(64 位但我想我安装了 32 位支持)上使用 ld_preload
将库预加载到 wine(windows 游戏(32 位))。我收到错误 wrong ELF class: ELFCLASS32
并且 ELFCLASS64
也是如此。
完整的错误文本:
"ERROR: ld.so: object './eve.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored."
64位和另一个相同
ERROR: ld.so: object './eve.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
当我同时安装了 32 位和 64 位时,我如何得到“错误的类别”?我需要什么样的架构才能使其正常工作?
哇哇.exe:
Wow.exe: PE32 executable (GUI) Intel 80386, for MS Windows
我尝试使用和不使用 -m32
标志进行构建(我将所有 uint32
更改为 uint64
):
gcc -std=c99 -Wall -Werror -m32 -O0 -fpic -shared -ldl -lGL -o eve.so eve.c
我看到了这个答案:
ltrace /lib/ld-linux.so.2 --preload /path/to/lib/strcmp.so ./exec
但不知道如何用运行应用程序的 wine 来运行它。
我想学习如何在运行 Windows 的 wine 应用程序中预加载和 Hook 函数。我看到了这个指南: https://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing/276206-linux-simple-injection-ld_preload.html
最佳答案
错误的 ELF 类:ELFCLASS32
表示您正在尝试将 32 位程序注入(inject) 64 位进程。这会让我相信你的游戏是 64 位的,你也应该将你的库编译为 64 位。但是既然你提到你也看到了 64 位的错误,最好直接检查你的 wine 安装。运行 pacman -Q --info wine
进行检查。
您报告的第二条错误消息,cannot open shared object file
, 表示动态链接器找不到您的库。仔细检查所有文件路径。不要使用相对导入 ./eve.so
,而是使用完整的绝对路径 (/path/to/lib/eve.so
),这样系统就不会出现歧义.您通常希望指定 LD_PRELOAD 的绝对路径。原因是它是一个环境变量,它由子进程继承 - 子进程可能具有与父进程不同的工作目录。因此任何相对路径都无法找到要预加载的库。
关于Wine中如何设置环境变量,wine
将整个shell环境变量空间传递给了Windows环境变量空间,所以你只要事先在Linux中设置好变量就可以了可用于 wine 中的游戏:
export LD_PRELOAD=/path/to/lib/eve.so
wine ...
另外请注意,LD_PRELOAD
只会影响 wine
加载器。如果你也想影响 wineserver
:
wineserver -k
export LD_PRELOAD=...
wine ...
最后看this post有关更多详细信息,如果这仍然不适合您,这是对如何具体注入(inject) wine
的更深入的解释。
关于c - 如何使用 ld_preload 将库预加载到 wine(windows 游戏)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73276629/