Linux ptrace如何读写内存

在Linux中,可以使用ptrace系统调用来读写其他进程的内存。ptrace系统调用允许一个进程(称为tracer)监视和控制另一个进程(称为tracee)的执行。

要读取tracee进程的内存,可以使用ptrace系统调用的PTRACE_PEEKDATA命令。下面是一个简单的示例代码,演示如何使用ptrace系统调用读取tracee进程的内存:

#include <stdio.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t child;
    long data;
    
    child = fork();
    
    if (child == 0) {
        // Child process
        ptrace(PTRACE_TRACEME, 0, NULL, NULL); // Allow parent to trace
        execl("/bin/ls", "ls", NULL); // Execute ls command
    } else {
        // Parent process
        wait(NULL); // Wait for child to stop
        
        data = ptrace(PTRACE_PEEKDATA, child, 0x400000, NULL); // Read memory at address 0x400000
        
        printf("Data at address 0x400000: %lx\n", data);
        
        ptrace(PTRACE_CONT, child, NULL, NULL); // Continue child process
    }
    
    return 0;
}

这段代码创建了一个子进程,在子进程中执行了ls命令。父进程使用ptrace系统调用来读取子进程的内存,然后打印出来。在这个例子中,我们读取了0x400000地址处的内存数据。

要写入tracee进程的内存,可以使用ptrace系统调用的PTRACE_POKEDATA命令。下面是一个简单的示例代码,演示如何使用ptrace系统调用写入tracee进程的内存:

#include <stdio.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t child;
    long data = 0x41414141; // Data to write
    
    child = fork();
    
    if (child == 0) {
        // Child process
        ptrace(PTRACE_TRACEME, 0, NULL, NULL); // Allow parent to trace
        execl("/bin/ls", "ls", NULL); // Execute ls command
    } else {
        // Parent process
        wait(NULL); // Wait for child to stop
        
        ptrace(PTRACE_POKEDATA, child, 0x400000, data); // Write data to address 0x400000
        
        printf("Data written to address 0x400000\n");
        
        ptrace(PTRACE_CONT, child, NULL, NULL); // Continue child process
    }
    
    return 0;
}

这段代码创建了一个子进程,在子进程中执行了ls命令。父进程使用ptrace系统调用来写入子进程的内存,将0x41414141数据写入到0x400000地址处。

请注意,使用ptrace系统调用来读写其他进程的内存是一种高级技朼,需要特殊权限,并且容易导致系统稳定性问题。确保你的代码只用于教育和研究目的。

相关推荐:

Linux上OpenClaw怎么安装_OpenClawLinux安装技巧【技巧】

推荐新手使用一键脚本安装:执行curl -fsSL https://openclaw.ai/install.sh | bash自动安装Node.js v22+、Git及OpenClaw CLI,并运行openclaw onboard --flow quickstart完成配置。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 如果您在 Li...
· AI · 137090

Linux如何查公网出口IP_Linux查公网IP法【出口】

在linux中确认公网ip需依赖外部服务,可用curl/wget请求http服务(如ifconfig.me)、dig查询opendns的txt记录、curl+json api(如ipinfo.io)配合jq提取,或编写多服务轮询脚本提升可靠性。 如果您在Linux系统中需要确认当前网络对外通信所使用的公网IP地址,该地址即为数据包离开本地网络时经由NAT或路由器映射后的出口IP,则需依赖外部服务返...

如何在 Windows 上安装 Kali Linux

答案:可通过wsl、virtualbox或vmware在windows安装kali linux。1. wsl:管理员运行powershell执行wsl --install,重启后用wsl --install -d kali-linux安装并创建用户。2. virtualbox:下载并安装virtualbox,从官网获取kali iso,新建虚拟机分配至少2gb内存和20gb硬盘,加载iso完成图形...

Linux怎样查docker容器IP_Linux查容器IP法【容器】

Docker容器内网IP可通过五种方法查看:一、docker inspect -f提取;二、grep过滤IPAddress字段;三、docker exec ip addr show查接口;四、docker network inspect查自定义网络;五、docker container inspect语义化查询。 如果您在 Linux 系统中运行了 Docker 容器,但需要确认其内网 IP 地址...

Linux安装SQL Server 2016指南

不少人误以为sql server只能在windows平台上运行,其实它也完全兼容linux系统。下面将为您详细介绍在linux环境中安装与配置sql server的具体流程,助您高效完成部署。 1、当前操作系统为CentOS 7.5 2、下载并配置SQL Server的YUM源地址 3、确认已成功写入 /etc/yum.repos.d/ 目录下的仓库配置文件 4、执行安装命令,启动SQL Serv...

linux中如何使用python

Linux中Python使用简单,通常预装Python 3,可用python3命令进入交互环境或运行脚本;通过python3 --version等命令确认安装;支持pip3管理包及venv创建虚拟环境。 在 Linux 中使用 Python 很简单,系统通常已预装 Python(尤其是 Python 3.6+),你只需打开终端,输入 python3 即可进入交互式环境,或用 python3 scr...
· Python · 65712

linux如何打开python

在Linux上“打开Python”指通过终端启动Python交互式解释器或运行.py脚本;需先用python3 --version确认安装,未安装则依发行版用apt/yum/dnf安装;输入python3进入交互模式,输入exit()或Ctrl+D退出;运行脚本用python3 script.py,或添加shebang并chmod +x后直接执行。 在 Linux 上“打开 Python”,通常是...
· Python · 217125