Ассемблер версия 0.1: http://www.igrodel.ru/pe-asm0.1.zip (210kb) Поддерживатся импорт функций. Размер секции кода и данных ограничены. Инструкций пока немного: push [byte] push [dword] push eax (пока держит только регистр eax) call [адрес dword] call [имя функции] Пример компилирующейся программы: Код (Text): import Kernel32.dll WriteFile import Kernel32.dll GetStdHandle import Kernel32.dll ExitProcess import User32.dll MessageBoxA .text = Test1 = Test2 = Hello_World! .code push 0xf5 call getstdhandle push 0x00 push 0x00403050 push 0x0C push 0x0040300C push eax call writefile push 0x00 push 0x00403000 push 0x00403006 push 0x00 call messageboxA push 0x00 call ExitProcess Пример и идея компилятора основывается на статье про машинный код (http://www.citforum.ru/programming/windows/machine_code/). test.asm компилируется запуском COMPILE.BAT. В будущем хочется сделать маленький ассемблер, возможно к нему интерпретатор pascal-еподобного языка и редактор формочек.
tmtlib ну как проект, это воспринимать серьезно нельзя. А для развития нормально, тут (на васме) есть статьи про машинные коды, можно их почитать. Мне конечно делфи не нравиться, но каждому свое, не будем холиварить.
tmtlib еще не плохо для таких вещей сорцы выкладывать ,а то что мы сейчас будем обсуждать =) как рабочий проэкт, это могут использовать только извращенцы, да и то не все.
Новая версия с исходниками: http://www.igrodel.ru/tdg3d/pe-asm0.2.zip (20кб) Изменения: - вместо трёх секций сделал одну общую, exe-шник уменьшился до 1кб - добавил возможность задания переменных и констант - добавлена инструкция jmp и метки (с некоторыми ограничениями) Вопросы по ходу разработки: - какие ставить параметры стека в pe заголовок? - почему upx ругается на exe-шники "Illegal exe header"? Компилирующиеся примеры: HELLO.ASM Код (Text): .import import Kernel32.dll WriteFile import Kernel32.dll GetStdHandle import Kernel32.dll ExitProcess import User32.dll MessageBoxA .var string s1 "This is a HELLO.ASM test message:" string s2 "Congratulations! Hidden message!" string message "Hello world! Comment out JMP 0x17 in HELLO.ASM to see hidden message" byte STD_INPUT_HANDLE 0xf5 dword count 0x00000000 dword MB_ICONASTERISK 0x00000040 .code push =STD_INPUT_HANDLE call getstdhandle push 0x00 // lpOverlapped push @count // lpNumberOfBytesWritten push =length(s1) // nNumberOfBytesToWrite push @s1 // lpBuffer push eax // hFile call writefile // comment out this jmp instruction to see hidden message: jmp 0x00000017 push =MB_ICONASTERISK // uType push @s1 // lpCaption push @s2 // lpText push 0x00 // hWnd call messageboxA push =MB_ICONASTERISK // uType push @s1 // lpCaption push @message // lpText push 0x00 // hWnd call messageboxA push 0x00 call ExitProcess LOOP.ASM Код (Text): .import import Kernel32.dll WriteFile import Kernel32.dll GetStdHandle .var string s1 "This is a loop!" byte STD_INPUT_HANDLE 0xf5 dword count 0x00000000 .code :label1 push =STD_INPUT_HANDLE call getstdhandle push 0x00 // lpOverlapped push @count // lpNumberOfBytesWritten push =length(s1) // nNumberOfBytesToWrite push @s1 // lpBuffer push eax // hFile call writefile jmp label1 В архиве краткий хелп в readme.txt
Добавлен тип record: Код (Text): record two_strings string s1 "This string have three parts:" string s2 "s1, s2" string somename "and s3." dword digits 0x12345678 end можно обращаться как к @two_strings, так и ^two_strings.digits и т.п. Примеры и исходники: http://www.igrodel.ru/tdg3d/peasm-0.3beta.zip (30кб)
можу подарить. с легкочитаемыми и документироваными исходниками. на одном из нескольких языков (вроде и дельфа есть). или на всех сразу. можете как препроцессор заюзать
qqwe ну в смысле ТС пишет не рази результата, а ради процесса и главная навыка который он получит. Те юзать готовое не катит.
spa с трудом узнаю человека, который клеймил меня велосипедами и призывал к максимальной высокоуровневости. впрочем, я и не призываю юзать готовое. там больше шаблон. полнофункциональный, но шаблон. учебный. для саморазвития изучающего. но можно и так юзать. калькуляторы там, хеловорды. встроить там, скриптодвижок/препроцессор.. кроме того, если ТС совсем не интересуется результатом, то в топку такое дело. оно не принесет толку никому. в том числе и самому ТС но дело ваше, конечно. юзая ту технику можно и асм за пару дней накатать. и лучше, и читабельнее, и изменябельнее. но дело хозяйское. главное, что пишет, а не пальцы гнет и критикует всех подряд за то что сделали, а у него не спросили.. ээ, извините, увлекся. от меня проекту - ку. а вот поддерживаемости - кю. еще один благой порыв со временем пойдет в стол, тк поддержать и продолжить его никто не сможет ЗЫ както много негатива. не воспринимайте буквально, немного побелите, побрызгайте духами "сирень". ну, или выкиньте. чето не соображу как лучше. и ку есть. и кю есть. ось
Друзья! Не ссорьтесь. qqwe, ваш учебный шаблон меня заинтриговал. Насколько он отличается от freepascal? К примеру, возможно ли реализовать аналогичный Delphi синтаксис? Сейчас у меня специфика проекта такова, чтобы увязать вместе код, типы, переменные параллельно задумываясь об их размещении в EXE и в памяти. p.s. В недавней версии постарался всё-таки сделать понагляднее добавление опкодов: Код (Text): smartparser('push ^', 'text|push~ val|1'); // PUSH ^var smartparser('push @', 'text|push~0x ptr|1'); // PUSH @var smartparser('push 0x??', 'text|6A raw|1'); // PUSH Imm8 "6A 00" smartparser('push 0x????????', 'text|68 raw|1'); // PUSH IMM32 "68 00 00 00 00" smartparser('push ???', 'text|50 +reg|1'); // push r32 "50+reg" smartparser('call 0x????????', 'text|FF15 raw|1'); // CALL r/m32 "ff 15 00 00 00 00" smartparser('call ?', 'text|FF15 dll|1'); // CALL r/m32 "ff 15 00 00 00 00" smartparser('jmp 0x????????', 'text|E9 raw|1'); // JMP smartparser('jmp ?', 'text|E9 label|1'); // JMP smartparser('mov ^ eax', 'text|mov~0: ptr|1 text|~eax'); // MOV ^var,eax smartparser('mov 0:???????? eax', 'text|A3 raw|1'); // MOV ptr,eax smartparser('mov eax ^', 'text|mov~eax~0: ptr|2'); // MOV eax, ^var smartparser('mov eax 0:????????', 'text|A1 raw|2'); // MOV eax, ptr
tmtlib там синтаксис оберон-0. там используется парсеро-генератор на ебнф. те, если вам это надо и вы не прочь немного поработать и немного подучиться, то вполне. это не делается параллельно. обычно, сперва парсится исходник, проверяются типы и прочая муть. и все это закидывается в дерево. после этого о сорцах забываем. дерево можно прооптимизировать опять же в дерево. а после уже снова дерево переводим маш или п код. или сперва в п-код, а потом п-код в маш код. а завертывание в ехе - это вообще 10тая операция. пусть ваш код сперва из памяти начнет нормально запускаться в 100 из 100 я вам просто советую разобраться с парсер генераторами. лучше будет, модификабельнее и красивее. те это может быть яцц/бизон (есть пас с оптимизатором, пкод генератором, пкод интерпретером, пкод -> х86 (и маш код и асм гас синтаксиса). нет пе форматера), но мне яцц и вообще бнф не нравится, но лучше, имхо, сосо. начать можно тут http://wasm.ru/forum/viewtopic.php?id=33293
Было бы прикольно иметь модуль, а то даже и компонент, хе-хе-хе, бросаешь его на форму, засовываешь ему в stringlist цодез на ассемблере, а он это дело компилит прямо в память и возвращает указатель на точку входа - мол, вызови меня. А то просто ассемблеров много, а такого ещё не было.
CyberManiac в смысле не было? тини-с умеет компилить и запускать из памяти. там есть встроенный асм. я в свое время перетачивал фасм под встраиваемые нужды (компиленье + запуск из памяти) и выкладывал все это. в принципе, можно и еще вспомнить. можно и переточить какой нибудь опенсорсный. думаю, вы просто плохо искали
CyberManiac сосо под дельфу есть. тини-с представляет собой 2 части - фротенд и библиотеку кодогенератора. кодогенератор можно использовать отдельно впрочем в дельфе я слаб. слишком сложна она для меня. потому я не очень бровзю в ее библиотеках. так что, если все строго и уперто, то я тут пас. а парсеры на сосо переносимы между лангами (не считая обработчиков, ессно).