有没有办法检测process_vm_readv()函数的调用?

4
我正在尝试使用process_vm_readv()读取另一个进程的内存。
但是,一旦我读取值,该应用程序将自行关闭(它不会崩溃)。不知何故,该应用程序正在检测到我正在使用系统调用并尝试阅读其内存。
我正在尝试在基于x86的Android OS(7.0)上使用Linux 4.4内核进行操作。
这个功能高度未记录,任何有关此事的信息都将有助于解决问题。
以下是我实际代码的简化版本。
#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);
}  

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

for(long int i=0x7000000;!found;i+=4090)

作为参考,我找到了两个资源可以帮助你:sys/uio.h头文件的man页面和此URL上的gist:https://gist.github.com/FergusInLondon/fec6aebabc3c9e61e284983618f40730 - Matt
1
我添加了一个负责读取进程内存的函数。明确一下,我实际上正在尝试反向工程一个游戏。我正在使用process_vm_readv()来读取它的内存。不知何故,游戏检测到我正在尝试读取它的内存。但是我找不到任何参考资料表明这个函数调用可以被检测到。 - Washiul Alam Sohan
1个回答

0

所以显然在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身份运行,因为我听说用户空间进程(如游戏)没有太多自由。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接