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