код вызова, сохраненный в "куче" от vc ++

Что-то вроде этого должно делать работу

        List<int> randomNumber = new List<int>();
        Random random = new Random();

        for (int i = 0; i < 9; i++)
        {
            randomNumber.Add(random.Next());
        }

        randomNumber.Add(randomNumber[0]);
11
задан starblue 20 October 2009 в 17:43
поделиться

3 ответа

Комментарий не был достаточным количеством пространства. Joe_Muc корректен. Вы не должны наполнять код в память, полученную malloc или new. Вы столкнетесь с проблемами при изменении свойств страницы страниц, которые выделяет Windows.

Это не проблема becuase использование VirtualAlloc (), и связанные API Win32 каждое легкое: назовите VirtualAlloc () и установите flProtect кому: [PAGE_EXECUTE_READWRITE][2]

Отметьте, необходимо, вероятно, сделать три выделения, одну защитную страницу, страницы, в которых Вы нуждаетесь для своего кода, затем другая защитная страница. Это даст Вам немного защиты от плохого кода.

Также перенесите вызовы к своему сгенерированному коду со структурированной обработкой исключений.

Затем, Windows X86 ABI (соглашения о вызовах) не хорошо документируется (я знаю, я посмотрел). Существует некоторая информация здесь, здесь, здесь лучший способ видеть, как вещи работа состоят в том, чтобы посмотреть на код, сгенерированный компилятором. Это легко сделать с \FA переключатели (существует четыре из них).

Можно найти 64-разрядные соглашения о вызовах здесь.

Кроме того, можно все еще получить Макроассемблер Microsoft MASM здесь. Я рекомендую писать Ваш машинный код в MASM и смотрю на его вывод, затем имею Ваш генератор машинного кода, делают подобные вещи.

Руководства процессора Intel и AMD являются хорошими ссылками - получают их, если у Вас нет их.

12
ответ дан 3 December 2019 в 02:53
поделиться

На самом деле, malloc, вероятно, не сократит его. В Windows, вероятно, необходимо назвать что-то как [VirtualAlloc] (http://msdn.microsoft.com/en-us/library/aa366887 (По сравнению с 85) .aspx) для получения исполняемой страницы памяти.

Начинание с малого:

void main(void)
{
    char* p = (char*)VirtualAlloc(NULL, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    p[0] = (char)0xC3;  // ret

    typedef void (*functype)();
    functype func = (functype)p;
    (*func)();
}

Следующий шаг для того, чтобы играть по правилам с Вашим кодом должен сохранить регистр EBP. Это оставляют как осуществление.:-)

После записи этого я выполнил его с malloc, и это также работало. Это может быть то, потому что я выполняю администраторскую учетную запись на Windows 2000 Server. Другим версиям Windows, возможно, на самом деле понадобится вызов VirtualAlloc. Кто знает.

12
ответ дан 3 December 2019 в 02:53
поделиться

При наличии правильных кодов операций вызов может быть столь же простым как бросающий к указателю функции и называющий его.

typedef void (*voidFunc)();

char *p = malloc (1000);
p[0] = some_opcode;
p[1] = another_opcode; // for the sake of the example: the opcodes are ok
p[n] = // return opcode...

((voidFunc)p)();

Отметьте хотя, что, если Вы не отмечаете страницу как исполняемый файл, Ваш процессор не может позволить Вам выполнить код, сгенерированный на "куче".

6
ответ дан 3 December 2019 в 02:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: