Среда
29.01.2025
03:00
Форма входа
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0

    OPEN SOURCE PROJECT

    FAQ

    Главная » 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 использует плоскую модель памяти, что позволяет указать только адрес помещения приложения в памяти и код.              

    www.freedos.org FreeDOS (Немного глючная, почти полнустью написана на С, 16-bit)
    www.drdos.org Enhanced DR-DOS (Не посещайте drdos..com !!! Я вас предупреждал.) (16-bit)
    http://freedos-32.sourceforge.net/ (32-bit, DPMI совместимый, dead ?)
    http://dex4u.com/ DexOS (32-bit, несовместимый с 16-bit RM и DPMI)
    http://bos.asmhackers.net/ BOS (Косит под DexOS, pre-alpha, игрушка)

    Смотрите исходники MPXPLAY (but it's in C) Neutral


    Скорее всего вы запустили приложение в NTVDM, а не в DOS.

    http://board.flatassembler.net/topic.php?t=5626 (Главная)


    В .COM нет вообще ни какой структуры, файл начинает запускаться со смещения $0100.
    А в .EXE:

    http://board.flatassembler.net/topic.php?t=6735
    http://www.delorie.com/djgpp/doc/exe/


    Вам придется переименовать ваш файл в .EXE или запускать его под NTVDM.


    Особое внимание стоит уделить сайту Калашникова Олега rusfaq.ru


    Windows разработка игр для чайников - последующие версии можно загрузить тут.