Проблемы со сплайсингом #2

Тема в разделе "WASM.WIN32", создана пользователем gribodemon, 10 ноя 2009.

  1. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Доброго времени суток!
    Сейчас написал код, делающий всё, как в статье "Как стать невидимым в 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 юзают или что? Никто не сталкивался?
     
  2. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    NtCreateSection/NtMapViewOfSection
     
  3. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    o14189
    Окей, спасибо.
    А как быть с GetSystemDirectory ?
     
  4. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    путь - \SystemRoot\
    переменная окружения - %SystemRoot%
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Этот путь указывает на папку Windows, для системной папки следует использовать \SystemRoot\System32.
     
  6. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    o14189
    Нихрена понять не могу в чём дело:

    Код (Text):
    1. //NTSYSAPI
    2. //NTSTATUS
    3. //NTAPI
    4. //NtQuerySystemEnvironmentValue(
    5. //IN PUNICODE_STRING VariableName, OUT PWCHAR Value, IN ULONG ValueBufferLength, OUT PULONG RequiredLength OPTIONAL );
    6.  
    7. #define DECLARE_CONST_UNICODE_STRING(_var, _string) \
    8. const WCHAR _var ## _buffer[] = _string; \
    9. const UNICODE_STRING _var = { sizeof(_string) - sizeof(WCHAR), sizeof(_string), (PWCH) _var ## _buffer }
    10.  
    11. // ...
    12.  
    13. DECLARE_CONST_UNICODE_STRING(VariableName, L"SystemRoot");
    14. WCHAR Value[MAX_PATH];
    15. DWORD RequiredLength;
    16. NTSTATUS ntstat = (NTSTATUS)GNtQuerySystemEnvironmentValue(&VariableName, Value, MAX_PATH, &RequiredLength);
    ntstat == 0xc0000061 // STATUS_PRIVILEGE_NOT_HELD

    Что за?

    Хотя это работает нормально:

    Код (Text):
    1.     char l_strSingleVal[MAX_PATH];
    2.     GetEnvironmentVariable("SystemRoot", l_strSingleVal, MAX_PATH);
     
  7. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Т.е. мне из usermode'а никак не получить путь до папки Windows, используя функции из ntdll.dll?
    // Запускаю из под Windows7 с выключенным UAC
     
  8. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Сейчас посмотрел на ветви реестра:
    HKEY_CURRENT_USER\Environment
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

    Там нигде нет SystemRoot.
    Хотя, в cmd.exe -> set она есть.

    Что за?
     
  9. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    ну ты даешь)
    юзай тот путь что x64 указал
     
  10. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    o14189

    Я попробовал затестить:

    Код (Text):
    1.     SetLastError(0);
    2.     HANDLE hFile = CreateFileA("\\SystemRoot\\System32\\ntdll.dll",GENERIC_READ, FILE_SHARE_READ,
    3.                         NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
    4.     DWORD dwErr = GetLastError(); // ERROR_PATH_NOT_FOUND
    Или ... нужно юзать из ntdll функции для работы с файлами и тогда такие пути будут нормально распознаваться?
     
  11. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Совершенно верно, CreateFile() не умеет работать с Native-именами.
     
  12. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    > Совершенно верно, CreateFile() не умеет работать с Native-именами.
    не правда, попробуй CreateFile с именем "\\\\?\\globalroot\\systemroot\\system32\\winlogon.exe".
     
  13. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это ты мне? Ну тогда попробуй NtOpenFile() с именем "\\\\?\\globalroot\\systemroot\\system32\\winlogon.exe".
     
  14. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    > Совершенно верно, CreateFile() не умеет работать с Native-именами.
    Это я тебе. При чём тут NtOpenFile?
     
  15. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Подумай ещё.
     
  16. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    У тебя с головой всё ок? Почитай свой пост и то что я тебе ответил.
     
  17. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    А как быть с LoadLibrary ?
     
  18. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    ... и GetProcAddress
     
  19. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    C GetProcAddress понятно - можно через PIMAGE_EXPORT_DIRECTORY достать.
    А вот что делать с LoadLibrary ...
     
  20. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Ух жесть.
    Просто не могу понять в чём дело.

    Код (Text):
    1. #define OBJ_CASE_INSENSITIVE       0x00000040L
    2. #define FILE_NON_DIRECTORY_FILE    0x00000040
    3. #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
    4. #define OBJ_KERNEL_HANDLE          0x00000200L
    5. #define FILE_SUPERSEDE             0x00000000
    6. #define FILE_DIRECTORY_FILE        0x00000001
    7. #define FILE_CREATE                0x00000002
    8.  
    9. #define InitializeObjectAttributes( p, n, a, r, s ) { \
    10.     (p)->Length = sizeof( OBJECT_ATTRIBUTES );          \
    11.     (p)->RootDirectory = r;                             \
    12.     (p)->Attributes = a;                                \
    13.     (p)->ObjectName = n;                                \
    14.     (p)->SecurityDescriptor = s;                        \
    15.     (p)->SecurityQualityOfService = NULL;               \
    16.     }
    17.  
    18. #define FILE_RANDOM_ACCESS 0x00000800
    19.  
    20. // ...
    21.  
    22.     HANDLE hFile = NULL;
    23.     UNICODE_STRING usFilePath;
    24.     if (!GRtlCreateUnicodeString(&usFilePath, L"\\\\?\\globalroot\\systemroot\\system32\\winlogon.exe")) {
    25.         // ...
    26.     }
    27.     OBJECT_ATTRIBUTES ObjectAttributes;
    28.     InitializeObjectAttributes(&ObjectAttributes, &usFilePath, OBJ_CASE_INSENSITIVE, 0, NULL);
    29.     IO_STATUS_BLOCK IoStatusBlock;
    30.     NTSTATUS stat = NtOpenFile(&hFile, GENERIC_READ, &ObjectAttributes, &IoStatusBlock, FILE_SHARE_READ, FILE_NON_DIRECTORY_FILE | FILE_RANDOM_ACCESS);
    31.     GRtlFreeUnicodeString(&usFilePath);
    stat == 0xc0000033, STATUS_OBJECT_NAME_INVALID

    В чём же дело? =)