инжект из кернел мода

Тема в разделе "WASM.NT.KERNEL", создана пользователем qwqwqwqw, 13 апр 2009.

  1. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    Great, ты имеешь ввиду, что при использовании используемого мной метода я работаю не с копией страницы?
     
  2. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    Great: изменит ли ситуацию востановление оригинального кода (предварительно сохранив его в буфер) после выполнения прописанного мною кода в точке входа?
     
  3. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    Great: вопрос касаемо твоего ответа "ибо ты будешь писать напрямую в менеджер кэша и изменения будут скидываться на диск. ". Почему же тогда настроенные в модуле релоки не сбрасываются на диск при зугрузке модуля "без вмешательства"??
     
  4. wasm_test

    wasm_test wasm test user

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

    Не все страницы представлены в оригинале, для некоторых уже есть копии

    Это костыль)
     
  5. Sima

    Sima New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2011
    Сообщения:
    4
    Всем привет. Пытаюсь запустить юзермодный процесс из драйвера. Делаю как советовал x64
    Код вызова CreateProcess пока не лепил - в исполняемой функции 4 nop'a и ret
    На тестовой машине Windows 7 x86 запускаю Windbg и аттачусь к csrss.exe Иногда система виснет, а иногда аттачится нормально. Ну не в этом суть. Отпускаю бряк. Запускаю драйвер. Вызовы всех функций происходят успешно. На тестовой машине csrss.exe в моем новом потоке происходит исключение до первой инструкции
    Код (Text):
    1. (164.264): Access violation - code c0000005 (first chance)
    2. First chance exceptions are reported before any exception handling.
    3. This exception may be expected and handled.
    4. eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=00000000
    5. eip=01b808c0 esp=01c2fffc ebp=00000000 iopl=0         nv up ei pl nz na po nc
    6. cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010202
    7. 01b808c0 90              nop
    В коде для создания треда делаю следующее:
    1) Ищу указатели на неэкспортируемые функции
    2) Открываю процесс через ZwOpenProcess
    3) Выделяю MDL с помощью IoAllocateMdl для памяти с функцией, которую поток должен исполнить
    4) Лочу страницы в памяти MmProbeAndLockPages
    5) Аттачусь к процессу KeStackAttachProcess
    6) Проецирую в адресное пространоство процесса через MmMapLockedPagesSpecifyCache
    7) Копирую в отображенную память собсно код функции
    8) Деаттачусь от процесса
    9) Начинаю собирать юзермодный стек как описано в примере у Неббета (здесь проще выложить сорцы)
    Код (Text):
    1.    
    2. [...]
    3.         stackSizeRes = 0x00040000;
    4.         stackSizeCom = 0x00003000;
    5. [...]
    6.         memset( &userStack, 0, sizeof(userStack) );
    7.  
    8.     status = ZwAllocateVirtualMemory(
    9.                 hCsrss,
    10.                 &userStack.ExpandableStackBottom,
    11.                 0,
    12.                 &stackSizeRes,
    13.                 MEM_RESERVE,
    14.                 PAGE_READWRITE
    15.                 );
    16. [...]
    17.     userStack.ExpandableStackBase = (PUCHAR)userStack.ExpandableStackBottom + stackSizeRes;
    18.     userStack.ExpandableStackLimit = (PUCHAR)userStack.ExpandableStackBase - stackSizeCom;
    19.     n = stackSizeCom + PAGE_SIZE;
    20.     pBase = (PUCHAR)userStack.ExpandableStackBase - n;
    21.  
    22.     status = ZwAllocateVirtualMemory(
    23.                 hCsrss,
    24.                 &pBase,
    25.                 0,
    26.                 &n,
    27.                 MEM_COMMIT,
    28.                 PAGE_READWRITE
    29.                 );
    30. [...]
    31.  
    32.     status = pZwProtectVirtualMemory(
    33.                 hCsrss,
    34.                 &pBase,
    35.                 &n,
    36.                 PAGE_READWRITE | PAGE_GUARD,
    37.                 &oldProtect
    38.                 );
    39. [...]
    10) Контекст такой:
    Код (Text):
    1.     threadCtx.ContextFlags = CONTEXT_FULL;
    2.     threadCtx.SegGs = 0x0;
    3.     threadCtx.SegFs = 0x3b;
    4.     threadCtx.SegEs = 0x23;
    5.     threadCtx.SegDs = 0x23;
    6.     threadCtx.SegSs = 0x23;
    7.     threadCtx.SegCs = 0x1b;
    8.     threadCtx.EFlags = 0x3000;
    9.     threadCtx.Esp = (ULONG)userStack.ExpandableStackBase - 4;
    10.     threadCtx.Eip = (ULONG)pMappedAddr;
    11) Далее IoAllocateMdl для threadCtx
    12) MmProbeAndLockPages для MDL
    13) ZwCreateThread
    14) ZwResumeThread
    Спасибо за помощь
     
  6. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Sima
    csrss - я бы делал логично, без извратов. Потоки там есть, юзермодные потоки, рит етц мы не рассматриваем. Потоки там что то ждут. Ждут они на портах. Порт именован. Референс мы выполнить можем. Также определить серверный поток. И стек его мы имеем. А сообщение очень просто шлётся на порт. Вот и всё решение. Несколько строк кода.
     
  7. Sima

    Sima New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2011
    Сообщения:
    4
    Malfoy, спасибо, попробую. Однако хотелось бы все равно понять, в чем причина. x64 написал, значит оно работает по крайней мере у него :)
     
  8. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    Sima
    память там неисполняемая, dep уже везде хардварный есть.