Нужно реализовать следущее. Приходит машинный код (т.е. он задается пользователем, не важно как по сети или из текстового файла) как например реализовать его исполнение, ну скажем, на Borland Builde C++? Как это сделать в ассемблере - проблем нет(вернее сказать представляю что для этого нужно, хотя никогда и близко такого не делал). Нужно создать область памяти с доступом R\W\E и просто переписать туда наш машинный код. Но как это сделать на языке высокого уровня? ASM вставка тут, я понимаю не подойдет. ИЛи подойдет? Если подойдет то как?
Какая разница на каком языке писать? Апи функции одинаковые для всех. Вон, Ms-Rem на деьлфях писал по началу. И как писал! Почитай учебник по апи-функциям.
С этим нисколько не спорю!!! Дело-то не в этом. Допустим, выделил я память, которая будет RWE, записал туда то, что мне нужно. (Это все в API есть-точно!!!) Как мне туда перейти на исполнение? Разве такое есть в API, а потом обратно? С удовольствием (если там есть то что меня отделяет от результата). Пару источников, хотя бы, желательно онлайн...
Смотря что у тебя там за код. Если надо с возвратом, то в этом коде желательно чтобы ret в конце был. А вызывать - хочеш во встроенном ассемблере call напиши, хочеш на Си - создай указатель на функцию, инициализируй нужным адресом и вызови как обычную функцию.
О таком я думал, но мне казалось: Да кто же мне даст код функции в памяти поправить? но если такое возможно это в коре меняет дело... Осталось только понять. Как именно поправить ей код на асме? Да и как вообще на регистры подавать нужные значение перед ее вызовом? Также асм вставкой? А задача такая: Пользователь вводит машинный код. В этом коде используются 4 регистра процессора. (два задают адреса строки символов(на оба одинаковый адрес), третий счетчик, в 4й происходит запись символа и операции над ним). Необходимо подать на эти регистры нужные нам значения. У нас в программе есть строка, адрес, по которому она лежит и нужно "положить" в регистры. А затем необходимо запустить этот самый пользовательский код на исполнение и вернуться в основную часть программы.
Код (Text): typedef void (* stub_func)(); stub_func s; void *mem; mem = malloc(size); memcpy(mem, bcode, size); s = (stub_func)mem; s();
n0name Класс, не думал, что может быть так просто. Интересно вот только на s = (stub_func)mem; Никто ругаться не будет? Но это проверю. СПС большое!!! Stiver Постараюсь посмотреть. Но если способ описанный выше сработает сделаю это чуть позже. Спасибо!!!
wvlg Чтобы выполнить код надо передать на него управление переходом. Регистры можно менять асм вставкой. Другим способом является испльзование CreateThread + GetThreadContext + SetThreadContext + ResumeThread.