Не занл куда запостить так чторешил сюда пытаясь разобраться с программирование в режиме ядра решил написать драйверок просто для обучения но мож и потом пригодиться кароче есть драйвер (заранее извиняюсь за дурацкую манеру программировать сначало накидаю чтоб работало потом уже причесываю привычка со школы осталось не как не поборю ) Код (Text): struct _for_thear { PPEB pPeb; HANDLE hProcess; }; #pragma pack( push, 1 ) typedef struct _old_far { DWORD first; WORD second; }old1,*pold1; #pragma pack( pop ) typedef NTSTATUS (*ZWPROTECTVERTUALMEMORY)( IN HANDLE ProcessHandle, IN OUT PVOID *BaseAddress, IN OUT PULONG ProtectSize, IN ULONG NewProtect, OUT PULONG OldProtect ); ZWPROTECTVERTUALMEMORY ZwProtect; typedef NTSTATUS (*ZWREADVIRTUALMEMORY) ( IN HANDLE ProcessHandle, IN PVOID BaseAddress, OUT PVOID Buffer, IN ULONG BufferLength, OUT PULONG ReturnLength OPTIONAL ); ZWREADVIRTUALMEMORY ZwReadVirtualMemory; ...... VOID Test(PVOID a) { ULONG old = 0,zap=6,read=NULL;; old1 oldcod={0,0}; PVOID adr=NULL,ad=NULL; struct _for_thear *curr=(struct _for_thear*)a; adr=ListModules(L"KERNEL32.DLL",curr->pPeb); //адрес правильный ad=KernelGetProcAddres(adr,"CreateProcessW"); // адрес правильный ZwProtect =(ZWPROTECTVERTUALMEMORY)(KeServiceDescriptorTable->ServiceTable[SdtNumber("ZwProtectVirtualMemory")]); NTSTATUS st=ZwProtect(curr->hProcess,&ad,&zap,PAGE_READWRITE|PAGE_GUARD,&old); DbgPrint("Status Protect 0x%.8x\n",st); ZwReadVirtualMemory=(ZWREADVIRTUALMEMORY)(KeServiceDescriptorTable->ServiceTable[SdtNumber("ZwReadVirtualMemory")]); NTSTATUS stZwReadMemory=ZwReadVirtualMemory(curr->hProcess,ad,&oldcod,sizeof(old1),&read); DbgPrint("Status stZwReadMemory 0x%X\n",stZwReadMemory); PsTerminateSystemThread(STATUS_SUCCESS); } NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { NTSTATUS status; KAPC_STATE ApcState; PEPROCESS pEPRO; status=PsLookupProcessByProcessId((PVOID)GetPidByName(L"explorer.exe"),&pEPRO); HANDLE hProcess,hThread; OBJECT_ATTRIBUTES objAtr; CLIENT_ID clID; __try { KeStackAttachProcess ((PKPROCESS)pEPRO,&ApcState); InitializeObjectAttributes(&objAtr,NULL,0,NULL,NULL); clID.UniqueProcess=(HANDLE)GetPidByName(L"explorer.exe"); clID.UniqueThread=(HANDLE)0; NTSTATUS stat=ZwOpenProcess (&hProcess,PROCESS_ALL_ACCESS,&objAtr,&clID); if(!NT_SUCCESS(stat)) { DbgPrint("ZwOpenProcess() ERROR : 0x%.8x\n", stat); return STATUS_UNSUCCESSFUL; } struct _for_thear stThead; stThead.hProcess=hProcess; stThead.pPeb=pEPRO->Peb; PVOID pCont=&stThead; NTSTATUS ntTreadStat=PsCreateSystemThread(&hThread,THREAD_ALL_ACCESS,&objAtr,hProcess,0,Test,pCont); if(!NT_SUCCESS(ntTreadStat)) { DbgPrint("PsCreateSystemThread ERROR : 0x%.8x\n", ntTreadStat); } KeUnstackDetachProcess (&ApcState); } __except(EXCEPTION_EXECUTE_HANDLER) { DbgPrint("EXCEPTION_EXECUTE_HANDLER KeAttachProcess 0x%X",&pEPRO); } ZwClose(hProcess); ZwClose(hThread); ObDereferenceObject(pEPRO); DriverObject->DriverUnload=Unload; return STATUS_SUCCESS; } Так в стартовой функции потока Test функция ZwReadVirtualMemory Код (Text): NTSTATUS stZwReadMemory=ZwReadVirtualMemory(curr->hProcess,ad,&oldcod,sizeof(old1),&read); возврашает Status stZwReadMemory 0x8000000D то биш Запрос ReadProcessMemory или WriteProcessMemory был выполнен только частично. Не подскажите в чем может быть причина или носом ткните где почитать можно. За ренее благодарен.
DbgPrint("Read is 0x%X\n",read); показывет 0x0 смотрю память по адресу переменной тоже ноль f74aed98 00 00 00 00 00