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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 294|回复: 0

修改CE绕过tp,np,xigncode3等驱动保护实战写代码

[复制链接]
发表于 2021-12-10 21:14:15 | 显示全部楼层 |阅读模式
xigncode


VIP论坛网址:
https://www.yjxsoft.com/
2021在线班
郁金香灬老师 QQ 150330575
交流群:158280115
备用群:19780013


学习目标:
     修改CE绕过tp,np,xigncode3等驱动保护实战写代码


#include<ntifs.h>
#include<math.h>


//typedef struct _MEMORY_BASIC_INFORMATION {
//        PVOID BaseAddress;
//        PVOID AllocationBase;
//        ULONG AllocationProtect;
//        SIZE_T RegionSize;
//        ULONG State;
//        ULONG Protect;
//        ULONG Type;
//} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;


BOOLEAN IsOkWritePtr(UINT_PTR base);
BOOLEAN IsOkReadPtr(UINT_PTR base);

UINT32 HandleToPid(IN HANDLE ProcessID/*目标进程PID*/, IN HANDLE hProcess/*获取此句柄的目标PID*/);


NTSTATUS   R0_ZwQueryVirtualMemory2(
        __in PEPROCESS pep,
        __in PVOID BaseAddress,//这个地址本身就是游戏空间的地址
        __in MEMORY_INFORMATION_CLASS MemoryInformationClass,
        __out_bcount(MemoryInformationLength) PVOID MemoryInformation,
        __in SIZE_T MemoryInformationLength,
        __out_opt PSIZE_T ReturnLength //8
)
{
        /*
         BaseAddress,MemoryInformation,ReturnLength 需要做mdl内存映射到内核
        */
        unsigned char* Mapped_MemoryInformation = 0;
        unsigned char* Mapped_ReturnLength = 0;
        PMDL g_pmdl_MemoryInformation = IoAllocateMdl(MemoryInformation, sizeof(MEMORY_BASIC_INFORMATION), 0, 0, NULL); //8 可以修改成 要读取的内存大小
        PMDL g_pmdl_ReturnLength = IoAllocateMdl(ReturnLength, 8, 0, 0, NULL); //8 可以修改成 要读取的内存大小


        if(g_pmdl_MemoryInformation)
        {
                //2标记为非分页内存
        MmBuildMdlForNonPagedPool(g_pmdl_MemoryInformation);
        //3锁定 映射用户内存 到 内核内存 0x100000
         Mapped_MemoryInformation = (unsigned char*)MmMapLockedPages(g_pmdl_MemoryInformation, KernelMode); //UserMode
        }


        if (g_pmdl_ReturnLength)
        {
                //2标记为非分页内存
                MmBuildMdlForNonPagedPool(g_pmdl_ReturnLength);
                //3锁定 映射用户内存 到 内核内存 0x100000
                Mapped_ReturnLength = (unsigned char*)MmMapLockedPages(g_pmdl_ReturnLength, KernelMode); //UserMode
        }


        //切换到目标进程空间
         //在游戏空间里调用 ZwQueryVirtualMemory
        //退出目标进程空间








        //MDL清理工作
        //释放MDL相关 资源
        if (Mapped_MemoryInformation)
        {
                MmUnmapLockedPages((PVOID)Mapped_MemoryInformation, g_pmdl_MemoryInformation);
        }


        if (Mapped_ReturnLength)
        {
                MmUnmapLockedPages((PVOID)Mapped_ReturnLength, g_pmdl_ReturnLength);
        }


        if(g_pmdl_MemoryInformation)
        {
                IoFreeMdl(g_pmdl_MemoryInformation);
        }


        if (g_pmdl_ReturnLength)
        {
                IoFreeMdl(g_pmdl_ReturnLength);
        }
       




        return 0;


}






  NTSTATUS   R0_ZwQueryVirtualMemory(
        __in HANDLE ProcessHandle,
        __in PVOID BaseAddress,
        __in MEMORY_INFORMATION_CLASS MemoryInformationClass,
        __out_bcount(MemoryInformationLength) PVOID MemoryInformation,
        __in SIZE_T MemoryInformationLength,
        __out_opt PSIZE_T ReturnLength
)
{  
          NTSTATUS retstatus = 0;
          HANDLE dwPid = HandleToPid(PsGetCurrentProcessId(),ProcessHandle); //获取游戏进程PID


          PEPROCESS Seleted_pEPROCESS = NULL;
          //KdPrint(("yjx:sys64  pid=%d pBase=%p  %s 行号=%d\n", dwPid, pBase, __FUNCDNAME__, __LINE__));


          retstatus = PsLookupProcessByProcessId((PVOID)(UINT_PTR)(dwPid), &Seleted_pEPROCESS);
          if (retstatus == STATUS_SUCCESS)
          {


                  retstatus = R0_ZwQueryVirtualMemory2(Seleted_pEPROCESS, BaseAddress, MemoryInformationClass, MemoryInformation, MemoryInformationLength, ReturnLength);
                  ObDereferenceObject(Seleted_pEPROCESS);
                  //return retstatus;
          }
          else
          {


                  KdPrint(("yjx R0-> Error ->%s line=%d\n", __FUNCDNAME__, __LINE__));
                  //__debugbreak();
                  //return STATUS_UNSUCCESSFUL;
          }


          return 1;
};




