python脚本扫描win系统中运行程序内存值并修改

 用于修改运行中程序的内存值

#!encoding=utf8

import os
import json
import psutil
import shutil
import threading
import ctypes
import win32api 
import win32process
from win32con import PROCESS_ALL_ACCESS 

class MemScan:
    '''
    注:一定要以系统管理员身份运行脚本(管理员身份运行cmd) 
    windows系统 根据 进程号 pid 进行扫描内存中的数据, 最终定位到需要修改的内存地址并设置新值, 已知内存地址可以跳过扫描步骤

    定位内存地址的方法:
    一、精确查找
        1、在目标程序页面找到需要修改的值 对该值进行首次扫描
        2、在目标程序中改变这个值, 用新值进行二次扫描(扫描内存地址范围为上一次扫描结果)
        3、如果还是没办法确定准确的内存地址, 则重复第 2 步 逐步缩小范围
        4、根据内存地址设置新值
    '''
    def __init__(self, pid):
        self.scan_data = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'scan_data.json')
        self.tmp_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'tmp')
        self.hProcess = win32api.OpenProcess(PROCESS_ALL_ACCESS, False, pid)  # 获取进程句柄
        # 根据进程号来获取进程的内存大小
        process = psutil.Process(pid)
        mem_info = process.memory_info()
        print("内存总量:", mem_info.rss)  #  resident set size, 常驻内存集大小
        print("内存占用的峰值:", mem_info.vms)  # virtual memory size, 虚拟内存大小
        self.base_addr = win32process.EnumProcessModules(self.hProcess)[0]
        self.end_addr =  mem_info.vms + self.base_addr
        print(f'pid:{pid} 的进程基址:{self.base_addr}  内存结束地址:{self.end_addr}')
        
    def read(self, mem_address, data_len=4, data_type=''):
        '''
        读取内存中的值
        '''
        if data_type == 'int':
            addr = ctypes.c_int32()
        elif data_type
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值