有什么方法可以检测 process_vm_readv() 调用吗?

Was*_*han 5 c linux memory android

我正在尝试使用 读取另一个进程的内存process_vm_readv()

一旦我读取该值,应用程序就会自行关闭(它不会崩溃)。不知何故,应用程序检测到我正在使用系统调用并尝试读取其内存。

我正在使用 Linux 4.4 内核的基于 x86 的 Android 操作系统(7.0)上尝试此操作。

此功能高度未记录,任何有关此的信息都会有所帮助。

这是我的实际代码的精简版本。

#include <sys/uio.h>

size_t readMem()
{
    struct iovec local[1];
    struct iovec remote[1];
    char buf1[1024*8];
    ssize_t nread;
    pid_t pid = 3627; 

    local[0].iov_base = buf1;
    local[0].iov_len = sizeof(buf1);
    remote[0].iov_base = _ADDR // i in the loop below
    remote[0].iov_len = sizeof(buf1);

    return process_vm_readv(pid, local, 2, remote, 1, 0);
}  
Run Code Online (Sandbox Code Playgroud)

需要明确的是,这实际上是一个函数。我从一个循环中调用这个函数,该循环遍历进程的每个内存地址。

for(long int i=0x7000000;!found;i+=4090)
Run Code Online (Sandbox Code Playgroud)

小智 1

所以显然在 Linux 上 ptrace() 是存在的。

https://man7.org/linux/man-pages/man2/ptrace.2.html

我偶然发现了你的问题,我现在就忍不住注册一个帐户并贡献一些知识。

基本上你可以跟踪系统调用,果然,process_vm_readv 就是其中之一。

这基本上意味着一个程序可以出于多种原因跟踪任何其他应用程序的系统调用,当然,还可以以其名称运行系统调用。

这有一些用途,例如,btop 严重依赖它,因为它是一个进程监视器,当然你可以用它杀死进程。

这也意味着 process_vm_readv() 是这些系统调用之一:

https://man7.org/linux/man-pages/man2/syscalls.2.html

我真的不知道你如何解决这个问题,也许以 root 身份运行?我是实际游戏作弊的新手,我什至不知道现在如何处理 process_vm (从 C 开始),但你可以尝试以 root 身份运行,因为我听说用户空间进程(例如游戏)没有太多自由