Что-то вроде этого должно делать работу
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]);
Комментарий не был достаточным количеством пространства. 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 являются хорошими ссылками - получают их, если у Вас нет их.
На самом деле, 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. Кто знает.
При наличии правильных кодов операций вызов может быть столь же простым как бросающий к указателю функции и называющий его.
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)();
Отметьте хотя, что, если Вы не отмечаете страницу как исполняемый файл, Ваш процессор не может позволить Вам выполнить код, сгенерированный на "куче".