ошибка при работе с памятью

Тема в разделе "WASM.BEGINNERS", создана пользователем loginrl_103, 25 май 2008.

  1. loginrl_103

    loginrl_103 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    271
    из драйвера использую типичное KeStackAttachProcess для присоединения к процессу. далее идёт вызов функции ниже

    Код (Text):
    1. HANDLE CreateUserThread(IN HANDLE hProcess,IN PVOID EntryPoint)
    2. {
    3.     USER_STACK        Stack = {0};
    4.     CONTEXT           Context;
    5.     NTSTATUS          Status;
    6.     ULONG             AllocSize = PAGE_SIZE * 2;
    7.     PVOID             p;
    8.     ULONG             OldProtect;
    9.     HANDLE            hThread = (HANDLE)0;
    10.     CLIENT_ID         Cid;
    11.     ZwCreateThread *pZwCreateThread;
    12.     Status = ZwAllocateVirtualMemory(hProcess,&Stack.ExpandableStackBottom,0,&AllocSize,MEM_RESERVE,PAGE_READWRITE);
    13.     if(NT_SUCCESS(Status))
    14.     {
    15.         Stack.ExpandableStackBase = (PUCHAR) Stack.ExpandableStackBottom + PAGE_SIZE;
    16.         Stack.ExpandableStackLimit = Stack.ExpandableStackBase;
    17.  
    18.         AllocSize = PAGE_SIZE;
    19.         p = (PCHAR)Stack.ExpandableStackBase - AllocSize;
    20.  
    21.         Status = ZwAllocateVirtualMemory(hProcess,&p,0,&AllocSize,MEM_COMMIT,PAGE_READWRITE);
    22.  
    23.         if(NT_SUCCESS(Status))
    24.       {
    25.             AllocSize = PAGE_SIZE;
    26.             if(NT_SUCCESS(Status))
    27.         {
    28.                 PVOID pMem;
    29.                 PMDL pMdl;
    30.                 PVOID pUserMem;
    31.                 PVOID pStack;
    32.                 PVOID pCode;
    33.                 CONTEXT* pContext;
    34.            
    35.                 pMem = ExAllocatePool(NonPagedPool, ALL_MEM);
    36.                 if (NULL == pMem)
    37.                 {
    38.                  DbgPrint("Can't ExAllocatePool");
    39.                  return NULL;
    40.                 }
    41.  
    42.                 pMdl = IoAllocateMdl(pMem, ALL_MEM, FALSE, FALSE, NULL);
    43.                 if (NULL == pMdl)
    44.                 {
    45.                  ExFreePool(pMem);
    46.                  DbgPrint("Can't IoAllocateMdl");
    47.                  return NULL;
    48.                 }
    49.                
    50.                 MmProbeAndLockPages(pMdl, KernelMode, IoWriteAccess);
    51.                 pUserMem = MmMapLockedPagesSpecifyCache(pMdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority);
    52.                 if (NULL != pUserMem)
    53.                 {  
    54.                     pStack = pUserMem;
    55.                     pContext = (CONTEXT*)((ULONG_PTR)pUserMem + STACK_SIZE);
    56.                     pCode = (PVOID)((ULONG_PTR)pUserMem + STACK_SIZE + sizeof(CONTEXT));
    57.                     Stack.ExpandableStackBottom = Stack.ExpandableStackLimit = pStack;
    58.                     Stack.ExpandableStackBase = (PVOID)( (ULONG_PTR)pStack + STACK_SIZE);
    59.                     RtlZeroMemory(pContext, sizeof(CONTEXT));
    60.                     pContext->ContextFlags = CONTEXT_FULL;
    61.                     pContext->SegGs = 0;
    62.                     pContext->SegFs = 0x3B;
    63.                     pContext->SegEs = 0x23;
    64.                     pContext->SegDs = 0x23;
    65.                     pContext->SegSs = 0x23;
    66.                     pContext->SegCs = 0x1B;
    67.                     pContext->EFlags = 0x3000;
    68.                     pContext->Esp = (ULONG)Stack.ExpandableStackBase - 4;
    69.                     pContext->Eip = (ULONG_PTR)pCode;
    70.                
    71.                     pZwCreateThread = (ZwCreateThread *)0x8057F262;//хардхорный адрес zwcreatethread
    72.                     Status = pZwCreateThread (&hThread, THREAD_ALL_ACCESS, NULL, hProcess, &Cid, &Context,                                        &Stack, FALSE);
    73.                     DbgPrint ("create thread: 0x%08X\n", Status);
    74.                 }
    75.                  else
    76.                 {
    77.                  DbgPrint ("Can't MmMapLockedPagesSpecifyCache\n");
    78.                 }
    79.                 __try
    80.                 {
    81.                     MmUnmapLockedPages(pUserMem, pMdl);
    82.                     MmUnlockPages(pMdl);
    83.                     IoFreeMdl(pMdl);
    84.                 }
    85.                 __except(EXCEPTION_EXECUTE_HANDLER)
    86.                 {
    87.                  DbgPrint("error unlock/free memory\n");
    88.                 }
    89.  
    90.                  ExFreePool(pMem);
    91.                  if(NT_SUCCESS(Status)) {return hThread;}
    92.             }
    93.  
    94.             AllocSize = 0;
    95.             ZwFreeVirtualMemory(hProcess,&p,&AllocSize,MEM_RELEASE);
    96.         }
    97.         AllocSize = PAGE_SIZE * 2;
    98.         ZwFreeVirtualMemory(hProcess,&Stack.ExpandableStackBottom,&AllocSize,MEM_DECOMMIT);
    99.         return NULL;
    100.     }
    101.     return NULL;
    102. }
    бсодит на MmUnlockPages(pMdl); IoFreeMdl(pMdl); почему - незнаю(. если не делать вызов zwcreatethread то бсодит на KeUnstackDetachProcess...

    почти наверняка ошибки при работе с памятью. вероятные причины
    1) проблема в уровне IRQL
    2) аргументы usermode/kernelmode MmProbeAndLockPages/MmMapLockedPagesSpecifyCache..мне кажется что проблема именно здесь из-за приаттаченного процесса.
    3) что-то ещё

    кто сталкивался с такой проблемой и кто что может подсказать?
     
  2. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    loginrl_103
    1) seh вообще-то работает только при обращении PagedPool памяти, поэтому если выделяешь NonPagedPool использование блока try-except не нужно.
    2) bugcheck какой хоть?
     
  3. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
    На единственном ассемблерном сайте начинающие извращенци засрали все форумы. Доколе ?
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ZwCreateThread деатачится от процесса.
     
  5. loginrl_103

    loginrl_103 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    271
    steelfactor - сразу же ребут. без синего экрана

    n0name - не понял. если анлок и деаттач не делать, то ничего не вылетает...не совсем понял тебя вообщем...
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Когда пробуешь деаттачится, процесс уже деаттачен.
     
  7. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    loginrl_103
    На самом деле, минидамп у тебя создается, просто настройки системы такие, ребутиться без "показа" синего экрана.
     
  8. loginrl_103

    loginrl_103 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    271
    steelfactor - спасибо, у меня дамп вообще отключен был)

    n0name писал "ZwCreateThread деатачится от процесса. Когда пробуешь деаттачится, процесс уже деаттачен."

    в ddk сказано к MmUnmapLockedPages

    те когда пробую вызвать анмап я должен находится в контексте процесса (если контекст неправильный то могет произойти удаление из случайного процесса )...но zwcreatethread уже деаттачен... тем не менее при вызове MmUnmapLockedPages бсода нету (что уже радует) ...невьезжаю). анмап сам происходит уже чтоли?