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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 58|回复: 0

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

[复制链接]
发表于 2021-11-17 17:58:37 | 显示全部楼层 |阅读模式

QQ 150330575

#include <ntifs.h>



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

        KAPC_STATE apc_state;
        RtlZeroMemory(&apc_state, sizeof(KAPC_STATE));
        //在所有进程通用
        PVOID tmpBuf_Kernel = ExAllocatePool(NonPagedPool, Length);

        //可以改MDL把 进程地址 映射到 内核驱动也可以
        //中转内存地址 因为 KeStackAttachProcess后 原来的进程R3 Buffer 在目标地址里不存在
        //RtlCopyMemory(tmpBuf_Kernel, Buffer, Length);
        //进入到目标进程的 内存空间
        DbgPrint("yjx:附加到目标进程 Address=%p  Buffer=%p", Address, Buffer);
        //进入目标进程内存空间
        KeStackAttachProcess((PVOID)Process, &apc_state);
        //判断目标地址是否可以访问
        BOOLEAN dwRet = MmIsAddressValid(Address);
        if (dwRet)
        {
                KdPrint(("yjx[sys64] RtlCopyMemory(Address, Buffer, Length);\r\n", Address, Buffer, Length));

                //RtlCopyMemory(Address, tmpBuf_Kernel, Length); //一定要用内核内存 中转
                RtlCopyMemory(tmpBuf_Kernel, Address, Length); // c/c++ memcpy

        }
        else
        {
                KdPrint(("yjx:sys64:Error Line37"));
        }
        //分离目标进程空间 恢复环境
        KeUnstackDetachProcess(&apc_state);
        DbgPrint("yjx: sys分离目标进程");
        RtlCopyMemory(Buffer, tmpBuf_Kernel, Length);
        //DbgPrint("yjx:sys: Buffer[0]=%llx", *(UINT64*)Buffer);;
        ExFreePool(tmpBuf_Kernel);
        return dwRet;
}
//dwPid为目标进程id
//lpBaseAddress 目标进程地址

//lpBuffer 当前进程地址 1
//内核内存地址 当前进程地址 2
int ReadProcessMemoryForPid(UINT32 dwPid, PVOID pBase, PVOID lpBuffer, UINT32 nSize)
{
        //根据pid获取PEPROCESS OpenProcess
        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 = KReadProcessMemory(Seleted_pEPROCESS, (PVOID)pBase, nSize, lpBuffer);
                ObDereferenceObject(Seleted_pEPROCESS);
                if (br)
                {
                        return nSize;
                }
        }
        else
        {
                KdPrint(("yjx sys64 PsLookupProcessByProcessId Fail..."));
        }

        return 0;// STATUS_UNSUCCESSFUL;

}


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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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