gpt4 book ai didi

c++ - 从 C++ 重定位动态执行的 ARM ASM 系统调用

转载 作者:行者123 更新时间:2023-11-30 04:46:13 25 4
gpt4 key购买 nike

我想从 C++ 调用 ARM/ARM64 ASM 代码。 ASM 代码包含系统调用和对外部函数的重定位。这里的 ARM 体系结构并不是那么重要,我只是想了解如何从概念上解决我的问题。

我有以下在共享库中调用的 ASM 系统调用(objdump -d 的输出):

 198:   d28009e8    mov x8, #0x4f                   // #79
19c: d4000001 svc #0x0
1a0: b140041f cmn x0, #0x1, lsl #12
1a4: da809400 cneg x0, x0, hi
1a8: 54000008 b.hi 0 <__set_errno_internal>
1ac: d65f03c0 ret

这段代码调用fstatat64 系统调用并通过外部__set_errno_internal 函数设置errnoreadelf -r 显示了 __set_errno_internal 函数的以下重定位:

00000000000001a8 R_AARCH64_CONDBR19  __set_errno_internal

我想从C++中调用这段代码,所以我将它转换为缓冲区:

  unsigned char machine_code[] __attribute__((section(".text"))) =
"\xe8\x09\x80\xd2"
"\x01\x00\x00\xd4"
"\x1f\x04\x40\xb1"
"\x00\x94\x80\xda"
"\x08\x00\x00\x54" // Here we have mentioned relocation
"\xc0\x03\x5f\xd6";

编辑:重要细节 - 我选择使用缓冲区(不是内联汇编等),因为我想在此缓冲区上运行额外的处理(例如,字符串文字上的解密功能作为软件保护机制,但这在这里并不重要)被评估为机器代码。

之后buffer可以被强制转换为function,直接调用执行机器码。显然搬迁有问题,它不会自动修复,我必须手动修复它。但是在运行时我不能这样做,因为 .text 部分是只读和可执行的。

虽然我几乎可以完全控制源代码,但我不能关闭堆栈保护和其他功能以使该部分可写(不要问为什么)。因此,似乎应该以某种方式在链接阶段执行重定位修复。据我所知,在链接器和二进制 *.so 文件重定位后,共享库包含相对偏移量(用于类似的外部函数调用)。因此文件应包含正确的偏移量(不需要运行时重定位工作),因此修复 machine_code 链接期间的缓冲区应该是可能的。

我正在使用手动构建的 Clang 7 编译器,并且我可以完全控制 LLVM 传递,所以我认为也许可以编写某种在链接时执行的 LLVM 传递。尽管看起来 ld 最终被调用,所以 LLVM 传递可能在这里无济于事(这里不是专家)。

不同的想法也将不胜感激。如您所见,问题非常复杂。也许你有一些方向/想法如何解决这个问题?谢谢!

最佳答案

已经有一个有效的打包机制来处理重定位。它称为 dlsym()。虽然它不会直接为您提供函数指针,但所有主要的 C++ 编译器都支持将 dlsym 的结果reinterpret_cast 转换为任何普通函数指针。 (成员函数完全是另一个问题,但这与这里无关)

关于c++ - 从 C++ 重定位动态执行的 ARM ASM 系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56904943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com