чтение user-mode памяти

Тема в разделе "WASM.BEGINNERS", создана пользователем yurza, 17 июл 2009.

  1. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Не занл куда запостить так чторешил сюда пытаясь разобраться с программирование в режиме ядра решил написать драйверок просто для обучения но мож и потом пригодиться кароче есть драйвер (заранее извиняюсь за дурацкую манеру программировать сначало накидаю чтоб работало потом уже причесываю привычка со школы осталось не как не поборю :) )

    Код (Text):
    1. struct _for_thear {
    2.     PPEB     pPeb;
    3.     HANDLE   hProcess;
    4. };
    5. #pragma pack( push, 1 )
    6.  
    7. typedef struct _old_far
    8. {
    9.   DWORD first;
    10.   WORD second;
    11. }old1,*pold1;
    12.  
    13. #pragma pack( pop )
    14.  
    15. typedef NTSTATUS (*ZWPROTECTVERTUALMEMORY)(
    16.                                     IN HANDLE ProcessHandle,
    17.                                     IN OUT PVOID *BaseAddress,
    18.                                     IN OUT PULONG ProtectSize,
    19.                                     IN ULONG NewProtect,
    20.                                     OUT PULONG OldProtect
    21.                                         );
    22.  
    23. ZWPROTECTVERTUALMEMORY ZwProtect;
    24.  
    25. typedef NTSTATUS (*ZWREADVIRTUALMEMORY) (
    26.                                     IN HANDLE ProcessHandle,
    27.                                     IN PVOID BaseAddress,
    28.                                     OUT PVOID Buffer,
    29.                                     IN ULONG BufferLength,
    30.                                     OUT PULONG ReturnLength OPTIONAL
    31.                                         );
    32.  
    33. ZWREADVIRTUALMEMORY ZwReadVirtualMemory;
    34.  
    35. ......
    36.  
    37. VOID Test(PVOID a)
    38. {
    39. ULONG old = 0,zap=6,read=NULL;;
    40. old1 oldcod={0,0};
    41. PVOID adr=NULL,ad=NULL;
    42. struct _for_thear *curr=(struct _for_thear*)a;
    43. adr=ListModules(L"KERNEL32.DLL",curr->pPeb);    //адрес правильный
    44. ad=KernelGetProcAddres(adr,"CreateProcessW"); // адрес правильный
    45.  
    46. ZwProtect =(ZWPROTECTVERTUALMEMORY)(KeServiceDescriptorTable->ServiceTable[SdtNumber("ZwProtectVirtualMemory")]);
    47. NTSTATUS st=ZwProtect(curr->hProcess,&ad,&zap,PAGE_READWRITE|PAGE_GUARD,&old);
    48. DbgPrint("Status Protect 0x%.8x\n",st);
    49. ZwReadVirtualMemory=(ZWREADVIRTUALMEMORY)(KeServiceDescriptorTable->ServiceTable[SdtNumber("ZwReadVirtualMemory")]);
    50. NTSTATUS stZwReadMemory=ZwReadVirtualMemory(curr->hProcess,ad,&oldcod,sizeof(old1),&read);
    51. DbgPrint("Status stZwReadMemory 0x%X\n",stZwReadMemory);
    52. PsTerminateSystemThread(STATUS_SUCCESS);
    53. }
    54.  
    55. NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject,
    56.                       IN PUNICODE_STRING RegistryPath  )
    57. {
    58. NTSTATUS status;
    59. KAPC_STATE ApcState;
    60. PEPROCESS pEPRO;
    61. status=PsLookupProcessByProcessId((PVOID)GetPidByName(L"explorer.exe"),&pEPRO);
    62. HANDLE hProcess,hThread;
    63. OBJECT_ATTRIBUTES objAtr;
    64. CLIENT_ID clID;
    65. __try
    66. {
    67. KeStackAttachProcess ((PKPROCESS)pEPRO,&ApcState);
    68. InitializeObjectAttributes(&objAtr,NULL,0,NULL,NULL);
    69. clID.UniqueProcess=(HANDLE)GetPidByName(L"explorer.exe");
    70. clID.UniqueThread=(HANDLE)0;
    71. NTSTATUS stat=ZwOpenProcess (&hProcess,PROCESS_ALL_ACCESS,&objAtr,&clID);
    72.  if(!NT_SUCCESS(stat))
    73.  {
    74.  DbgPrint("ZwOpenProcess() ERROR : 0x%.8x\n", stat);
    75.  return STATUS_UNSUCCESSFUL;
    76.  }
    77.  struct _for_thear stThead;
    78.  stThead.hProcess=hProcess;
    79.  stThead.pPeb=pEPRO->Peb;
    80.  PVOID pCont=&stThead;
    81. NTSTATUS ntTreadStat=PsCreateSystemThread(&hThread,THREAD_ALL_ACCESS,&objAtr,hProcess,0,Test,pCont);
    82. if(!NT_SUCCESS(ntTreadStat))
    83.  {
    84.  DbgPrint("PsCreateSystemThread ERROR : 0x%.8x\n", ntTreadStat);
    85.  }
    86.  
    87. KeUnstackDetachProcess (&ApcState);
    88. }
    89. __except(EXCEPTION_EXECUTE_HANDLER)
    90.             {
    91.                 DbgPrint("EXCEPTION_EXECUTE_HANDLER KeAttachProcess 0x%X",&pEPRO);
    92.             }
    93. ZwClose(hProcess);
    94. ZwClose(hThread);
    95. ObDereferenceObject(pEPRO);
    96. DriverObject->DriverUnload=Unload;
    97. return STATUS_SUCCESS;
    98. }
    Так в стартовой функции потока Test функция ZwReadVirtualMemory
    Код (Text):
    1. NTSTATUS stZwReadMemory=ZwReadVirtualMemory(curr->hProcess,ad,&oldcod,sizeof(old1),&read);
    возврашает
    Status stZwReadMemory 0x8000000D то биш
    Запрос ReadProcessMemory или WriteProcessMemory был выполнен только частично.
    Не подскажите в чем может быть причина или носом ткните где почитать можно.

    За ренее благодарен.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А сколько байт фактически прочитано? read переменная
     
  3. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    DbgPrint("Read is 0x%X\n",read); показывет 0x0
    смотрю память по адресу переменной тоже ноль
    f74aed98 00 00 00 00 00