Доброго времени суток! Сейчас написал код, делающий всё, как в статье "Как стать невидимым в Windows NT" http://wasm.ru/article.php?article=hidingnt Конкретно делаю следующее: Сначала я получаю слепок текущих процессов системы и заражаю текущие процессы: CreateToolhelp32Snapshot / Process32First / Process32Next. Внедрение кода в новые процессы происходит с помощью функции CreateRemoteThread. Код, который инжектится, хукает NtResumeThread, чтобы ловить создание новых процессов. Когда создаётся новый процесс, в обработчике функции NtResumeThread сначала снимаю с неё хук, потом выполняю CreateRemoteThread с кодом, основной целью которого является хук LdrInitializeThunk, далее возвращаю хук на NtResumeThread. До этого момента всё работает замечательно. *OK* Проблема заключается в установки хука на LdrInitializeThunk в дочернем процессе. Дело в том, что я могу использовать функции лишь из ntdll.dll, в коде, который внедряю в дочений процесс через CreateRemoteThread. Однако, существует проблемка. В коде установки хука, я использую функцию NtProtectVirtualMemory. Было замечено, что если включена проактивка COMODO Defence+, то при вызове этой функции всё нахрен падает, ибо проактивка тоже сплайсит её и как-то неправильно с ней работает. Лечится это анхуком NtProtectVirtualMemory. Однако, чтобы это сделать, нужно использовать функции : CreateFileMapping / MapViewOfFile. А они не из ntdll.dll. Как быть-то? Ща надо дизасмить CreateFileMapping и MapViewOfFile и смотреть какие они функции из ntdll.dll юзают или что? Никто не сталкивался?
o14189 Нихрена понять не могу в чём дело: Код (Text): //NTSYSAPI //NTSTATUS //NTAPI //NtQuerySystemEnvironmentValue( //IN PUNICODE_STRING VariableName, OUT PWCHAR Value, IN ULONG ValueBufferLength, OUT PULONG RequiredLength OPTIONAL ); #define DECLARE_CONST_UNICODE_STRING(_var, _string) \ const WCHAR _var ## _buffer[] = _string; \ const UNICODE_STRING _var = { sizeof(_string) - sizeof(WCHAR), sizeof(_string), (PWCH) _var ## _buffer } // ... DECLARE_CONST_UNICODE_STRING(VariableName, L"SystemRoot"); WCHAR Value[MAX_PATH]; DWORD RequiredLength; NTSTATUS ntstat = (NTSTATUS)GNtQuerySystemEnvironmentValue(&VariableName, Value, MAX_PATH, &RequiredLength); ntstat == 0xc0000061 // STATUS_PRIVILEGE_NOT_HELD Что за? Хотя это работает нормально: Код (Text): char l_strSingleVal[MAX_PATH]; GetEnvironmentVariable("SystemRoot", l_strSingleVal, MAX_PATH);
Т.е. мне из usermode'а никак не получить путь до папки Windows, используя функции из ntdll.dll? // Запускаю из под Windows7 с выключенным UAC
Сейчас посмотрел на ветви реестра: HKEY_CURRENT_USER\Environment HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment Там нигде нет SystemRoot. Хотя, в cmd.exe -> set она есть. Что за?
o14189 Я попробовал затестить: Код (Text): SetLastError(0); HANDLE hFile = CreateFileA("\\SystemRoot\\System32\\ntdll.dll",GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); DWORD dwErr = GetLastError(); // ERROR_PATH_NOT_FOUND Или ... нужно юзать из ntdll функции для работы с файлами и тогда такие пути будут нормально распознаваться?
> Совершенно верно, CreateFile() не умеет работать с Native-именами. не правда, попробуй CreateFile с именем "\\\\?\\globalroot\\systemroot\\system32\\winlogon.exe".
Это ты мне? Ну тогда попробуй NtOpenFile() с именем "\\\\?\\globalroot\\systemroot\\system32\\winlogon.exe".
> Совершенно верно, CreateFile() не умеет работать с Native-именами. Это я тебе. При чём тут NtOpenFile?
C GetProcAddress понятно - можно через PIMAGE_EXPORT_DIRECTORY достать. А вот что делать с LoadLibrary ...
Ух жесть. Просто не могу понять в чём дело. Код (Text): #define OBJ_CASE_INSENSITIVE 0x00000040L #define FILE_NON_DIRECTORY_FILE 0x00000040 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7 #define OBJ_KERNEL_HANDLE 0x00000200L #define FILE_SUPERSEDE 0x00000000 #define FILE_DIRECTORY_FILE 0x00000001 #define FILE_CREATE 0x00000002 #define InitializeObjectAttributes( p, n, a, r, s ) { \ (p)->Length = sizeof( OBJECT_ATTRIBUTES ); \ (p)->RootDirectory = r; \ (p)->Attributes = a; \ (p)->ObjectName = n; \ (p)->SecurityDescriptor = s; \ (p)->SecurityQualityOfService = NULL; \ } #define FILE_RANDOM_ACCESS 0x00000800 // ... HANDLE hFile = NULL; UNICODE_STRING usFilePath; if (!GRtlCreateUnicodeString(&usFilePath, L"\\\\?\\globalroot\\systemroot\\system32\\winlogon.exe")) { // ... } OBJECT_ATTRIBUTES ObjectAttributes; InitializeObjectAttributes(&ObjectAttributes, &usFilePath, OBJ_CASE_INSENSITIVE, 0, NULL); IO_STATUS_BLOCK IoStatusBlock; NTSTATUS stat = NtOpenFile(&hFile, GENERIC_READ, &ObjectAttributes, &IoStatusBlock, FILE_SHARE_READ, FILE_NON_DIRECTORY_FILE | FILE_RANDOM_ACCESS); GRtlFreeUnicodeString(&usFilePath); stat == 0xc0000033, STATUS_OBJECT_NAME_INVALID В чём же дело? =)