郁金香外挂技术-郁金香灬老师

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 71|回复: 0

读写驱动方式1-过TP/NP XIGNCODE3等 亲测有效

[复制链接]
发表于 2021-11-17 17:55:18 | 显示全部楼层 |阅读模式
本帖最后由 郁金香灬老师 于 2021-11-17 17:57 编辑

#include <ntifs.h>



//OK 测试通过 遇到2个坑
//第1个坑 sizeof(PKAPC_STATE)是指针 得改结构大小 sizeof(KAPC_STATE)
//第2个坑 KeStackAttachProcess后 进程空间变化了 得用内核内存 中转 BUF缓冲区
//Address为目标进程的内存地址
//Buffer //当前进程的地址
BOOLEAN KReadProcessMemory2(IN PEPROCESS Process, IN PVOID Address, IN UINT32 Length, IN PVOID UserBuffer)
{

        KAPC_STATE apc_state;
        RtlZeroMemory(&apc_state, sizeof(KAPC_STATE));
  //1为UserBuffer 创建 MDL内存描述
  //创建MDL来读取内存
        PMDL g_pmdl = IoAllocateMdl(UserBuffer, 8, 0, 0, NULL); //8 可以修改成 要读取的内存大小
        if (!g_pmdl)
        {
                return FALSE;
        }

//2转换成 非分页内存
        MmBuildMdlForNonPagedPool(g_pmdl);
//3锁定 映射用户内存 到 内核内存
        unsigned char* Mapped = (unsigned char*)MmMapLockedPages(g_pmdl, KernelMode); //UserMode
        if (!Mapped)
        { //映射失败
                IoFreeMdl(g_pmdl);
                return FALSE;
        }
        //成功 映射了 地址
        //切换到 目标进程
        KeStackAttachProcess((PVOID)Process, &apc_state);
        //判断目标地址是否可以访问
        BOOLEAN dwRet = MmIsAddressValid(Address);
        if (dwRet)
        {
                KdPrint(("yjx[sys64] RtlCopyMemory(Address, Buffer, Length);\r\n", Address, UserBuffer, Length));

                 //如果目标地址 可以访问 直接复制目标地址内容 到映射的内核地址区域
                RtlCopyMemory(Mapped, Address, Length); //memcpy

        }
        else
        {
                KdPrint(("yjx:sys64:Error Line37"));
        }
        //分离目标进程空间 恢复环境
        KeUnstackDetachProcess(&apc_state);
        DbgPrint("yjx: sys分离目标进程");
         
        //MDL清理工作
        ////释放MDL相关 资源
        MmUnmapLockedPages((PVOID)Mapped, g_pmdl);
        IoFreeMdl(g_pmdl);

        return dwRet;
}
//dwPid为目标进程id
//lpBaseAddress 目标进程地址

//lpBuffer 当前进程地址 1
//内核内存地址 当前进程地址 2
int ReadProcessMemoryForPid2(UINT32 dwPid, PVOID pBase, PVOID lpBuffer, UINT32 nSize)
{
        //根据pid获取PEPROCESS
        PEPROCESS Seleted_pEPROCESS = NULL;
        DbgPrint("yjx:sys64 ReadMemory pid=%d pBase=%p", dwPid, pBase);
        if (PsLookupProcessByProcessId((PVOID)(UINT_PTR)(dwPid), &Seleted_pEPROCESS) == STATUS_SUCCESS)
        {

                BOOLEAN br = KReadProcessMemory2(Seleted_pEPROCESS, (PVOID)pBase, nSize, lpBuffer);
                ObDereferenceObject(Seleted_pEPROCESS);
                if (br)
                {
                        return nSize;
                }
        }
        else
        {
                KdPrint(("yjx sys64 PsLookupProcessByProcessId Fail..."));
        }

        return 0;// STATUS_UNSUCCESSFUL;

}

//int ReadProcessMemoryForPid2(UINT32 dwPid, PVOID pBase, PVOID lpBuffer, UINT32 nSize);
NTSTATUS  IRP_ReadProcessMemory2(PDEVICE_OBJECT device_Object, PIRP pirp)
{

        UNREFERENCED_PARAMETER(device_Object); //未使用的参数 禁止警告
        DbgPrint("yjx:sysNtAllocateVirtualMemory 进入 IRP_YJX_VirtualAllocEx \n");
        NTSTATUS ntStatus = STATUS_SUCCESS;
        PIO_STACK_LOCATION     irpStack = NULL;
        irpStack = IoGetCurrentIrpStackLocation(pirp);

#pragma pack(push)
#pragma pack(1)
        typedef struct TINPUT_BUF
        {
                DWORD32 dwPid;
                PVOID pBase; //目标进程地址
                DWORD32 nSize;//缓冲区大小

        }TINPUT_BUF;
#pragma pack(pop)
        //结构

        PVOID BaseAddress = NULL; //返回地址

        PEPROCESS selectedprocess = NULL;//目标进程        
        SIZE_T RegionSize = 0;//分配大小


        TINPUT_BUF*bufInput = pirp->AssociatedIrp.SystemBuffer; //输入 输出 缓冲区

        ReadProcessMemoryForPid2(bufInput->dwPid, bufInput->pBase, bufInput, bufInput->nSize);

        //ENDCODE:
        //pirp->IoStatus.Status = STATUS_SUCCESS;//
        ////pirp->IoStatus.Information = 4;//返回给DeviceIoControl中的 倒数第二个参数lpBytesReturned
        //IoCompleteRequest(pirp, IO_NO_INCREMENT);//调用方已完成所有I/O请求处理操作 并且不增加优先级
        if (irpStack) //
        {
                if (ntStatus == STATUS_SUCCESS)
                { //成功则返回 缓冲区大小
                        pirp->IoStatus.Information = irpStack->Parameters.DeviceIoControl.OutputBufferLength;//DeviceIoControl
                }
                else
                { //失败则不返回
                        pirp->IoStatus.Information = 0;
                }
                //完成请求
                IoCompleteRequest(pirp, IO_NO_INCREMENT);
        }

        pirp->IoStatus.Status = ntStatus;
        return ntStatus;
}

郁金香外挂教程,学习中...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|郁金香外挂技术-郁金香灬老师 ( 苏ICP备10059359号 )

GMT+8, 2021-11-27 07:10 , Processed in 0.068049 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表