gpt4 book ai didi

c - ELF 二进制文件的运行时修补

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:20 24 4
gpt4 key购买 nike

我有一个程序的共享对象,我需要将指令从“jne/je”更改为 jmp。我试图环顾四周,例如如何使用 LD_PRELOAD 或无济于事的东西来做到这一点。

最佳答案

这在技术上是否可行取决于以下几点:

  1. jne/je 指令有不同的长度:

    • 一个字节的操作码(0x74/0x75)加上带符号的 8 位偏移量(即总共两个字节)
    • 两字节操作码(0xf0 加上 0x84/0x85,)加上带符号的 32 位偏移量(即总共六个字节)

    对于jmp指令也是一样(64位模式下,二到九字节之间一共五种不同的编码,取决于jmp是相对/绝对) .
    这意味着如果您的 jmp 的目标“足够接近”,您只能将 jne/je 替换为 jmp "选择大小兼容的操作码。对于相对于 32 位的 jne/je 您通常可以替换,但是对于接近(8 位)的通常不可能,因为不会有“自由指令”空间”在 +/- 128 字节内。

  2. 如果你有一个“兼容的机会”wrt。根据指令的大小,您需要完成您自己已经提到的两个任务:

    • 拦截共享对象加载,以便您可以在使用库之前进行替换。
    • 找到您要修补的函数的地址(假设它发生了变化)。

    如何做到这一点取决于您的操作系统;在类 UN*X 上,您可以尝试使用 LD_PRELOAD 加载您自己的自定义库 ,它只执行 dlopen() 库您希望修改,然后 dlsym() 找到例程,然后替换代码,但永远不要调用 dlclose() 以确保修改后的副本保留(即未卸载)而不是原始的,稍后(通过动态链接)再次访问该库。

系统管理员通常有办法减轻(甚至禁用)LD_PRELOAD(对于以 root 身份运行的 setuid 可执行文件,它总是被忽略),因为它对系统完整性/安全性有明显的影响.因此,是否可以使用该技术取决于您的具体设置。

如果满足上述所有条件,则类似:

int patch_je_jne(void *instr, void *tgt_address)
{
char *je_jne = (char*)instr;
char *iaddr = je_jne;

switch (je_jne[0]) {
case JE_8BIT_OP:
case JNE_8BIT_OP:
iaddr += 2;
tgt_address -= iaddr; /* adjust pc-relative */
if ((char*)tgt_address > (char*)0xFF)
return CANNOT_PATCH_LARGE_OFFSETS;
je_jne[1] = (char)tgt_address;
je_jne[0] = JMP_OP;
return PATCH_SUCCESS;

case 0xF0: /* marker for a 32bit-relative JE/JNE */
if (je_jne[1] != JE_32BIT_OP && je_jne[1] != JNE_32BIT_OP))
break;
iaddr += 6;
tgt_address -= iaddr; /* adjust pc-relative */
*((char**)(je_jne + 2)) = tgt_address;
je_jne[1] = JMP_32BIT_OP;
return PATCH_SUCCESS;
}
return CANNOT_PATCH_THIS_INSTR;
}

可能会。如前所述,除了检查待修补地址处的指令操作码是否兼容之外,此代码中没有任何验证/验证。

如前所述,主要工作是安全地确定您需要在何处/如何应用 Hook 。

正如所建议的那样,关于修补二进制库而不是运行(加载)库的评论:关键问题是:jmp 的目标是什么,您知道吗提前 ?
在二进制补丁中,您需要确定修改二进制文件的时间,这与 ASLR(地址空间布局随机化)等操作系统行为一起很难甚至不可能 - 您需要一个预先知道的,不变的目标地址你的可执行文件,但通常你只有一个 relative jmp 可用,即事先不知道由于 ASLR 而最终会出现哪个代码位置。这完全取决于您希望 jmp 转到的位置

关于c - ELF 二进制文件的运行时修补,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7951454/

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