| Статистика |
|---|
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
|
OPEN SOURCE PROJECT
FAQ
|
FASM (flat assembler) - это синтаксис ассемблера...
|
format PE GUI 4.0 entry start
include '..\..\include\win32a.inc' include '..\..\include\macro\if.inc'
section '.code' code readable writeable executable
start: ; открываем доступ к нету + урл файла
xor eax, eax push eax eax eax eax push szURL push eax eax eax eax push szAgent call [InternetOpen] test eax, eax jz error_open_inet mov [InternetHandle],eax push eax call [InternetOpenUrlA] test eax,eax jz error_open_url mov [FileHandle],eax
; Узнаем размер файла
get_file_size: push dwIndex push dwBufferLen push string_buffer push HTTP_QUERY_CONTENT_LENGTH push [FileHandle] call [HttpQueryInfo] mov esi, string_buffer call atoi mov [file_size], eax push eax call KbShowFileSize
; Создаем файл в который будем сохранять
create_file: push ecx push file_name call [_lcreat] mov [hfile], eax
; Начинаем качать
download: push BytesRead push [len_buf] push string_buffer push [FileHandle] call [InternetReadFile] mov eax, [BytesRead] call save_down test eax, eax je close_stream jmp download
; пишем в файл
save_down: push eax push [BytesRead] push string_buffer push [hfile] call [_lwrite] pop eax ret
; Закрываем файл и интернет
close_stream: push [FileHandle] push [hfile] call [CloseHandle] call [InternetCloseHandle]
; Если не можем открыть адресс в интернете, то закрываем
error_open_url: push [InternetHandle] call [InternetCloseHandle]
error_open_inet: xor eax, eax push eax call [ExitProcess]
proc atoi lodsb cmp al,20h je atoi cmp al,9 je atoi mov bl,al xor eax,eax xor edx,edx cmp bl,'-' je atoi_digit cmp bl,'+' je atoi_digit dec esi atoi_digit: mov dl,[esi] sub dl,30h jc atoi_done cmp dl,9 ja atoi_done mov ecx,eax shl ecx,1 jc atoi_overflow shl ecx,1 jc atoi_overflow add eax,ecx shl eax,1 jc atoi_overflow js atoi_overflow add eax,edx jc atoi_overflow inc esi jmp atoi_digit atoi_overflow: stc ret atoi_done: cmp bl,'-' jne atoi_sign_ok neg eax atoi_sign_ok: clc ret endp
proc Division Integer, divider
fild dword[divider] fild dword[Integer] fdiv st0, st1 frndint fist dword[divider] ret endp
proc KbShowFileSize filesize local divider:DWORD
.if [filesize] > 1024
mov [divider], 1024 fild dword[divider] fild dword[filesize] fdiv st0, st1 frndint fist dword[divider] cinvoke wsprintf,string_buffer,dw_format, [divider]
.elseif [filesize] > 1048576
mov [divider], 1048576 fild dword[divider] fild dword[filesize] fdiv st0, st1 frndint fist dword[divider] cinvoke wsprintf,string_buffer,dd_format, [divider]
.endif
invoke MessageBox,0,string_buffer,szAgent,0 ret endp
data_segment:
szAgent db 'DOWNLOAD',0 szURL db 'http://fasm.moy.su/_ld/0' db '/17_msdn_rus.7z',0
file_name db 'C:\msdn_rus.7z',0 dw_format db 'Размер файла: %d кб',0 dd_format db 'Размер файла: %d мб',0 string_buffer rb 1024*2
InternetHandle dd ? FileHandle dd ? BytesRead dd ? file_size dd ? len_buf dd 1024*2 divider dd 1024 hfile dd ? dwBufferLen dd 20 dwIndex dd 0
include 'WinInet32.inc' include 'winapi.inc'
|
|
Самый простой способ:
include 'win32ax.inc'
.code
start: invoke MessageBox,HWND_DESKTOP,\
"Hi! I'm the example program!",\ "Win32 Assembly",MB_OK invoke ExitProcess,0
.end start
|
|
Полистай эту книжечку. Там примеры сервера и клиента есть.
|
|
если в своём приложении, то тебе subclass window procedure
если в чужом, setwindowshookex
а затем использовать сообщения WM_KEYDOWN, WM_CHAR
|
jmp @F ; FORWARD (на метку @@: впереди) @@: jmp @B ; BACK (на метку @@: позади)
|
|
Если есть Хэндл битмапа.
.data? hBmpFile dd ? bmpinfo BITMAPINFO <> bmpFileHeader BITMAPFILEHEADER <> hdc dd ? SizeReadWrite dd ? pBuf dd ? hBitmap dd ?
.code
invoke RtlZeroMemory,addr bmpinfo,sizeof BITMAPINFO mov bmpinfo.bmiHeader.biSize,sizeof BITMAPINFOHEADER invoke GetDIBits,hdc,hBitmap,0,0,NULL,addr bmpinfo,DIB_RGB_COLORS mov pBuf, FUNC(LocalAlloc,LMEM_FIXED,bmpinfo.bmiHeader.biSizeImage) mov pBuf, eax mov bmpinfo.bmiHeader.biCompression,BI_RGB invoke GetDIBits,hdc,hBitmap,0,bmpinfo.bmiHeader.biHeight,pBuf,\
addr bmpinfo, DIB_RGB_COLORS invoke CreateFile,ADDR pathbmp,GENERIC_READ or GENERIC_WRITE ,\ FILE_SHARE_READ or FILE_SHARE_WRITE,\ NULL,CREATE_NEW,FILE_ATTRIBUTE_ARCHIVE,\ 0 mov hBmpFile,eax mov bmpFileHeader.bfReserved1,0 mov bmpFileHeader.bfReserved2,0 mov bmpFileHeader.bfSize,\
sizeof BITMAPFILEHEADER + sizeof BITMAPINFOHEADER
;+ bmpinfo.bmiHeader.biSizeImage mov bmpFileHeader.bfType,'MB' mov bmpFileHeader.bfOffBits,\
sizeof BITMAPFILEHEADER + sizeof BITMAPINFOHEADER invoke WriteFile,hBmpFile,\
addr bmpFileHeader,sizeof BITMAPFILEHEADER,ADDR SizeReadWrite,0 invoke WriteFile,hBmpFile,\
addr bmpinfo.bmiHeader,sizeof BITMAPINFOHEADER,ADDR Size ReadWrite,0 invoke WriteFile,hBmpFile,pBuf,\
bmpinfo.bmiHeader.biSizeImage,ADDR SizeReadWrite,0 invoke CloseHandle,hBmpFile |
|
|
CreateEllipticRgn + SetWindowRgn
|
Код оболочки, шелл-код (англ. shellcode) — это двоичный исполняемый код, который обычно передаёт управление консоли, например '/bin/sh' Unix shell, command.com в MS-DOS и cmd.exe в операционных системах Microsoft Windows. Код оболочки может быть использован как полезная нагрузка эксплойта, обеспечивая взломщику доступ к командной оболочке ( англ. shell) в компьютерной системе. Шелл-код обычно внедряется в память эксплуатируемой программы, после чего на него передается управление путём переполнения стека, или при переполнении буфера в куче, или используя атаки форматной строки.
Передача управления шелл-коду осуществляется перезаписью адреса
возврата в стеке адресом внедрённого шелкода, перезаписью адресов
вызываемых функций или изменением обработчиков прерываний. Результатом
этого является выполнение шелл-кода, который открывает командную строку
для использования взломщиком.
|
.data fName db "c:\temp.txt",0 .code ... invoke DeleteFile, fName
|
|
|
1) Основное отличие - внутри блока asm..end не допускается объявление
обычных именованных переменных и меток, за исключением меток с именами,
начинающимися на "@".
Например, если в MASM\TASM можно объявить в коде константу X dd 0
и грузить ее в регистр как mov eax,X то в дельфях это не прокатывает и
нужно использовать одно из двух:
а) либо убрать объявление X dd 0, а в начале функции (до "asm") объявить const X:dword = 0;
б) либо заменить имя X на метку @X: dd 0 и грузить ее как mov eax,dword[@X]
Тоже самое с метками - нужно либо объявить все используемые метки
вначале функции (label ...), либо заменить имена меток, чтобы они
начинались с символа @. Также не поддерживаются анонимные метки @@: +
jcc @B или jcc @F и фасмовские локальные метки, начинающиеся с точки.
Еще одно ограничение - все метки в дельфях являются локальными, поэтому
перепрыгнуть из одной функции внутрь другой не получится (только на
начало).
2) Передача параметров функций. Во-первых, по умолчанию
используется вызов register и три первых параметра размером не более
dword передаются через регистры eax,edx,ecx. Это нужно иметь ввиду,
чтобы ненароком их не затереть, например function
foo(X,Y:integer):integer; mov eax,Y - затирает параметр X, т.к. здесь
X==eax, Y==edx. С вызовами pascal или stdcall конечно таких проблем
нет, поэтому для asm-функций лучше всегда явно указывать тип вызова,
чтобы знать что к чему независимо от настроек по умолчанию. Ну ес-но
var и const параметры рассматриваются как указатели на переменные:
procedure foo(var X:integer); mov ecx,X - грузит указатель на X при
любом типе вызова, а вот mov ecx,[X] при register грузит значение
переменной X (==mov ecx,[eax]), но для pascal\stdcall по прежнему
грузится указатель, т.к. одна операция mov не может сделать две
загрузки из памяти и mov eax,X == mov eax,[X] == mov eax,[ebp+8].
Комбинация mov ecx,X + mov ecx,[ecx] ес-но работает при любом вызове.
3) Прологи\эпилоги не генерятся только при условии: тип вызова
register, число параметров <= 3 и все они передаются через регистры,
нет объявления локальных переменных. В остальных случаях компилятор
всегда вставляет пролог push ebp + mov ebp,esp + при объявлении
локальных add esp,-(размер_локальных) и соответсвующий эпилог. Ес-но
при наличии пролога\эпилога нужно аккуратно обращться с ebp и ret
PS: Если у тебя есть готовый код на асме, то возможно проще его
скомпилить на том же асме в obj и инклюдить к дельфям - останется
только обявить external функции из готового obj. при экспорте из obj файла могут возникнуть проблемы (если это не TASM)
т.к. у дельфы obj omf, а не obj coff и тебе понадобится тулза для
конверта: COFF2OMF.exe вроде есть в дистрибе С Builder-a или так где
скачай.
|
|
Взято с сайта Z0MBiE
--------------------
21 СПОСОБ ОБНУЛИТЬ РЕГИСТР
~~~~~~~~~~~~~~~~~~~~~~~~~~
Как-то ночью, от незаин делать был написан это текст. Здесь приводятся
всякие способы обнуления регистров - от простых и до самых изощренных, но
вот чего тут нет - так это полных извращений, типа обнуления по одному
биту, автогенерируемого кода и т.п.
1. Обнуление MOV-ом
mov r, 0
2. Заменяем MOV на эквивалентные ему PUSH и POP
push <something-equal-to-0>
pop r
3. Самый хакерский способ: вычитаем регистр сам из себя.
sub r, r
4. Ксорим (тоже неплохой способ... но... как-то не то...)
Попутно (c) на название картины: "арвихакер, ксорящий ворды в уме"
xor r, r
5. Тоже неплохой способ, правда назаин никому не нужный.
and r, 0
6. Более хитро: умножим на 0.
imul r, 0
7. Сдвиг (не путать со спрыгом).
X1+X2 в сумме больше/равно размера регистра в битах,
по отдельности меньше. Меньше потому, что берется по модулю.
shr/shl/sal r, X1 ; X1<=31, X2<=31, X1+X2>=32
shr/shl/sal r, X2 ;
8. Более извратный сдвиг.
clc
rcr/rcl, X1
clc
rcr/rcl, X2
9. Не совсем честный способ, но...
or reg, -1
inc/not reg
10. Обнулим (E)CX. (хотя так можно и озаинеть)
loop $
11. Обнулим EDX.
shr eax,1
cdq
11. Обнулим AL. (AH=AL,AL=0)
aam 1
12. Обнулим AH
aad 0
13. Опять AL
clc
setalc ; opcode: 0xD6
14. Более хитро: прочитаем 0 из порта (например порт 81h)
mov dx, <some-port-number>
in al, dx
15. Опять AL
stc
setnc al
16. А тут кто-нибудь в доку полезет. 5 раз bsf либо bsr.
bsf r, r
bsf r, r
bsf r, r
bsf r, r
bsf r, r
17. Воспользуемся нулевым дескриптором из GDT
sgdt [esp-6]
mov r, [esp-4]
mov r, [r]
18. Считаем ноль из сегмента FS (PE файл)
mov r, fs:[10h] ; константа по вкусу, был бы ноль
19. Цикл (повторюсь: здесь главное не озаинеть)
inc/dec r ; это несколько долго
jnz $-1
20. Вызовем какую-нить функцию с кривыми параметрами (вернется NULL в EAX)
call GetCurrentObject
21. Используем сопроцессор
fldz
fistp dword ptr [esp-4]
mov eax, [esp-4]
22, 23, 24, ...
Предлагаются также следующие варианты обнуления регистра:
- сканирование цепочки обработчкиков SEH до победного нуля
- сканирование цепочки хендлов файлов до нуля
(для этого надо сначала положить в регистр хендл открытого файла
нулевого кольца, а перед этим перейти в ноль и открыть этот файл)
- считывание нуля из случайного файла
(потребуется генератор случайных чисел)
- вычисление синуса от Pi * n (умножать командой FMUL)
- сортировка памяти и поиск нуля как минимального элемента
- определение нуля как константы (в исходнике)
- создание специального макроса для генерации нуля
|
|
DOS это операционная система с консольной платформой. Windows 3.X, 9X,
ME базируются на этой ОС. Её размер состовляет < 1mb. В данный
момент DOS используют в основном как альтернативный загрузчик.
|
org 100h ; Адрес размещения в памяти
mov dx,msg ; Передаем параметры функции для вывода текста
mov ah,9 ; Номер функции DOS
int 21h ; Прерывание DOS 21h
mov ah, 10h ; Номер функции BIOS
int 16h ; Прерывание Bios 16h, Клавиатурные ожидания
ret ; Прерывание программы
msg db "Hello World!$"
|
Dos использует плоскую модель памяти, что позволяет указать только адрес помещения приложения в памяти и код.
|
Да. 
|
Смотрите исходники MPXPLAY (but it's in C) Neutral
|
Вам придется переименовать ваш файл в .EXE или запускать его под NTVDM.
|
Особое внимание стоит уделить сайту Калашникова Олега rusfaq.ru
|
|