Войти
ФлеймФорумПрограммирование

Зацените мой ассемблер v0.1 (Delphi)

Страницы: 1 2 3 Следующая »
#0
14:15, 4 янв. 2010

Выкладываю пробную версию, так сказать: Ассемблер версия 0.1 (205кб)

Архив содержит компилятор peasm.exe и тестовый файл test.asm с примером и compile.bat для компиляции примера.

Пример test.asm (http://www.citforum.ru/programming/windows/machine_code/5.shtml):

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

getstdhandle и writefile для записи в консоль.

Поддерживаемые команды:
push - только регистр eax, либо число byte/dword
call - имя импортированной процедуры либо адрес (call 0x00402000 и т.п.)

Ограничения:
Вызывать функции из других dll-ок не пробовал - по идее всё должно работать
Размеры секций пока заданы вручнуюу (ограничение на код и данные)
и т.д.. Ограничений пока что множество и до компилятора Delphi далеко.

В написании очень помогла статья про машинный код и формат файлов win32-pe (http://www.citforum.ru/programming/windows/machine_code/). Компилятор получился достаточно жирным из-за использования inttohex и прочих текстовых функций Delphi для вывода log.txt (исходный код 17кб - думаю как уменьшить).


#1
20:50, 4 янв. 2010

Смещения пишешь ручками. Это уже ставит крест на всём...

#2
23:48, 4 янв. 2010

А мне понравилось.

#3
5:37, 5 янв. 2010

RPGman
> Смещения пишешь ручками. Это уже ставит крест на всём...
Частично согласен, естественно переменные и константы будут с именами и тд и тп.
Первый шаг на пути к этому - вместо "call 0x00402000" идёт вполне читаемый "call WriteFile"
В планах урезанный ассемблер и паскаль с редактором форм.

#4
8:49, 5 янв. 2010

Паскаль отстой.
Лучше работай в сторону асма. Делай его удобнее, тогда будет будущее.

#5
23:51, 5 янв. 2010

Компилятор обновлен до версии 0.2:
- введены переменные
- добавлена инструкция jmp
- подработаны исходники
- размер откомпилированных EXE уменьшен до 1кб
- открытый исходный код

http://www.igrodel.ru/tdg3d/pe-asm0.2.zip - Компилятор ассемблера на Delphi с исходниками (20kb).

В архиве также два примера:

1) LOOP.ASM - пример с вечным циклом:

.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

Здесь jmp label1 по аналогии с qbasic-овским "10 GOTO 10". Завершить по ctrl+c

2) HELLO.ASM - показывает сообщения (как в консоль, так и messagebox-ом).

.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

закомментировав jmp 0x00000017 получите ещё одно сообщение

UPX на exe-шники выдаёт ошибку "Illegal exe header".

#6
13:28, 6 янв. 2010

непохо неплохо

жалко дельфя такая не понятная

#7
17:11, 6 янв. 2010

Есть новая версия, забыл на флешку скинуть. Выложу в ближайшие дни.
Пофиксено: ограничение на размер кода и др. ошибки

#8
13:08, 7 янв. 2010

Мне такие вещи интересны, подписываюсь.

#9
15:41, 12 янв. 2010

Обновление 0.3beta:
http://www.igrodel.ru/tdg3d/peasm-0.3beta.zip

В новой версии:
- добавлена возможность перехода на метку ниже jmp
- введён тип record
- больше опкодов
также доработан парсер

В архиве четыре примера
hello.asm - мессаджбокс
loop.asm - цикл с jmp
records.asm - использование типа record
windowclass.asm - создание класса и окна

...
record msg
  dword hwnd   0x00000000
  dword code   0x00000000
  dword wparam 0x00000000
  dword lparam 0x00000000
  dword time   0x00000000
  dword mousex 0x00000000
  dword mousey 0x00000000
end
...
push @msg.hwnd
call DispatchMessageA
...
В этом примере обращение к записям msg и wndclassex (push @msg.hwnd и т.п.)

А вот здесь вывод на экран содержимого целой записи по её указателю:

...
record two_strings
  string s1 "This string have three parts:"
  string s2 "s1, s2"
  string somename "and s3."
end
...

push 0x00        // lpOverlapped 
push @count      // lpNumberOfBytesWritten
push ^length(two_strings) // nNumberOfBytesToWrite
push @two_strings        // lpBuffer
push eax         // hFile
call writefile
...

А вот новый метод добавления опкодов (ещё требует доработки):

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

Новые версии будут выкладываться здесь: http://www.igrodel.ru/tdg3d/

#10
20:07, 12 янв. 2010

Сколько не пиши все равно в конце C получится, ну а потом C++.

#11
1:48, 13 янв. 2010

Ассемблер на дельфи это серьёзный шаг вперед в индустрии !!

#12
10:58, 2 июня 2010

Кто-нибудь ещё клепает ассемблеры?
Сейчас е 64битные intel, какой-нить DSP, микроконтроллер взять с плохим ПО и заменить своим?

#13
11:12, 2 июня 2010

А в чём смысл? Для себя забавы ради?

#14
11:32, 2 июня 2010

не, у меня забава лишь клепать скриптовые машины...

Страницы: 1 2 3 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.