首页 > 系统相关 >逆向 | 驱动挂靠进程直接读内存

逆向 | 驱动挂靠进程直接读内存

时间:2024-05-20 19:19:45浏览次数:15  
标签:逆向 DbgPrintEx 挂靠 LEVEL 内存 ERROR DPFLTR data ID

逆向 | 驱动挂靠进程直接读内存

image
参考:https://cloud.tencent.com/developer/article/2358904
https://github.com/Whitebird0/driver_read_and_write/blob/main/04-读写内存/ReadMemory.c

代码如下:
代码不长但是有坑,比如说ExAllocatePool2的参数就跟之前不一样了,这个点我调试了好久,晕

typedef struct
{
    DWORD pid;                // 要读写的进程ID
    DWORD64 address;          // 要读写的地址
    DWORD size;               // 读写长度
    BYTE* data;               // 要读写的数据
}ReadMemoryStruct;

// MDL读内存
BOOL MDLReadMemory(ReadMemoryStruct* data)
{
    BOOL bRet = TRUE;
    PEPROCESS process = NULL;

    PsLookupProcessByProcessId((HANDLE)data->pid, &process);
    //   +0x5a8 ImageFileName    : [15] UChar
    UCHAR* imagename = ((BYTE*)process + 0x5a8);
    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "> [info] ImageFileName: %s \r\n", imagename);

    if (process == NULL)
    {
        return FALSE;
    }

    BYTE* GetData;
    __try
    {
        GetData = ExAllocatePool2(POOL_FLAG_PAGED, data->size, 'qwer');
        if (GetData == NULL) {
            DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "[fail] GetData ExAllocatePool2\r\n");
        }
    }
    __except (1)
    {
        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "[err] GetData ExAllocatePool2\r\n");
        return FALSE;
    }

    KAPC_STATE stack = { 0 };
    __try {
        KeStackAttachProcess(process, &stack);
    }
    __except (1) {
        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "[err] KeStackAttachProcess\r\n");
    }
    
    __try
    {
        //DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "[info] MmIsAddressValid(start): %x \r\n", MmIsAddressValid((PVOID)data->address));
        //DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "[info] MmIsAddressValid(end): %x \r\n", MmIsAddressValid((PVOID)(data->address+data->size)));
        //DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "[info] MmIsAddressValid(start): %x \r\n", MmIsAddressValid((PVOID)GetData));
        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "[info] ProbeForRead(%I64x,%x)\r\n", data->address, data->size);
        ProbeForRead((volatile VOID*)data->address, data->size, 1);
        RtlCopyMemory(GetData, (const void*)data->address, data->size);
    }
    __except (1)
    {
        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "[err] ProbeForRead code: %x\r\n", GetExceptionCode());
        bRet = FALSE;
    }

    ObDereferenceObject(process);
    KeUnstackDetachProcess(&stack);
    RtlCopyMemory(data->data, GetData, data->size);
    ExFreePool(GetData);

    
    return bRet;
}

标签:逆向,DbgPrintEx,挂靠,LEVEL,内存,ERROR,DPFLTR,data,ID
From: https://www.cnblogs.com/Mz1-rc/p/18202644

相关文章

  • [转帖]Linux内存管理基本概念
    最近在学习Linux系统的内存管理,小白一枚,零散从网上收集的一些笔记如下:/proc目录提供了很多工具给我们查看当前内存情况1./proc/meminfo是什么$cat/proc/meminfoMemTotal:2052440kB//总内存MemFree:50004kB//空闲内存Buffers:19976kB/......
  • Unity性能优化内存优化
    如何优化内存?1.压缩自带类库;2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;3.释放AssetBundle占用的资源;4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;5.使用光照贴图;6.使用多层次细节(LOD);7.使用着色器(Shader);8.使用预设(Prefab)等。 内存开......
  • Unity内存优化(来自uwa)
    内存优化——“勿以善小而不为,勿以恶小而为之” 资源内存占用一、纹理资源纹理资源可以说是几乎所有游戏项目中占据最大内存开销的资源。一个6万面片的场景,网格资源最大才不过10MB,但一个2048x2048的纹理,可能直接就达到16MB。因此,项目中纹理资源的使用是否得当会极大地影响......
  • .NET 中 Channel 类(内存级消息队列)简单使用
    Channel是干什么的#TheSystem.Threading.Channelsnamespaceprovidesasetofsynchronizationdatastructuresforpassingdatabetweenproducersandconsumersasynchronously.Thelibrarytargets.NETStandardandworksonall.NETimplementations.Channelsa......
  • Linux如何给根目录扩容内存
    第一种:LVM分区格式,就是用系统默认的自动分区格式1.添加一块20G大小的nvme硬盘2.启动后,查看硬盘是否已经被系统识别3.对/dev/nvme0n2进行分区,并设置分区属性fdisk/dev/nvme0n2#然后输入npenterenterentertL8ew#t:修改分区文件系统id,选择8e,与原有分区属性一致(l......
  • Redis内存回收与缓存问题
    内存回收:1.过期key处理通过expire命令给key设置ttlRedis本身是KV型数据库,所有数据都存在RedisDB结构体中,其中有两张哈希表dict:用于存放KV(这里K是K,V是V)expires:保存Redis中所有的设置了过期时间的KEY以及到期时间TTL(这里K是K,V是TTL)过期KEY有两种删除策略:惰性删除,有......
  • ptrace attach 修改进程内存
    #include<stdio.h>#include<stdlib.h>#include<sys/ptrace.h>#include<stdint.h>#include<errno.h>#include<sys/wait.h>intmain(intargc,char*argv[]){ void*addr1; void*addr2; pid_tattack_pid=-1; if(......
  • [20240510]SQL语句存在问题与共享池内存分配.txt
    [20240510]SQL语句存在问题与共享池内存分配.txt--//五一前遇到的问题,生产系统应用程序升级,但是3个表忘记建立,而编写的程序可能存在问题,导致频繁调用这些根本不可能执行的sql--//语句.很奇怪的是应用前台根本不报错,真不知道开发如何写代码,难道没做例外处理以及记录吗?--//测......
  • myfreemp3音乐token逆向
    目前还能用。window=global;constCryptoJS=require('crypto-js')functionFs(e,t){returne['charCodeAt'](Math['floor']({ELxvT:function(e,t){returne%t}}["ELxvT"](t,64)))}......
  • 驱动内存加载[理论]
    07驱动内存加载驱动加载介绍内存驱动加载不需要签名当双击一个PE程序的时候发生了什么1.通过explorer.exe(资源管理器)定位到双击的文件2.资源管理器通过CreatProcess创建进程3.创建进程的时候开辟一块空间此时在R3(PEB)和R0(填充基址)需要的地方挂上R3的物理页4.通过文......