NTSTATUS IRP_R0_ZwQueryVirtualMemory(PIRP pirp)
{
        NTSTATUS retstatus = 0;
        PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(pirp); //获取应用层传来的参数
        UINT64* 缓冲区 = (UINT64*)(pirp->AssociatedIrp.SystemBuffer);
        //KdPrint(("yjx:sys->%s 行号%d\n", __FUNCDNAME__, __LINE__));
        if (缓冲区)
        {
                //
#pragma pack(push)
#pragma pack(8)
                typedef struct _TINPUT_BUF_ZwQueryVirtualMemory
                {
                        HANDLE ProcessHandle1;//目标进程句柄
                        PVOID BaseAddress2; //目标进程地址
                        UINT64 MemoryInformationClass3;//要读取的长度
                        PVOID MemoryInformation4;
                        UINT64 MemoryInformationLength5;
                        PVOID ReturnLength6;


                }TINPUT_BUF_ZwQueryVirtualMemory;
#pragma pack(pop)
                //结构
                //结构
                TINPUT_BUF_ZwQueryVirtualMemory* pbuf = (TINPUT_BUF_ZwQueryVirtualMemory*)缓冲区;
                UINT64*输出缓冲区 = (UINT64*)缓冲区;
                retstatus = R0_ZwQueryVirtualMemory(
                        pbuf->ProcessHandle1,
                        pbuf->BaseAddress2,
                        pbuf->MemoryInformationClass3,
                        pbuf->MemoryInformation4,
                        pbuf->MemoryInformationLength5,
                        pbuf->ReturnLength6);


                pirp->IoStatus.Status = retstatus;
                if (retstatus == STATUS_SUCCESS)
                {
                        输出缓冲区[0] = TRUE;
                }
                else
                {
                        //不成功  之前是这里出的问题么?
                        输出缓冲区[0] = FALSE;
                        KdPrint(("yjx:sys->Error %s  line=%d\n", __FUNCDNAME__, __LINE__));
                        //__debugbreak();


                }


        }
        irpStack;


        pirp->IoStatus.Information = sizeof(UINT64);//返回给DeviceIoControl中的 倒数第二个参数lpBytesReturned        同时也是输出缓冲区返回字节数
        IoCompleteRequest(pirp, IO_NO_INCREMENT);//调用方已完成所有I/O请求处理操作 并且不增加优先级
        return STATUS_SUCCESS;
}


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-1-18 18:43 , Processed in 0.043201 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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