c - 如何使用 ld_preload 将库预加载到 wine(windows 游戏)?

标签 c hook ld wine ld-preload

我想学习如何在运行 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/

相关文章:

c - 定义常量变量在闪存中的位置

c - 对 `log' 的 undefined reference

c - 堆栈溢出与堆栈崩溃

ruby-on-rails - 是否可以添加 "somewhere"一个 `before(:each)` Hook ,以便所有规范文件都可以运行它?

c# - UnhookWindowsHookEx 函数,如果在低级钩子(Hook)应用程序中遗漏了怎么办?

wordpress - add/get/delete/update_option() 在激活钩子(Hook)(wordpress)中不起作用

c -/usr/bin/ld : cannot find -ll

C 指针段错误

c - 排序链表位置

c - 递归没有得到我需要的输出