C ++ динамические потоки - PullRequest
0 голосов
/ 05 июля 2011

Я выделил немного места, написал asm и попытался запустить поток в этот момент.Но я продолжаю получать нарушение прав доступа.Предполагается нажать четыре 0 и вызвать функцию messageboxa.Но прямо по адресу района он получает нарушение прав доступа.Как мне заставить его работать как обычный код?

void test2()
{
    byte* area;
    HANDLE process;

    area = new byte[1024];

    for(int i = 0; i < 1024; i++)
        area[i] = 0;

    memmove((char*)area, "\x6a\x00\x6a\x00\x6a\x00\x6a\x00\xE8", 9);

    *(DWORD*)&area[9] = ((DWORD)GetProcAddress(GetModuleHandle("User32.dll"), "MessageBoxA") - (DWORD)&area[9] - 4);

    memmove((char*)&area[13], "\x33\xc0\xc3", 3);

    VirtualProtect(area, 17, PAGE_EXECUTE_READWRITE, 0);

    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)area, 0, 0, 0);
}

вот скриншот разборки http://screensnapr.com/v/P33NsH.png

1 Ответ

1 голос
/ 05 июля 2011

В этом случае вызов VirtualProtect() ничего не делает: он просто завершается неудачей, поскольку ожидает, что 4-й параметр является действительным указателем на область памяти, которая получает предыдущие флаги защиты доступа (так что вы можете восстановить ее позже),Таким образом, ЦП отказывается выполнять эту страницу, и вы получаете GPF при самой первой инструкции.

Вам также необходимо использовать PAGE_EXECUTE_READ для флага, в противном случае первая операция с кучей (даже доступ на чтение к любой другойпеременная в куче, которая происходит на той же странице) будет генерировать GPF.В качестве альтернативы, используйте VirtualAlloc() вместо размещения в куче.

Обратите внимание, я не проверял остальную часть кода, поэтому могут быть некоторые другие проблемы с ним.Также обратите внимание, что это не способ написания ассемблера, если только вы не пишете эксплойт (использование VirtualProtect() - верный признак этого).Надеюсь, что я ошибаюсь в своих предположениях об эксплойте.

...