www.yabo210.con论坛

快捷导航
广告联系qq1031180668广告位
查看: 206|回复: 0
打印 上一主题 下一主题

[逆向破解/内核驱动] 利用驱动强力读写内存的方法

[复制链接]
  • ta_mind
    擦汗
    2019-3-27 07:25
  • classn_01: 72 classn_02

    [LV.6]常住居民II

    1021

    主题

    1742

    帖子

    3562

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    3562

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    跳转到指定楼层
    楼主
    发表于 2019-7-11 06:25:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    给目标进程的线程插入APC,在APC例程里读写内存。
    #define MALLOC_NPP(_s)? ?? ???ExAllocatePool(NonPagedPool, _s)
    #define FREE(_p)? ?? ???ExFreePool(_p)

    typedef struct _RWPM_INFO
    {
    ? ?? ???void* Address;
    ? ?? ???void* Buffer;
    ? ?? ???SIZE_T Length;
    ? ?? ???SIZE_T Type;//0=read;1=write
    ? ?? ???KEVENT Event;
    }RWPM_INFO, *PRWPM_INFO;

    VOID ReadWriteProcessMemoryApc(PKAPC pApc,PKNORMAL_ROUTINE *NormalRoutine,PVOID *NormalContext,PVOID *SystemArgument1,PVOID *SystemArgument2)
    {
    ? ?? ???PRWPM_INFO pInfo = (PRWPM_INFO)(pApc->NormalContext);
    ? ?? ???if(pInfo->Type==0)
    ? ?? ???{
    ? ?? ?? ?? ?? ? _try
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?RtlCopyMemory(pInfo->Buffer,pInfo->Address,pInfo->Length);
    ? ?? ?? ?? ?? ? }
    ? ?? ?? ?? ?? ? _except(1)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?;
    ? ?? ?? ?? ?? ? }
    ? ?? ???}
    ? ?? ???else
    ? ?? ???{
    ? ?? ?? ?? ?? ? _try
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?_disable();? ?? ???
    ? ?? ?? ?? ?? ?? ?? ?? ?__writecr0(__readcr0() & 0xfffffffffffeffff);? ?? ???
    ? ?? ?? ?? ?? ?? ?? ?? ?RtlCopyMemory(pInfo->Address,pInfo->Buffer,pInfo->Length);
    ? ?? ?? ?? ?? ?? ?? ?? ?__writecr0(__readcr0() | 0x10000);? ?? ???
    ? ?? ?? ?? ?? ?? ?? ?? ?_enable();? ?? ???
    ? ?? ?? ?? ?? ? }
    ? ?? ?? ?? ?? ? _except(1)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?;
    ? ?? ?? ?? ?? ? }
    ? ?? ???}
    ? ?? ???pInfo->Type=2;
    ? ?? ???KeSetEvent(&(pInfo->Event), IO_NO_INCREMENT, FALSE);
    ? ?? ???ExFreePool(pApc);
    }

    NTSTATUS InsertReadWriteProcessMemoryApc(PETHREAD Thread, PRWPM_INFO pInfo)
    {
    ? ?? ???NTSTATUS st = STATUS_UNSUCCESSFUL;
    ? ?? ???PKAPC pApc = 0;
    ? ?? ???if( MmIsAddressValid(Thread) )
    ? ?? ???{
    ? ?? ?? ?? ?? ? pApc = MALLOC_NPP( sizeof(KAPC));
    ? ?? ?? ?? ?? ? if (pApc)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?LARGE_INTEGER interval={0};
    ? ?? ?? ?? ?? ?? ?? ?? ?KeInitializeApc(pApc, Thread, OriginalApcEnvironment, ReadWriteProcessMemoryApc, 0, 0, KernelMode, 0);
    ? ?? ?? ?? ?? ?? ?? ?? ?pApc->NormalContext = pInfo;
    ? ?? ?? ?? ?? ?? ?? ?? ?KeInitializeEvent(&(pInfo->Event),NotificationEvent,TRUE);
    ? ?? ?? ?? ?? ?? ?? ?? ?KeClearEvent(&(pInfo->Event));
    ? ?? ?? ?? ?? ?? ?? ?? ?if(KeInsertQueueApc(pApc, 0, 0, 0))
    ? ?? ?? ?? ?? ?? ?? ?? ?{
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???interval.QuadPart = -10000;//DELAY_ONE_MILLISECOND;
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???interval.QuadPart *= 1000;
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???st = KeWaitForSingleObject(&(pInfo->Event),Executive,KernelMode,0,&interval);
    ? ?? ?? ?? ?? ?? ?? ?? ?}
    ? ?? ?? ?? ?? ?? ?? ?? ?else
    ? ?? ?? ?? ?? ?? ?? ?? ?{
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???ExFreePool(pApc);
    ? ?? ?? ?? ?? ?? ?? ?? ?}
    ? ?? ?? ?? ?? ? }
    ? ?? ???}
    ? ?? ???return st;
    }

    BOOLEAN ForceReadProcessMemory2(IN PEPROCESS Process, IN PVOID Address, IN UINT32 Length, OUT PVOID Buffer)
    {
    ? ?? ???ULONG i;
    ? ?? ???BOOLEAN b = 0;
    ? ?? ???for(i=4; i<1048576; i=i+4)
    ? ?? ???{
    ? ?? ?? ?? ?? ? PETHREAD ethrd=LookupThread((HANDLE)i);
    ? ?? ?? ?? ?? ? if(ethrd!=NULL)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?PEPROCESS eproc=IoThreadToProcess(ethrd);
    ? ?? ?? ?? ?? ?? ?? ?? ?ObDereferenceObject(ethrd);
    ? ?? ?? ?? ?? ?? ?? ?? ?if(eproc==Process)
    ? ?? ?? ?? ?? ?? ?? ?? ?{
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???PRWPM_INFO pInfo = MALLOC_NPP(sizeof(RWPM_INFO));
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???pInfo->Address = Address;
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???pInfo->Buffer = Buffer;
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???pInfo->Length = Length;
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???pInfo->Type = 0;
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if(NT_SUCCESS(InsertReadWriteProcessMemoryApc(ethrd, pInfo)))
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???{
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? FREE(pInfo);
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? b=1;break;
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
    ? ?? ?? ?? ?? ?? ?? ?? ?}
    ? ?? ?? ?? ?? ? }
    ? ?? ???}
    ? ?? ???return b;
    }

    BOOLEAN ForceWriteProcessMemory2(IN PEPROCESS Process, IN PVOID Address, IN UINT32 Length, IN PVOID Buffer)
    {
    ? ?? ???ULONG i;
    ? ?? ???BOOLEAN b = 0;
    ? ?? ???for(i=4; i<1048576; i=i+4)
    ? ?? ???{
    ? ?? ?? ?? ?? ? PETHREAD ethrd=LookupThread((HANDLE)i);
    ? ?? ?? ?? ?? ? if(ethrd!=NULL)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?PEPROCESS eproc=IoThreadToProcess(ethrd);
    ? ?? ?? ?? ?? ?? ?? ?? ?ObDereferenceObject(ethrd);
    ? ?? ?? ?? ?? ?? ?? ?? ?if(eproc==Process)
    ? ?? ?? ?? ?? ?? ?? ?? ?{
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???PRWPM_INFO pInfo = MALLOC_NPP(sizeof(RWPM_INFO));
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???pInfo->Address = Address;
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???pInfo->Buffer = Buffer;
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???pInfo->Length = Length;
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???pInfo->Type = 1;
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if(NT_SUCCESS(InsertReadWriteProcessMemoryApc(ethrd, pInfo)))
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???{
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? FREE(pInfo);
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? b=1;break;
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}
    ? ?? ?? ?? ?? ?? ?? ?? ?}
    ? ?? ?? ?? ?? ? }
    ? ?? ???}
    ? ?? ???return b;
    }
    复制代码
    两点说明:
    1、如果想支持32位系统,需要修改两处__writecr0的代码。
    2、类似LookupProcess、LookupThread这种顾名思义的函数没有提供,需要自己实现(代码不超过20行)。



    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////





    NTSTATUS MMCopyProcessMemory(PEPROCESS tagetProcess,PVOID addr,SIZE_T size,PVOID data)
    {
    ? ?? ???KAPC_STATE ApcState;
    ? ?? ???SIZE_T tosize;
    ? ?? ???PMDL mdl=NULL;
    ? ?? ???PVOID MappedAddress=NULL;
    ? ?? ???BOOLEAN attach = FALSE;
    ? ?? ???BOOLEAN lockpage = FALSE;
    ? ?? ???BOOLEAN maplockpage = FALSE;
    ? ?? ???BOOLEAN havemdl = FALSE;
    ? ?? ???if (size<>
    ? ?? ???{
    ? ?? ?? ?? ?? ? tosize = PAGE_SIZE;
    ? ?? ???}
    ? ?? ???else
    ? ?? ???{
    ? ?? ?? ?? ?? ? tosize = size;
    ? ?? ???}
    ? ?? ???if (!MmIsAddressValid(data))
    ? ?? ???{
    ? ?? ?? ?? ?? ? return STATUS_NOT_MAPPED_DATA;
    ? ?? ???}
    ? ?? ???__try
    ? ?? ???{
    ? ?? ?? ?? ?? ? KeStackAttachProcess(tagetProcess, &ApcState);
    ? ?? ?? ?? ?? ? attach = TRUE;
    ? ?? ?? ?? ?? ? mdl=IoAllocateMdl(addr, tosize, FALSE, FALSE, NULL);
    ? ?? ?? ?? ?? ? if (mdl==NULL)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?KeUnstackDetachProcess(&ApcState);
    ? ?? ?? ?? ?? ?? ?? ?? ?return STATUS_NOT_MAPPED_DATA;
    ? ?? ?? ?? ?? ? }
    ? ?? ?? ?? ?? ? havemdl = TRUE;
    ? ?? ?? ?? ?? ? MmProbeAndLockPages(mdl, KernelMode, IoReadAccess);
    ? ?? ?? ?? ?? ? lockpage = TRUE;
    ? ?? ?? ?? ?? ? MappedAddress = MmMapLockedPagesSpecifyCache(mdl, KernelMode, MmCached, NULL, FALSE, HighPagePriority);
    ? ?? ?? ?? ?? ? maplockpage = TRUE;
    ? ?? ?? ?? ?? ? RtlCopyMemory(data, MappedAddress, size);
    ? ?? ?? ?? ?? ? MmUnmapLockedPages(MappedAddress, mdl);
    ? ?? ?? ?? ?? ? maplockpage = FALSE;
    ? ?? ?? ?? ?? ? MmUnlockPages(mdl);
    ? ?? ?? ?? ?? ? lockpage = FALSE;
    ? ?? ?? ?? ?? ? IoFreeMdl(mdl);
    ? ?? ?? ?? ?? ? havemdl = FALSE;
    ? ?? ?? ?? ?? ? KeUnstackDetachProcess(&ApcState);
    ? ?? ?? ?? ?? ? attach = FALSE;
    ? ?? ???} __except(1)
    ? ?? ???{
    ? ?? ?? ?? ?? ? if (maplockpage)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?MmUnmapLockedPages(MappedAddress, mdl);
    ? ?? ?? ?? ?? ? }
    ? ?? ?? ?? ?? ? if (lockpage)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?MmUnlockPages(mdl);
    ? ?? ?? ?? ?? ? }
    ? ?? ?? ?? ?? ? if (havemdl)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?IoFreeMdl(mdl);
    ? ?? ?? ?? ?? ? }
    ? ?? ?? ?? ?? ? if (attach)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?KeUnstackDetachProcess(&ApcState);
    ? ?? ?? ?? ?? ? }
    ? ?? ?? ?? ?? ? return STATUS_NOT_FOUND;
    ? ?? ???}
    ? ?? ???return STATUS_SUCCESS;
    }

    NTSTATUS MMWriteProcessMemory(PEPROCESS tagetProcess, PVOID addr, SIZE_T size, PVOID data)
    {
    ? ?? ???KAPC_STATE ApcState;
    ? ?? ???SIZE_T tosize;
    ? ?? ???PMDL mdl = NULL;
    ? ?? ???PVOID MappedAddress = NULL;
    ? ?? ???BOOLEAN attach = FALSE;
    ? ?? ???BOOLEAN lockpage = FALSE;
    ? ?? ???BOOLEAN maplockpage = FALSE;
    ? ?? ???BOOLEAN havemdl = FALSE;
    ? ?? ???if (size < PAGE_SIZE)
    ? ?? ???{
    ? ?? ?? ?? ?? ? tosize = PAGE_SIZE;
    ? ?? ???}
    ? ?? ???else
    ? ?? ???{
    ? ?? ?? ?? ?? ? tosize = size;
    ? ?? ???}
    ? ?? ???if (!MmIsAddressValid(data))
    ? ?? ???{
    ? ?? ?? ?? ?? ? return STATUS_NOT_MAPPED_DATA;
    ? ?? ???}
    ? ?? ???__try
    ? ?? ???{
    ? ?? ?? ?? ?? ? KeStackAttachProcess(tagetProcess, &ApcState);
    ? ?? ?? ?? ?? ? attach = TRUE;
    ? ?? ?? ?? ?? ? mdl = IoAllocateMdl(addr, tosize, FALSE, FALSE, NULL);
    ? ?? ?? ?? ?? ? if (mdl == NULL)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?KeUnstackDetachProcess(&ApcState);
    ? ?? ?? ?? ?? ?? ?? ?? ?return STATUS_NOT_MAPPED_DATA;
    ? ?? ?? ?? ?? ? }
    ? ?? ?? ?? ?? ? havemdl = TRUE;
    ? ?? ?? ?? ?? ? MmProbeAndLockPages(mdl, KernelMode, IoReadAccess);
    ? ?? ?? ?? ?? ? lockpage = TRUE;
    ? ?? ?? ?? ?? ? MappedAddress = MmMapLockedPagesSpecifyCache(mdl, KernelMode, MmCached, NULL, FALSE, HighPagePriority);
    ? ?? ?? ?? ?? ? maplockpage = TRUE;
    ? ?? ?? ?? ?? ? RtlCopyMemory(MappedAddress, data, size);
    ? ?? ?? ?? ?? ? MmUnmapLockedPages(MappedAddress, mdl);
    ? ?? ?? ?? ?? ? maplockpage = FALSE;
    ? ?? ?? ?? ?? ? MmUnlockPages(mdl);
    ? ?? ?? ?? ?? ? lockpage = FALSE;
    ? ?? ?? ?? ?? ? IoFreeMdl(mdl);
    ? ?? ?? ?? ?? ? havemdl = FALSE;
    ? ?? ?? ?? ?? ? KeUnstackDetachProcess(&ApcState);
    ? ?? ?? ?? ?? ? attach = FALSE;
    ? ?? ???}
    ? ?? ???__except (1)
    ? ?? ???{
    ? ?? ?? ?? ?? ? if (maplockpage)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?MmUnmapLockedPages(MappedAddress, mdl);
    ? ?? ?? ?? ?? ? }
    ? ?? ?? ?? ?? ? if (lockpage)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?MmUnlockPages(mdl);
    ? ?? ?? ?? ?? ? }
    ? ?? ?? ?? ?? ? if (havemdl)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?IoFreeMdl(mdl);
    ? ?? ?? ?? ?? ? }
    ? ?? ?? ?? ?? ? if (attach)
    ? ?? ?? ?? ?? ? {
    ? ?? ?? ?? ?? ?? ?? ?? ?KeUnstackDetachProcess(&ApcState);
    ? ?? ?? ?? ?? ? }
    ? ?? ?? ?? ?? ? return STATUS_NOT_FOUND;
    ? ?? ???}
    ? ?? ???return STATUS_SUCCESS;
    }

    不积跬步,无以至千里
    游客
    回复
    您需要登录后才可以回帖 登录 | 立即注册

    手机版|Archiver|小黑屋|sitemap| 从零开始,www.yabo210.con论坛 - 一个单纯的www.yabo210.con学习交流论坛 ( 豫ICP备15032706号 )

    GMT+8, 2019-8-11 09:23 , Processed in 1.108857 second(s), 23 queries .

    Powered by Discuz! X3.4

    ? 2001-2013 Comsenz Inc.

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