gpt4 book ai didi

linux - 如何修改流程中的指令? Linux 和 ARMv7

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:53 24 4
gpt4 key购买 nike

我试图修改名为 g 的函数的第一条指令,但在以下代码片段中的第二条语句中出现段错误

int a = *(int*)g;
*(int*)g=0; // segment fault!
*(int*)g=a;

这个段错误是由于我要修改的指令所在页的页表条目中的no-write权限造成的吗?

我这样做是因为我想看看我是否可以用一些错误修补函数,同时保持进程运行,如下所示:

1) 一个函数为g的进程正在运行,并且那个g被发现有一些错误。因此编写一个名为 patch_g 的新函数,它没有错误。

2) 将新函数编译成patch.so

3) dlopen & dlsym .so 文件。获取patch_g的地址。

4) 暂停正在运行的进程

5) 使用一些代码(有点类似于上面代码片段的第二条语句)将g的第一条指令更改为jump patch_g

最佳答案

好吧,让我们做一个实验。这是代码:

#include <stdio.h>

int (*functionPtr)(int,int);

int addInt(int n, int m) {
return n+m;
}


int main()
{
functionPtr = &addInt;
printf("%p\n", functionPtr);
while(1){};
*(int *) functionPtr = 0x0;
return 0;
}

编译

$ gcc -o ./main.c main

在第一个控制台中启动此应用。

$ ./main 
0x40052d

在第二个控制台

$ cat /proc/`pidof main`/maps
00400000-00401000 r-xp 00000000 08:01 6345711 /tmp/main
00600000-00601000 r--p 00000000 08:01 6345711 /tmp/main
00601000-00602000 rw-p 00001000 08:01 6345711 /tmp/main

...

这个r-xp 意味着当内核加载这个二进制文件时,它已经将文本部分映射到具有读取和执行权限但没有写入权限的私有(private)虚拟映射。我认为这样做是出于安全原因。

内核中适当的 vma_area 被标记为不可写,这会导致未处理的用户空间页面错误,即发生段错误。

现在让我们将 mprotect 调用添加到适当的位置

 17         if (mprotect((void *)0x00400000, 4096, PROT_READ | PROT_WRITE | PROT_EXEC)) {
18 printf("error\n");
19 return -1;
20 }

您会注意到这将有助于您实现运行时修补的想法。

00400000-00401000 rwxp 00000000 08:01 6345711                            /tmp/main
00600000-00601000 r--p 00000000 08:01 6345711 /tmp/main
00601000-00602000 rw-p 00001000 08:01 6345711 /tmp/main

关于linux - 如何修改流程中的指令? Linux 和 ARMv7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38323259/

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