Форум программистов, компьютерный форум CyberForum.ru

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
roman912
0 / 0 / 0
Регистрация: 06.03.2015
Сообщений: 55
#1

Некорректно работают NtAllocateVirtualMemory и NtFreeVirtualMemory на х64 - C++ WinAPI

07.01.2017, 19:11. Просмотров 300. Ответов 8
Метки нет (Все метки)

Собираю исходники этого эксплоита под винду https://github.com/Re4son/KiTrapOD/b...r/vdmexploit.c
Я вот код смотрю, не очень понимаю вот этот кусок в функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
BOOL InitializeVdmSubsystem()
{
    FARPROC NtAllocateVirtualMemory;
    FARPROC NtFreeVirtualMemory;
    FARPROC NtVdmControl;
    PBYTE BaseAddress;
    ULONG RegionSize;
    static DWORD TrapHandler[128];
    static DWORD IcaUserData[128];
    static struct {
        PVOID TrapHandler;
        PVOID IcaUserData;
    } InitData;
 
    NtAllocateVirtualMemory = GetProcAddress(GetModuleHandle("NTDLL"), "NtAllocateVirtualMemory");
    NtFreeVirtualMemory     = GetProcAddress(GetModuleHandle("NTDLL"), "NtFreeVirtualMemory");
    NtVdmControl            = GetProcAddress(GetModuleHandle("NTDLL"), "NtVdmControl");
    BaseAddress             = (PVOID) 0x00000001;
    RegionSize              = (ULONG) 0x00000000;
    InitData.TrapHandler    = TrapHandler;
    InitData.IcaUserData    = IcaUserData;
 
    // Remove anything currently mapped at NULL
    NtFreeVirtualMemory(GetCurrentProcess(), &BaseAddress, &RegionSize, MEM_RELEASE);
 
    BaseAddress             = (PVOID) 0x00000001;
    RegionSize              = (ULONG) 0x00100000;
 
    // Allocate the 1MB virtual 8086 address space.
    if (NtAllocateVirtualMemory(GetCurrentProcess(),
                                &BaseAddress,
                                0,
                                &RegionSize,
                                MEM_COMMIT | MEM_RESERVE,
                                PAGE_EXECUTE_READWRITE) != STATUS_SUCCESS) {
        ExitThread('NTAV');
        return FALSE;
    }
 
    // Finalise the initialisation.
    if (NtVdmControl(VdmInitialize, &InitData) != STATUS_SUCCESS) {
        ExitThread('VDMC');
        return FALSE;
    }
 
    return TRUE;
}
Я искал документацию по этим недокументированным функциям, но особо ничего не нашел.
Мне вот не понятно, почему в функцию очистки памяти NtFreeVirtualMemory передают этот указатель
C++
1
BaseAddress             = (PVOID) 0x00000001;
и ставят в него 1, почему надо само значение указателя менять не могу понять, когда в функцию передают адрес его.
Может кто объяснить этот момент.
Также не понимаю, почему они очищают 0 байт:
C++
1
RegionSize              = (ULONG) 0x00000000;
Про NtAllocateVirtualMemory тоже с BaseAddress тот же вопрос, почему они его в 1 ставят.

Под отладчиком на вин хп 32 бит системе убедился, что если эту 1 не поставить, то ntfree выдает ошибку.
А собирал на вин7 х64, на этой системе ntfree завершается ошибкой в любом случае
0xC00000A0
STATUS_MEMORY_NOT_ALLOCATED

Не знаете как на х64 системе, чтобы эта функцию успешно очищала память ?
Также хотелось бы документацию по NtVdmControl, по ней в msdn тоже особо нет ничего.
На хп 32 она успешно выполняется, а на 64 с ошибкой.

Добавлено через 5 минут
На х64 выполняются с такими ошибками:
NtFreeVirtualMemory 0xC00000A0 STATUS_MEMORY_NOT_ALLOCATED
NtAllocateVirtualMemory 0xC00000F0 STATUS_INVALID_PARAMETER_2 // Эта успешно выполняется, если в BaseAddress=0 вписать, а NtFree все равно ошибку кидает.
NtVdmControl 0xC0000002 STATUS_NOT_IMPLEMENTED

Может кто знает, как сделать, чтобы на х64 эта функция успешно выполнилась ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2017, 19:11     Некорректно работают NtAllocateVirtualMemory и NtFreeVirtualMemory на х64
Посмотрите здесь:
NtFreeVirtualMemory и VirtualFree, NtAllocateVirtualMemory и VirtualAlloc C++ WinAPI
ReadProcessMemory из x86 для х64 C++ WinAPI
C++ WinAPI Необработанное исключение по адресу на х86, на х64 работает норм
C++ WinAPI BitBlt некорректно копирует окно
Некорректно отображается время создания файла C++ WinAPI
C++ WinAPI Функция работает некорректно, при компиляции x32
C++ WinAPI Программа работает некорректно при запуске из *.exe
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
jupman
195 / 98 / 14
Регистрация: 10.11.2015
Сообщений: 251
07.01.2017, 20:11     Некорректно работают NtAllocateVirtualMemory и NtFreeVirtualMemory на х64 #2
Цитата Сообщение от roman912 Посмотреть сообщение
Я искал документацию по этим недокументированным функциям, но особо ничего не нашел.
Мне вот не понятно, почему в функцию очистки памяти NtFreeVirtualMemory передают этот указатель
C++
Выделить код
1
BaseAddress = (PVOID) 0x00000001;
и ставят в него 1, почему надо само значение указателя менять не могу понять, когда в функцию передают адрес его.
Может кто объяснить этот момент.
Также не понимаю, почему они очищают 0 байт:
C++
Выделить код
1
RegionSize = (ULONG) 0x00000000;
NtFreeVirtualMemory округлит 1 по границе региона (в меньшую сторону), т.е. получится адрес 0. RegionSize 0 означает что нужно освободить весь регион.

