странности с ZwAllocateVirtualMemory

Тема в разделе "WASM.NT.KERNEL", создана пользователем agent007, 28 мар 2007.

  1. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    в общем, ставлю свой калбек на ImageLoadNotify
    Код (Text):
    1. VOID ImageLoadNotify(IN PUNICODE_STRING FullImageName,IN HANDLE ProcessId,IN PIMAGE_INFO ImageInfo) {
    2.     if(r_wcsncmp((PWCHAR) FullImageName->Buffer,L"wininet.dll")) {
    3.         DbgPrint("WININET FOUND");
    4.         if(NT_SUCCESS(WriteShell(ProcessId))) {
    5.             DbgPrint("writeshell ok");
    6.         }
    7.     }
    8. }
    затем...
    Код (Text):
    1. NTSTATUS WriteShell(IN HANDLE ProcessId) {
    2.     HANDLE hProcess;
    3.     CLIENT_ID ClientId;
    4.     OBJECT_ATTRIBUTES ObjectAttributes;
    5.     ULONG uPageSize = 1024,uShellSize;
    6.     PVOID BaseAddress = NULL,ShellAddress = NULL;
    7.     ClientId.UniqueProcess = ProcessId;
    8.     ClientId.UniqueThread = 0;
    9.     RtlZeroMemory(&ObjectAttributes,sizeof(OBJECT_ATTRIBUTES));
    10.     if(!NT_SUCCESS(ZwOpenProcess(&hProcess,PROCESS_DUP_HANDLE,&ObjectAttributes,&ClientId))) {
    11.         DbgPrint("ZwOpenProcess - failed");
    12.         return STATUS_UNSUCCESSFUL;
    13.     }
    14. if(!NT_SUCCESS(ZwAllocateVirtualMemory(hProcess,&BaseAddress,0,&uPageSize,MEM_COMMIT,PAGE_READWRITE))) {
    15.         DbgPrint("ZwAllocateVirtualMemory - failed");
    16.         return STATUS_UNSUCCESSFUL;
    17.     }
    18.     DbgPrint("BaseAddress: %0.8X",BaseAddress);
    19.  
    20.     ShellAddress = &ShellCode;
    21.     uShellSize = 10;
    22.     if(!NT_SUCCESS(ZwWriteVirtualMemory(hProcess,BaseAddress,ShellAddress,uShellSize,0))) {
    23.         DbgPrint("ZwWriteVirtualMemory - failed");
    24.         return STATUS_UNSUCCESSFUL;
    25.     }
    26.  
    27.     return STATUS_SUCCESS;
    28. }
    вот вся трабла в том, что когда идет вызов ZwAllocateVirtualMemory у меня в ней "зависает", т.е. аналогично вечному лупу ) процесс, в котором выделяю память при этом 100% проца хавает.... и невозможно потом выгрузить дровину.... в чем грабли?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    не в тему, но строки лучше сравнивать через RtlCompareUnicodeString, чем через wcscmp
    который из двух
     
  3. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    там функция малость другая. она с конца сравнивает :)
    а где ты видешь второй вызов?
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    мда.. глюк) пойду посплю чтоли
     
  5. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    что никто ничего не скажет??
     
  6. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    у меня подобный код и подобная проблема. также виснет (а потом вылетает) на ZwAllocateVirtualMemory.
    agent007, нашел в чем трабла?
     
  7. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Stub
    протесть вначале код на Ринге 3, посмотри.

    З.Ы. Если по быстрому, то
    Код (Text):
    1. ZwOpenProcess(&hProcess,[b]PROCESS_DUP_HANDLE[/b],&ObjectAttributes,&ClientId)
    может
    PROCESS_VM_OPERATION + PROCESS_VM_READ +PROCESS_VM_WRITE
    Хотя в любом лсучае, это не причина лупа.
     
  8. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    конкретно в данном моем случае я так и не нашел причину лупа. а вообще всю свою идеию реализовал по-другому :)
     
  9. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    dead_body
    И PROCESS_DUP_HANDLE пробовал, и вообще кучу всего перебрал - всеравно глючит. Так вот может есть ограничение в данном случае на использование этой ф-ции? Т.е. когда пытаешься именно из колбэка данного типа вызвать эту ф-цию.
     
  10. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Stub
    вроде нет. Проверь свой код, на Ринге 3, без колббэка. Если будет работать, то тогда или софтайс ставь и смотри или ЛивКД.

    Я сколько функцией пользовался нормально.
     
  11. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    dead_body
    В Ring3 код отлично работает (во всяком случае ничего не виснет :)). Под сайсом в r0 и дебажил.
    ---------------------
    В инете нарыл, что эта ф-ция гонит у всех, когда она вызывается из данного вида коллбэков на этапе загрузки DLL'ок, которые идут после ntdll.dll и kernel32.dll. Как с этим можно бороться?
    ---------------------
    В общем в этом коллбэке вообще нельзя выделить память в процессе никаким известным мне образом (пытался и промапить IoAllocateMdl/MmProbeAndLockPages/MmMapLockedPagesSpecifyCache) - все приводит к одному и тому же результату.