首页 > 系统相关 >ptrace attach 修改进程内存

ptrace attach 修改进程内存

时间:2024-05-18 23:40:40浏览次数:24  
标签:main global1 attach ptrace var include stack 内存

#include <stdio.h>
#include <stdlib.h>
#include <sys/ptrace.h>
#include <stdint.h>
#include <errno.h>
#include <sys/wait.h>

int main(int argc, char* argv[])
{
	void *addr1;
	void *addr2;

	pid_t attack_pid = -1;

	if (argc < 4 || argv[1] <= 0)
	{
		printf("usage: ./main pid addr addr\n");
		return 0;
	}

	attack_pid = strtoul(argv[1], 0, 10);
	long val = strtoul(argv[4], 0, 10);
	uintptr_t address,address2;
	sscanf(argv[2], "%lx", &address);
	sscanf(argv[3], "%lx", &address2);
	addr1 = (void *)address;
	addr2 = (void *)address2;

	printf("will replace pid(%d) mem address %p %p val %ld\n", attack_pid, addr1, addr2, val);

	if (ptrace(PTRACE_ATTACH, attack_pid, NULL, NULL) < 0)
	{
		printf("attach failed\n");
		return 0;
	}

    	//读取数据
	long data;
	errno = 0;

	while (1) {
		waitpid(attack_pid, NULL, 0);

		data = ptrace(PTRACE_PEEKDATA , attack_pid, addr1, NULL); 
		if (data == -1) 
			perror("PTRACE_PEEKDATA addr1");
		else
			printf("read global1 %ld\n", data);

		data = 	ptrace(PTRACE_PEEKDATA , attack_pid, addr2, NULL);
		if (data == -1) 
			perror("PTRACE_PEEKDATA addr2");
		else
			printf("read stack_var %ld\n", data);

		//修改数据
		printf("POKEDATA %ld\n", ptrace(PTRACE_POKEDATA , attack_pid, addr1, val));
		printf("POKEDATA %ld\n", ptrace(PTRACE_POKEDATA , attack_pid, addr2, val));

		if (ptrace(PTRACE_CONT, attack_pid, NULL, NULL) == -1) {
			perror("ptrace cont");
			ptrace(PTRACE_DETACH, attack_pid, NULL, NULL);
		}

		scanf("%ld", &val);
		if (val == 0) break;
		if (kill(attack_pid, SIGSTOP) == -1) {
			perror("kill");
		}
	}

	ptrace (PTRACE_DETACH, attack_pid, NULL, NULL);
	return 0;
}
#include <stdio.h>
 
int global1 = 11; // 
 
int main(void)
{
  long stack_var = 10;
  char c = 'a';

  printf("pid: %d\n", getpid());
  while(1)
  {
    printf("global1 addrss 0x%lx, global1=%d\n", &global1, global1);
    printf("stack_var addrss 0x%lx, stack_var=%d\n", &stack_var, stack_var);
    scanf("%c", &c);
    getchar();
    if (c != 'c')
    {
        break;
    }
  }
  return 0;
}

编译

$ mkdir -p build
$ gcc ptrace.c -o build/ptrace
$ gcc main.c -o main
$ ./build/main 
pid: 9414
global1 addrss 0x555a27513010, global1=11
stack_var addrss 0x7ffd67ba46b0, stack_var=10

$ ./build/ptrace 9414 555a27513010 7ffd67ba46b0 88

标签:main,global1,attach,ptrace,var,include,stack,内存
From: https://www.cnblogs.com/tangshunhui/p/18199950

相关文章

  • [20240510]SQL语句存在问题与共享池内存分配.txt
    [20240510]SQL语句存在问题与共享池内存分配.txt--//五一前遇到的问题,生产系统应用程序升级,但是3个表忘记建立,而编写的程序可能存在问题,导致频繁调用这些根本不可能执行的sql--//语句.很奇怪的是应用前台根本不报错,真不知道开发如何写代码,难道没做例外处理以及记录吗?--//测......
  • 驱动内存加载[理论]
    07驱动内存加载驱动加载介绍内存驱动加载不需要签名当双击一个PE程序的时候发生了什么1.通过explorer.exe(资源管理器)定位到双击的文件2.资源管理器通过CreatProcess创建进程3.创建进程的时候开辟一块空间此时在R3(PEB)和R0(填充基址)需要的地方挂上R3的物理页4.通过文......
  • 驱动内存加载[实战]
    08驱动内存加载[项目]目标:实现一个加载器,让驱动不落地加载DOS头和NT头DOS头kd>dt_IMAGE_DOS_HEADER-r3ntdll!_IMAGE_DOS_HEADER+0x000e_magic:Uint2B+0x002e_cblp:Uint2B+0x004e_cp:Uint2B+0x006e_crlc......
  • ServiceHub.DataWarehouseHost.exe内存占用过高
    最近在优化WCS系统中同层调度多辆车子的功能,功能写完后,顺手写了个仿真的脚本,模拟车辆动作。准备测试下合理性。但是使用VS2022进行调试时,刚调试时程序响应很快,因为总是被领导喊去参加各种会议,忙完回来,准备继续测试时,程序响应总是很慢,一开始没注意,以为是许久不开发,电脑配置跟......
  • [转帖]JVM内存配置最佳实践
     https://help.aliyun.com/zh/sae/use-cases/best-practices-for-jvm-heap-size-configuration   如果JVM堆空间大小设置过大,可能会导致Linux系统的OOMKiller被激活,进而结束(kill)Java应用进程,在容器环境下可能会表现为频繁异常重启。本文介绍在容器环境下JVM......
  • Golang初学:获取程序内存使用情况,std runtime
    goversiongo1.22.1windows/amd64Windows11+amd64x86_64x86_64GNU/Linux--- 序章本文介绍golang程序占用内存的监控:使用stdruntime的ReadMemStats函数。 ReadMemStats函数https://pkg.go.dev/[email protected]//函数funcReadMemStats(m*MemStats......
  • struct和malloc内存互转例子
    #include<iostream>typedefstructDS1001{unsignedinta;unsignedcharb;unsignedintc;unsignedchard;unsignedshorte;}DS1001;voidTestMallocToStruct(){intnsize=sizeof(DS1001);unsignedchar*mallocdat......
  • Java(6)-Java内存区域和作用
    本文在终于搞懂了java8的内存结构,再也不纠结方法区和常量池了!_java8堆中存放静态变量和字符串常量池吗-CSDN博客基础上加入了一些个人思考,原文写得就很通俗易懂,推荐Java内存Java程序在运行过程中使用的内存可以分成虚拟内存和本地内存两大类。虚拟内存虚拟内存,就是指JVM自己管......
  • 谈谈垃圾回收机制方式及内存管理。
    回收机制方式1、定义和用法:垃圾回收机制(GC:GarbageCollection),执行环境负责管理代码执行过程中使用的内存。2、原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执......
  • 一个Java基于阻塞的定时消费内存队列
     @Getter@AllArgsConstructorpublicenumInsertQueueEnum{A(30000,10,TimeUnit.SECONDS,2,1000),;privatefinalintcapacity;//队列长度privatefinalinttime;//最长阻塞时间privatefinalTimeUnittimeUnit;//最长阻塞时间单位privatefi......