Цитата Сообщение от roman912 Посмотреть сообщение
Про NtAllocateVirtualMemory тоже с BaseAddress тот же вопрос, почему они его в 1 ставят.
Если передать 0, то NtAllocateVirtualMemory сама выберет адрес. Поэтому тут тот же подход, передаем 1 и адрес будет округлен до нуля.

Цитата Сообщение от roman912 Посмотреть сообщение
На х64 выполняются с ...:
На x64 нет vdm.
roman912
0 / 0 / 0
Регистрация: 06.03.2015
Сообщений: 55
07.01.2017, 22:08  [ТС]     Некорректно работают NtAllocateVirtualMemory и NtFreeVirtualMemory на х64 #3
Цитата Сообщение от jupman Посмотреть сообщение
На x64 нет vdm.
Жалко, эксплоит пашет только на х86, попробовал на хп,2003,2008 и 7 некоторых компах на работе.

Добавлено через 1 минуту
Цитата Сообщение от jupman Посмотреть сообщение
Поэтому тут тот же подход, передаем 1 и адрес будет округлен до нуля.
Только почему-то функция на х64 ошибкой завершается, если не 0 передаем.
Убежденный
Системный программист
Эксперт С++
15298 / 6930 / 1096
Регистрация: 02.05.2013
Сообщений: 11,340
Завершенные тесты: 1
07.01.2017, 22:11     Некорректно работают NtAllocateVirtualMemory и NtFreeVirtualMemory на х64 #4
Цитата Сообщение от roman912 Посмотреть сообщение
Я искал документацию по этим недокументированным функциям, но особо ничего не нашел.
А как ты искал так, интересно?
Первая же ссылка в Гугле сразу выводит на MSDN, ищи по NtAllocateVirtualMemory, например.
По поводу префиксов Nt и Zw не пугаться, в user mode это "синонимы" для одних и тех же функций.

Цитата Сообщение от roman912 Посмотреть сообщение
Собираю исходники этого эксплоита
Думаю, тема проживет недолго
roman912
0 / 0 / 0
Регистрация: 06.03.2015
Сообщений: 55
07.01.2017, 22:52  [ТС]     Некорректно работают NtAllocateVirtualMemory и NtFreeVirtualMemory на х64 #5
Цитата Сообщение от Убежденный Посмотреть сообщение
А как ты искал так, интересно?
Искал почему заявленные коды ошибок те функции возвращают.
Кстати есть инфа по NtVdmControl по ее параметрам ?
А то кроме структуры констант под нее ничего более не нашел.
jupman
195 / 98 / 14
Регистрация: 10.11.2015
Сообщений: 251
07.01.2017, 23:06     Некорректно работают NtAllocateVirtualMemory и NtFreeVirtualMemory на х64 #6
roman912, в исходниках Win2k можно посмотреть

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
NTSTATUS
NtVdmControl(
    IN VDMSERVICECLASS Service,
    IN OUT PVOID ServiceData
    )
/*++
 
Routine Description:
 
    This routine is the entry point for controlling Vdms.
    On risc it returns STATUS_NOT_IMPLEMENTED.
    On 386 the entry point is in i386\vdmentry.c
 
Arguments:
 
    Service -- Specifies what service is to be performed
    ServiceData -- Supplies a pointer to service specific data
 
Return Value:
 
 
--*/
roman912
0 / 0 / 0
Регистрация: 06.03.2015
Сообщений: 55
07.01.2017, 23:36  [ТС]     Некорректно работают NtAllocateVirtualMemory и NtFreeVirtualMemory на х64 #7
Цитата Сообщение от jupman Посмотреть сообщение
в исходниках W
А где конкретно в каком файле искать этот код ?
jupman
195 / 98 / 14
Регистрация: 10.11.2015
Сообщений: 251
08.01.2017, 00:00     Некорректно работают NtAllocateVirtualMemory и NtFreeVirtualMemory на х64 #8
roman912, Win2k\private\ntos\vdm\i386\vdmentry.c
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2017, 03:28     Некорректно работают NtAllocateVirtualMemory и NtFreeVirtualMemory на х64
Еще ссылки по теме:
Windows Vista х64-битная ОС некорректно работает
Win7 X86 и Х64 не работают?! Windows 7
В Win 7 х64 не работают или не связываются с интернетом приложения х32 Windows 7
Некорректно работают PCI-E
Некорректно работают скрипы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
NickoTin
Почетный модератор
8230 / 3514 / 238
Регистрация: 14.06.2010
Сообщений: 4,510
Записей в блоге: 9
11.01.2017, 03:28     Некорректно работают NtAllocateVirtualMemory и NtFreeVirtualMemory на х64 #9
roman912, в вопросах эксплойтов разбирайтесь самостоятельно. Закрыто.
Yandex
Объявления
11.01.2017, 03:28     Некорректно работают NtAllocateVirtualMemory и NtFreeVirtualMemory на х64
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru