Авторские статьи GUI на ассемблере.

Discussion in 'Статьи' started by DooD, 21 Feb 2012.

  1. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    Всем доброго времени суток.У меня сейчас за полночь,делать нечего.Решил статейку накатать.Речь сегодня пойдет о программировании gui на ассемблере+ немного затронем сторону безопасности.В качестве цели я выбрал недавнюю прогу мной написанную-что то вроде установщика ключей для АВ др.вэб.

    Ну пожалуй начнем.

    Инструменты:
    1)Ассемблер.Берите любой,я люблю масм.
    2)а..блин больше ниче не надо

    И так кратенький алгоритм программки:
    1)Узнать и скачать ключи на сервисах
    2)Распаковать зип архив
    3)Инсталлировать ключ в выбранную папку
    4)убраться за собой.

    КОДЕС.

    Я попытаюсь описать все по порядку.
    Сначала мы всегда указываем архитектуру процессора и модель памяти со стандартом вызова функций.

    Code:
    .386
    .model flat, stdcall
    option casemap:none
    Библиотеки которые нам потребуются

    Code:
    include include\windows.inc
    include include\kernel32.inc
    include include\user32.inc
    include include\comdlg32.inc
    include include\shell32.inc
    include include\ole32.inc
    
    includelib lib\shell32.lib
    includelib lib\ole32.lib
    includelib lib\comdlg32.lib
    includelib lib\user32.lib
    includelib lib\kernel32.lib
    каждая из библиотек содержит нужные нам АПИ функции.Так,например shell32 содержит ShellExecute и т.п.

    После этого у нас идет 2 прототипа функций,но к этому вернемся позже.

    Я обычно не люблю подключать макросы,а если надо 1-2 макроса обычно добавляю их в код,я добавил следующий макрос

    Code:
    chr$ MACRO any_text:VARARG
    LOCAL txtname
    .data
    txtname db any_text,0
    .code
    EXITM <OFFSET txtname>
    ENDM
    он позволит нам в некоторых местах заменить строчные переменные.

    далее у нас идет секция инициализированных перменных,к ней тоже чуть позже.

    За ней идет секция не инициализированных переменных.

    За тем идут константы,и собсно секция кода.

    Для того что бы писать gui нам надо для начала написать процедуру,где будет заполняться некая специальная структура,которая позволит отрисовать окно.
    Ее код следующий

    Code:
    WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    	LOCAL wc:WNDCLASSEX
    	LOCAL msg:MSG
    	LOCAL hwnd:HWND
    	mov   wc.cbSize,SIZEOF WNDCLASSEX
    	mov   wc.style, CS_HREDRAW or CS_VREDRAW
    	mov   wc.lpfnWndProc, OFFSET WndProc
    	mov   wc.cbClsExtra,NULL
    	mov   wc.cbWndExtra,NULL
    	push  hInst
    	pop   wc.hInstance
    	mov   wc.hbrBackground,COLOR_BTNFACE+1
    	mov   wc.lpszMenuName,OFFSET MenuName
    	mov   wc.lpszClassName,OFFSET ClassName
    	invoke LoadIcon,NULL,IDI_APPLICATION
    	mov   wc.hIcon,eax
    	mov   wc.hIconSm,eax
    	invoke LoadCursor,NULL,IDC_ARROW
    	mov   wc.hCursor,eax
    	invoke RegisterClassEx, addr wc
    	INVOKE CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\
               WS_SYSMENU,CW_USEDEFAULT,\
               CW_USEDEFAULT,210,170,NULL,NULL,\
               hInst,NULL
    	mov   hwnd,eax
    	INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
    	INVOKE UpdateWindow, hwnd
    	.WHILE TRUE
                    INVOKE GetMessage, ADDR msg,NULL,0,0
                    .BREAK .IF (!eax)
                    INVOKE TranslateMessage, ADDR msg
                    INVOKE DispatchMessage, ADDR msg
    	.ENDW
    	mov     eax,msg.wParam
    	ret
    WinMain endp
    Описывать ее слишком долго,займет еще полстатьи)Если очень важно прям знать почему что и где-все гуглится.

    Помните я говорил про прототипы?Вот сейчас нужно внести эту функцию в прототипы.
    то есть теперь начало будет выглядеть так:
    Code:
    .386
    .model flat, stdcall
    option casemap:none
    WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    DWORD-ы это кол-во параметров ф-ии (как в Delphi например Function(param1,param2…))

    Что представляет собой прототип?Обычно функция вызывается так:
    Code:
    push param1
    push param2
    push …
    call somefunc 
    то есть параметры передаются через стэк,а затем происходит вызов фу-ии.
    В масме есть такая изумительная вещь как макросы.Прототип позволит вызвать функцию так
    Code:
    invoke somefunc,param1,param2,…
    Теперь идет основная процедура окна.Вот тут то и начинается самый джигурдец.

    Контроллы( то есть кнопки,поля и пр.)на асме можно создавать двумя путями(по крайней мере я знаю 2)
    1)Через ресуры
    2)Через вин АПИ.

    Создание интерфейса через ресурсы,не очень трудно,есть такой маленький инструмент- res ed. Он позволяет визуально разместить контроллы на форме и записать все в файл-ресурс,который потом прилинковывается к нашей программе.конечно хочу вас огорчить, но обрабатывать события эта штуковина не позволяет.все делается только ручками.
    Если вас не заинтересовал хардкорный вариант создания контроллов,то вот есть хорошая статья от нашего d_x’a https://xakepy.cc/showthread.php?t=65611

    Я же выбрал путь хардкора(хотя по сути они не сильно рознятся, писать только больше)
    и буду клепать контроллы через АПИ

    Обычно,когда я должен понять как оно будет,я рисую интрефейс на листке.У нас тут интерфейс будет маленький и скромный (не IDE же пишем в самом деле) и выглядеть он будет так:
    [​IMG]

    то есть у нас 4 кнопочки,1 лэйбл и 1 эдит.
    Опишем все.
    Наши контроллы на окне будут создаваться с помощью АПИ функции CreateWindowEx
    В параметры ф-ии входят класс и ИД контролла.
    в секции .data (инициализированных переменных) укажем их:

    Code:
    ButtonClassName db "button",0
    EditClassName db "edit",0
    LabelClassName DB "STATIC", 0
    в секции .data? (не иниц. перем.) укажем их дескрипторы

    Code:
    hwndButton HWND ?
    hwndButton3 HWND ?
    hwndButton4 HWND ?
    hwndButton5 HWND ?
    
    hwndEdit HWND ?
    
    hwndLabell HWND ?
    в секции констант укажем их Ид и больше к секции констант мы не вернемся.

    Code:
    .const
    ButtonID equ 1
    Button3ID equ 3
    Button4ID equ 5
    Button5ID equ 6
    
    EditID equ 4
    
    LabelID EQU 8
    эквивалентность равна любому значение,только нельзя указывать повторные. Id понадобятся нам для обработки событий контроллов.

    и так создание контролла выглядит так

    Code:
    invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,12,25,130,25,hWnd,EditID,hInstance,NULL
           mov  hwndEdit,eax
           invoke SetFocus, hwndEdit
    Так мы создаем контролл edit. 12,25,130,25 являются размерами контролла и его положением в координ. xy на окне.SetFocus передает фокус в едит при создании окна.

    Более подробно параметры этой АПИ можно посмотреть в мсдн.

    так же создается label и button

    Code:
    invoke CreateWindowEx, NULL,ADDR LabelClassName, NULL,WS_CHILD or WS_VISIBLE ,12, 1, 200, 15, hWnd, LabelID,hInstance, NULL
           mov hwndLabell, eax
           invoke SetWindowText, hwndLabell,chr$("Ïóòü ê ïàïêå ñ DrWeb")
           
           invoke CreateWindowEx,NULL, ADDR ButtonClassName,chr$("..."),WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,150,25,30,25,hWnd,ButtonID,hInstance,NULL
    	mov  hwndButton,eax
    Хочу заметить что нету таких контроллов в отдельности как например checkbox или radiobutton- это всего лишь стили контролла button.

    и так дальше создаем весь интерфейс.

    Допустим вы создали интерфейс. Что дальше спросите вы? дальше нам надо написать обработчики событий.Наши обработчики будут только на кнопках,так что нам повезло)


    Вот как выглядит интерфейс.
    [​IMG]


    Создадим самый первый и простой обработчик на кнопке «?» (о программе)
    значит после функций создания контроллов непосредственно идет код:


    Code:
    .ELSEIF uMsg==WM_COMMAND
    		mov eax,wParam
    		.IF lParam==0
    
    		.ELSE
    
    .IF ax==Button3ID
    				shr eax,16
    				.IF ax==BN_CLICKED
                                      invoke MessageBox,0,chr$("DrWeb Key finder.Written on MASM by DooD"),chr$("about"),0
                                           	.ENDIF
    					.ENDIF
    да не забывайте какой ИД какой кнопке вы присвоили.
    у меня это 3 напрмер.Теперь программа определит-если была нажата кнопка-показать MessageBox с заданной информацией.

    Второй по возрастанию сложности обработчик будет выбор папки для установки ключа

    его код следующий.

    Code:
    .IF ax==ButtonID
    				shr eax,16
    				.IF ax==BN_CLICKED
                                          call get_dir
                                          invoke SetWindowText,hwndEdit,addr txtbuff
                                    	.ENDIF
    					.ENDIF
    
    И так у нас тут есть процедура get_dir. это опять же структура.она позволит нам выбрать каталог.после чего в поле edit поместится путь к этому каталогу.Сама процедура имеет вид:
    g
    Code:
    et_dir proc
    	invoke CoInitialize,0
    	invoke SHBrowseForFolder,ADDR dirs
    	mov pv,eax
    	invoke SHGetPathFromIDList,pv,ADDR txtbuff
    	invoke CoTaskMemFree,pv
    	cmp pv,0
    	ret
    get_dir endp
    
    call_bk proc hWnd:DWORD,uMsg:DWORD,lParam:DWORD,lpData:DWORD
    	.if uMsg == BFFM_INITIALIZED
    		invoke SendMessage,hWnd,BFFM_SETSELECTION,TRUE,lpData
    	.endif
    	xor eax,eax
    	ret
    call_bk endp
    я так же описал кол-бэк процедуру.для чего она нужна?допустим вы выбрали папку и захотели ее сменить-диалог покажет папку которую вы выбирали до этого.скажем так просто удобство,не более. О заполнении browse структуры так же есть в нете.

    перменные процедуры

    Code:
    data.
    dirs	dd 0
    	dd 0
    	dd 0
    	dd offset tit
    	dd 0
    	dd offset call_bk
    	dd offset txtbuff
    	dd 0
    	tit db "title",0 ; структура
    Code:
    .data ?
    pv   dd ?
    txtbuff db  512 dup(?)
    Да чего я еще не сказал,каждая процедура должна оканчиваться командой ret- возвращение в подпрограмму,

    И ВОТ ОН,НАСТУПАЕТ САМЫЙ АДСКИЙ МОМЕНТ!!!.
    Скачивание ключа.тут мы и затронем тему безопасности.
    Сервисы я приводить не буду,захотите-отснифайте(в исходнике будет один).
    Тут у меня было 3 варианта как поступить.

    1)Скачивание через wininet
    2)скачивание одной апишкой- URLDownloadToFile
    3)скачивание через сокеты.

    Так как программист по натуре личность крайне ленивая-сокеты я сразу выкинул(и как всегда это мне окупилось 3-ым п*здецом)

    Сразу попробовал на wininet скачивать,не тут то было-АВ (как раз др.вэб,себе же и писал тулзу)завопил,думаю ладно,попробовал через апишку-даже скомпилить не дал,заорал.ну думаю хрен там ,на сокетах принципиально делать не буду,а то угрохаю время,а он палить будет.Ох зря я так думал.Короче говоря я начал думать.Пришел к выводу что статический импорт функций оно то хорошо палит и решил заменить на динамический.Пара АВ изменили свое мнение,но мой по прежнему бил тревогу.Потом я подумал ай,побалуюсь с ПЭБ-посмотрел структуру PEB-нет спасибо.Дошел я до того что походу палит по строкам таблицы импорта,а то и по флагам функций,решил сделать так:
    зашифровать АПИ и библиотеки простым однобайтным ксором и вшить зашифрованные строки,после чего сделать что то вроде моста на writeprocessmemory, потом перед вызовом функции сделать так:
    расшифровать строки.
    динамически подгрузить ее из dll, передав в кач-ве параметров расшифрованные строки.
    вызвать функцию динамически из dll. После проведенных манипуляций и жесткого хардкора над разумом,АВ тупо молчал.он был повержен.я возрадовался.И в то же время понял,что 100% защиты не бывает.Конечно не стоит винить разрабов АВ,если бы я поксорил бы функции то он бы спокойно схавал downloader.
    Реализация:

    Code:
    Crypt    proc s:dword ; функцию можно внести в прототип.
        invoke     lstrlen,s
        mov ecx,eax
        xor eax,eax
        mov        eax,s
    l1:
        xor       [eax],0Eh
        inc        eax
        loop    l1
        ret
    Crypt endp
    шифровка ксором.

    Code:
    decrypt proc
    LOCAL nob:dword
    LOCAL buff:byte
    
        mov     eax,addr nob
        push    eax
    
        mov        buff,1111b
        mov        eax,addr buff
        
        push       eax
    
        mov        eax,lp
        inc        eax
    
        invoke     GetCurrentProcess
    
        push       eax
    
        mov        eax,WriteProcessMemory ; IAT
        mov        eax,[eax+2]  ; .idata
        mov        eax,[eax] ; kernel32.WriteProcessMemory
        add        eax,5   ; kernel32.WriteProcessMemory+5
    
        push       l2  ; emulate first instruction
        push       ebp  ; emulate second instruction
        mov        ebp,esp  ; emulate third instruction
        jmp        eax  ; JMP to kernel32.WriteProcessMemory+5
    l2:
    
    lp:
    
        invoke    Crypt,addr urldtf
        invoke    Crypt,addr krnl32
        invoke    Crypt,addr urlmon
        ret
    
    decrypt endp
    расшифровка
    Code:
    SetLib proc
        invoke    LoadLibrary,addr urlmon
        invoke    GetProcAddress,eax,addr urldtf
        ret
    SetLib endp
    динамическая подгрузка.
    и теперь сам вызов выглядит так:

    Code:
    .IF ax==BN_CLICKED
    	 invoke GetWindowTextLength,hwndEdit
              .IF eax==0
              invoke MessageBox,0,chr$("Îïðåäåëèòå äèðåêòîðèþ!"),chr$("Îøèáêà"),MB_ICONERROR
              .ELSEIF eax>0
              
            call decrypt
            call SetLib
    
            
            push 0
            push 0
            push chr$("C:\key.zip")
            push chr$("http://yootoo.ru/drweb32.zip")
            push 0
            call eax
    
            .ENDIF
            invoke Sleep,1000
            invoke GetFileAttributes,chr$("C:\key.zip")
            .IF eax==INVALID_FILE_ATTRIBUTES
            invoke MessageBox,0,chr$("Íå óäàëîñü!"),chr$("Îøèáêà"),MB_ICONERROR
            .ELSEIF eax!=INVALID_FILE_ATTRIBUTES
             invoke MessageBox,0,chr$("OK!"),chr$("ÎK"),MB_OK
             .ENDIF
    
    
                                          	.ENDIF
                                            .ENDIF
    проверяем выбрали ли мы папку для ключа,если нет-ошибка.
    декриптуем строки
    подгружаем функу
    вызываем ее.
    даем паузу 1сек.
    проверяем скачался ли ключ
    если нет-ошибка,если да-уведомляем.

    ну и остался последний обработчик.
    Тут нам надо распаковать архив и установить ключ в папку.
    Сперва я думал,как этот архив распаковать,искал dll ждя работы с zip. но они были либо жирные,либо тупые (блин прям как в поисках бабы))ну я решил применить vbs скрипт,эти скрипты не раз мне уже спасали жизнь.за пару мгновений был создан скриптик:

    Code:
    unzip  db "Set ShellApp = CreateObject(""Shell.Application"")" ,13,10,"Set objDestFolder = ShellApp.NameSpace(""C:\"")",13,10,"Set objSrcFolder = ShellApp.NameSpace(""C:\key.zip"")",13,10,"objDestFolder.CopyHere objSrcFolder.Items",0
    состоит из 4 строк.записано все через перевод строки,что бы не вызывать 8 раз writefile, что то вроде оптимизации.
    а это процедура отвечающая за создание скрипта

    Code:
    create_script proc
      invoke CreateFile,chr$("C:\unzip.vbs"), GENERIC_READ or GENERIC_WRITE,0,0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL,0
      mov hFile,eax
      invoke WriteFile,hFile,addr unzip,sizeof unzip-1,addr htemp,0
      invoke CloseHandle,hFile
      ret
    create_script endp
    создаем файл и пишем в него скрипт.

    последний обработчик выглядит так:


    Code:
    .IF ax==Button5ID
    	shr eax,16
    	.IF ax==BN_CLICKED
              invoke GetWindowTextLength,hwndEdit
              .IF eax==0
              invoke MessageBox,0,chr$("Îïðåäåëèòå äèðåêòîðèþ!"),chr$("Îøèáêà"),MB_ICONERROR
              .ELSEIF eax>0
    
              call create_script
    
              invoke ShellExecute,0,chr$("open"),chr$("C:\unzip.vbs"),0,0,SW_HIDE
    
              invoke lstrcat,addr txtbuff,chr$("\drweb32.key")
              invoke GetFileAttributes,addr txtbuff
              .IF eax!=INVALID_FILE_ATTRIBUTES
              invoke MessageBox,0,chr$("Òåêóùèé êëþ÷ óäàëåí"),chr$("Ñîîáùåíèå"),MB_OK
              invoke DeleteFile,addr txtbuff
              .ENDIF
              invoke MessageBox,0,addr txtbuff,chr$("ÓÑÏÅÕ!êëþ÷ ïîìåùåí â ïàïêó"),0
              invoke MoveFile,addr path,addr txtbuff
    
             .ENDIF
             invoke DeleteFile,chr$("C:\drweb.key")
             invoke DeleteFile,chr$("C:\key.zip")
             invoke DeleteFile,chr$("C:\unzip.vbs")
             .ENDIF
             .ENDIF
    
              .ENDIF
    Делаем проверку как в предыдущем обработчике,вызываем процедуру создания скрипта.Заметьте что мне не пришлось извращаться так же с Shellexecute, так что я более чем доволен.Запускается скрипт,распаковывая наш ключ,проверяется наличие старого ключа-удаляется,помещается новый-выдается извещение.после чего все удаляется что появилось.

    обработчики закончились и огромная процедура закрывается так
    Code:
    .ELSE
    		invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    		ret
     .ENDIF
    	xor    eax,eax
    	ret
    WndProc endp
    после директивы .code
    вызывается
    Code:
    start:
    
     invoke GetModuleHandle, NULL
     mov    hInstance,eax
     invoke GetCommandLine
     mov CommandLine,eax
     invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
     invoke ExitProcess,eax
    наша главная процедура.
    для создания стиля windows я использовал такой вот файлик ресурсов,добавляет манифест и иконку
    Code:
    rsrc.rc
    
    #define MANIFEST 24
    #define IDR_XPMANIFEST1 1
    #define ico 100
    
    IDR_XPMANIFEST1 MANIFEST "xpmanifest.xml"
    ico ICON DISCARDABLE "ico.ico"
    полный исходник прилагается.Готов выслушать разумную критику,замечания и пожелания.Надеюсь объяснял понятно(ну старался по крайней мере)и интересно.Спасибо за внимание да прибудут с вами знания асма!!:)
     
    1 person likes this.
  2. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    сорец:

    Code:
    ;написано и скомпилировано в assembler editor 
    ;https://forum.antichat.ru/thread261755-assembler+editor.html
    .386
    .model flat, stdcall
    option casemap:none
    WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    Crypt proto :DWORD
    
    include include\windows.inc
    include include\kernel32.inc
    include include\user32.inc
    include include\comdlg32.inc
    include include\shell32.inc
    include include\ole32.inc
    
    includelib lib\shell32.lib
    includelib lib\ole32.lib
    includelib lib\comdlg32.lib
    includelib lib\user32.lib
    includelib lib\kernel32.lib
    
    chr$ MACRO any_text:VARARG
    LOCAL txtname
    .data
    txtname db any_text,0
    .code
    EXITM <OFFSET txtname>
    ENDM
    
    .data
    urldtf db '[\BJay`baojZaHgbkO',0
    shlexc db ']fkbbKvkm{zkO',0
    
    krnl32 db 'ek|`kb=< jbb',0
    urlmon db '{|bca` jbb',0
    shlxct db '}fkbb=< jbb',0
    
    
    unzip  db "Set ShellApp = CreateObject(""Shell.Application"")" ,13,10,"Set objDestFolder = ShellApp.NameSpace(""C:\"")",13,10,"Set objSrcFolder = ShellApp.NameSpace(""C:\key.zip"")",13,10,"objDestFolder.CopyHere objSrcFolder.Items",0
    
    dirs	dd 0
    	dd 0
    	dd 0
    	dd offset tit
    	dd 0
    	dd offset call_bk
    	dd offset txtbuff
    	dd 0
    	tit db "title",0
    
    path db "C:\drweb32.key",0
    
    ClassName db "SimpleWinClass",0
    AppName  db "DrWeb key finder",0
    MenuName db "Menu",0
    ButtonClassName db "button",0
    EditClassName db "edit",0
    LabelClassName DB "STATIC", 0
    
    
    .data?
    pv   dd ?
    txtbuff db  512 dup(?)
    bufer db 512 dup(?)
    
    hInstance HINSTANCE ?
    CommandLine LPSTR ?
    
    hwndButton HWND ?
    hwndButton3 HWND ?
    hwndButton4 HWND ?
    hwndButton5 HWND ?
    
    hwndEdit HWND ?
    
    hwndLabell DD ?
    
    
    hFile HANDLE ?
    
    htemp dd ?
    
    .const
    ButtonID equ 1
    Button3ID equ 3
    Button4ID equ 5
    Button5ID equ 6
    
    EditID equ 4
    
    LabelID EQU 8
    
    .code
    
    start:
    
     invoke GetModuleHandle, NULL
     mov    hInstance,eax
     invoke GetCommandLine
     mov CommandLine,eax
     invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
     invoke ExitProcess,eax
     
    WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    	.IF uMsg==WM_DESTROY
    		invoke PostQuitMessage,NULL
    	.ELSEIF uMsg==WM_CREATE
    
           invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,12,25,130,25,hWnd,EditID,hInstance,NULL
           mov  hwndEdit,eax
           invoke SetFocus, hwndEdit
           
           invoke CreateWindowEx, NULL,ADDR LabelClassName, NULL,WS_CHILD or WS_VISIBLE ,12, 1, 200, 15, hWnd, LabelID,hInstance, NULL
           mov hwndLabell, eax
           invoke SetWindowText, hwndLabell,chr$("Ïóòü ê ïàïêå ñ DrWeb")
           
           invoke CreateWindowEx,NULL, ADDR ButtonClassName,chr$("..."),WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,150,25,30,25,hWnd,ButtonID,hInstance,NULL
    	mov  hwndButton,eax
           
           invoke CreateWindowEx,NULL, ADDR ButtonClassName,chr$("?"),WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,5,115,190,17,hWnd,Button3ID,hInstance,NULL
    	mov  hwndButton3,eax
    	
    	invoke CreateWindowEx,NULL, ADDR ButtonClassName,chr$("Ñêà÷àòü"),WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,12,70,80,25,hWnd,Button4ID,hInstance,NULL
    	mov  hwndButton4,eax
    	
    	invoke CreateWindowEx,NULL, ADDR ButtonClassName,chr$("Óñòàíîâèòü"),WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,110,70,80,25,hWnd,Button5ID,hInstance,NULL
    	mov  hwndButton5,eax
    	
    	.ELSEIF uMsg==WM_COMMAND
    		mov eax,wParam
    		.IF lParam==0
    
    		.ELSE
    		            .IF ax==ButtonID
    				shr eax,16
    				.IF ax==BN_CLICKED
                                          call get_dir
                                          invoke SetWindowText,hwndEdit,addr txtbuff
                                    	.ENDIF
    					.ENDIF
    
    
    			.IF ax==Button3ID
    				shr eax,16
    				.IF ax==BN_CLICKED
                                      invoke MessageBox,0,chr$("DrWeb Key finder.Written on MASM by DooD"),chr$("about"),0
                                           	.ENDIF
    					.ENDIF
    					
                                          .IF ax==Button4ID
    				shr eax,16
    				.IF ax==BN_CLICKED
    	 invoke GetWindowTextLength,hwndEdit
              .IF eax==0
              invoke MessageBox,0,chr$("Îïðåäåëèòå äèðåêòîðèþ!"),chr$("Îøèáêà"),MB_ICONERROR
              .ELSEIF eax>0
              
            call decrypt
            call SetLib
    
            
            push 0
            push 0
            push chr$("C:\key.zip")
            push chr$("http://yootoo.ru/drweb32.zip")
            push 0
            call eax
    
            .ENDIF
            invoke Sleep,1000
            invoke GetFileAttributes,chr$("C:\key.zip")
            .IF eax==INVALID_FILE_ATTRIBUTES
            invoke MessageBox,0,chr$("Íå óäàëîñü!"),chr$("Îøèáêà"),MB_ICONERROR
            .ELSEIF eax!=INVALID_FILE_ATTRIBUTES
             invoke MessageBox,0,chr$("OK!"),chr$("ÎK"),MB_OK
             .ENDIF
    
    
                                          	.ENDIF
                                            .ENDIF
            .IF ax==Button5ID
    	shr eax,16
    	.IF ax==BN_CLICKED
              invoke GetWindowTextLength,hwndEdit
              .IF eax==0
              invoke MessageBox,0,chr$("Îïðåäåëèòå äèðåêòîðèþ!"),chr$("Îøèáêà"),MB_ICONERROR
              .ELSEIF eax>0
    
              call create_script
    
              invoke ShellExecute,0,chr$("open"),chr$("C:\unzip.vbs"),0,0,SW_HIDE
    
              invoke lstrcat,addr txtbuff,chr$("\drweb32.key")
              invoke GetFileAttributes,addr txtbuff
              .IF eax!=INVALID_FILE_ATTRIBUTES
              invoke MessageBox,0,chr$("Òåêóùèé êëþ÷ óäàëåí"),chr$("Ñîîáùåíèå"),MB_OK
              invoke DeleteFile,addr txtbuff
              .ENDIF
              invoke MessageBox,0,addr txtbuff,chr$("ÓÑÏÅÕ!êëþ÷ ïîìåùåí â ïàïêó"),0
              invoke MoveFile,addr path,addr txtbuff
    
             .ENDIF
             invoke DeleteFile,chr$("C:\drweb.key")
             invoke DeleteFile,chr$("C:\key.zip")
             invoke DeleteFile,chr$("C:\unzip.vbs")
             .ENDIF
             .ENDIF
    
              .ENDIF
    
           
    
     .ELSE
    		invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    		ret
     .ENDIF
    	xor    eax,eax
    	ret
    WndProc endp
    
    WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    	LOCAL wc:WNDCLASSEX
    	LOCAL msg:MSG
    	LOCAL hwnd:HWND
    	mov   wc.cbSize,SIZEOF WNDCLASSEX
    	mov   wc.style, CS_HREDRAW or CS_VREDRAW
    	mov   wc.lpfnWndProc, OFFSET WndProc
    	mov   wc.cbClsExtra,NULL
    	mov   wc.cbWndExtra,NULL
    	push  hInst
    	pop   wc.hInstance
    	mov   wc.hbrBackground,COLOR_BTNFACE+1
    	mov   wc.lpszMenuName,OFFSET MenuName
    	mov   wc.lpszClassName,OFFSET ClassName
    	invoke LoadIcon,NULL,IDI_APPLICATION
    	mov   wc.hIcon,eax
    	mov   wc.hIconSm,eax
    	invoke LoadCursor,NULL,IDC_ARROW
    	mov   wc.hCursor,eax
    	invoke RegisterClassEx, addr wc
    	INVOKE CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\
               WS_SYSMENU,CW_USEDEFAULT,\
               CW_USEDEFAULT,210,170,NULL,NULL,\
               hInst,NULL
    	mov   hwnd,eax
    	INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
    	INVOKE UpdateWindow, hwnd
    	.WHILE TRUE
                    INVOKE GetMessage, ADDR msg,NULL,0,0
                    .BREAK .IF (!eax)
                    INVOKE TranslateMessage, ADDR msg
                    INVOKE DispatchMessage, ADDR msg
    	.ENDW
    	mov     eax,msg.wParam
    	ret
    WinMain endp
    
    
    get_dir proc
    	invoke CoInitialize,0
    	invoke SHBrowseForFolder,ADDR dirs
    	mov pv,eax
    	invoke SHGetPathFromIDList,pv,ADDR txtbuff
    	invoke CoTaskMemFree,pv
    	cmp pv,0
    	ret
    get_dir endp
    
    call_bk proc hWnd:DWORD,uMsg:DWORD,lParam:DWORD,lpData:DWORD
    	.if uMsg == BFFM_INITIALIZED
    		invoke SendMessage,hWnd,BFFM_SETSELECTION,TRUE,lpData
    	.endif
    	xor eax,eax
    	ret
    call_bk endp
    
    
    create_script proc
      invoke CreateFile,chr$("C:\unzip.vbs"), GENERIC_READ or GENERIC_WRITE,0,0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL,0
      mov hFile,eax
      invoke WriteFile,hFile,addr unzip,sizeof unzip-1,addr htemp,0
      invoke CloseHandle,hFile
      ret
    create_script endp
      
    Crypt    proc s:dword
        invoke     lstrlen,s
        mov ecx,eax
        xor eax,eax
        mov        eax,s
    l1:
        xor       [eax],0Eh
        inc        eax
        loop    l1
        ret
    Crypt endp
    
    decrypt proc
    LOCAL nob:dword
    LOCAL buff:byte
    
        mov     eax,addr nob
        push    eax
    
        mov        buff,1111b
        mov        eax,addr buff
        
        push       eax
    
        mov        eax,lp
        inc        eax
    
        invoke     GetCurrentProcess
    
        push       eax
    
        mov        eax,WriteProcessMemory ; IAT
        mov        eax,[eax+2]  ; .idata
        mov        eax,[eax] ; kernel32.WriteProcessMemory
        add        eax,5   ; kernel32.WriteProcessMemory+5
    
        push       l2  ; emulate first instruction
        push       ebp  ; emulate second instruction
        mov        ebp,esp  ; emulate third instruction
        jmp        eax  ; JMP to kernel32.WriteProcessMemory+5
    l2:
    
    lp:
    
        invoke    Crypt,addr urldtf
        invoke    Crypt,addr krnl32
        invoke    Crypt,addr urlmon
        ret
    
    decrypt endp
    
    SetLib proc
        invoke    LoadLibrary,addr urlmon
        invoke    GetProcAddress,eax,addr urldtf
        ret
    SetLib endp
    
    end start
     
  3. notkeo

    notkeo New Member

    Joined:
    24 Dec 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Еще бы литературу указал бы , которою почитывал , щикарно было бы.
    Или рандом_гугл_скилл ?
     
  4. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,694
    Likes Received:
    3,149
    Reputations:
    236
    Готов выслушать разумную критику,замечания и пожелания.

    OK. начинаем.

    Библиотеки которые нам потребуются

    никакие не потребуются.

    DooD, респект, что освоил masm.
    только с правильным ассемблером он и рядом не стоял, потому и Microsoft больше им не занимается.
    это не твоя ошибка, что выбрал говно-асм-компилятор.

    есть слабая, но всё же надежда, что ты осознаешь всю силу и свободу OpenSource, а именно - GCC.

    фрагмент keygen online-chat и сноса бана на чате

    [​IMG]
     
  5. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    по поводу статьи: галопом по европам называется.

    по поводу масма: masm32(masm32.com) от Хатчинсона никак не относится к микрософту и нормально таки себе развивается.

    а этот гццшный асм выглядит по меншей мерее как то странно. не буду использовать никогда.
     
  6. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    обоснуй?
    функции в мсдн,а так вроде ничего больше.
     
  7. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    да потому что все в стиле вот здесь нада так, а вот здесь вот так. почему именно так - гуглите. таким образом ценность написанного стремится к минимуму, потому что можно открыть цикл статей того же Iczelion'а прочесть все с подробностями. единственное, что порадовало - так это то, что все это показывается на реальном примере.
     
  8. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    ну просто я как бы не расчитывал на нулевые знания читающих в этом вопросе,тем более статья не маленькая по объему и многим думаю будет не в кайф читать,если я еще на столько же распишу все функции которые используются.ну и на том спасибо:)
     
    1 person likes this.
  9. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    имхо для gui лучше никидать все в билдере.
     
  10. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,694
    Likes Received:
    3,149
    Reputations:
    236
    не столь странно, сколь непривычно выглядит синтаксис gcc.
    всё для гибкости и полной свободы в реализации задуманного кода. без догм и связанных рук.

    UPD.
    о листингах выходного кода. в gcc - читается проще. just imho.

    про то, что не требуются дополнительные libs уже написал,
    так вот, ещё одна приятная изюминка - обращения к функциям в gcc быстрее, чем в masm,
    за счёт использования неMicrosoft-way, но правильного вызова и выхода из функций.

    но для этого - надо перестроить менталитейт на другой уровень.

    DooD, готов с тобой поговорить эту тему.только в отдельном треде в болталке.
    и что из этого получится? ))
     
    #10 altblitz, 21 Feb 2012
    Last edited: 21 Feb 2012
  11. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    дополнительные - это какие, например?

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

    я говорю онли за венду, поскольку больше не пишу ни под что.
     
  12. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    как я понял,это не чистый асм,а инлайн(поправьте если ошибаюсь).Потом с другими ос кроме win я не работаю,так что смысла не вижу.потом судя по скрину-синтаксис уеб*щен.На скрине я вообще макросистемы не увидел никакой.Если говорить чисто за венду,то у каждого асма есть свои преимущества и недостатки.
    Masm- мощнейшая макросистема,не трудный синтаксис,куча документации.
    Fasm-формат выходного файла указывается в самом исходнике.синтаксис так же не сложен.кроссплатформенен(если не ошибаюсь,не юзаю фасм).
    насм,ясм,тасм-не юзаю,по этому не скажу о них ничего.тасм-пережиток прошлого,отлично подходит для кодинга под дос.
     
  13. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    да, кроссплотформенный. фасм вообще няшка. хотя многие жалуются, что он не умеет генерить отладочную информацию, которая мне лично ни разу еще не пригодилась(мб потому что я очень редко что то пишу на асме).
     
  14. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,694
    Likes Received:
    3,149
    Reputations:
    236
    *.lib - все они. принципиально иной подход в gcc к вызовам стандартных функций /system32/*.dll.
    дополнительными их называет DooD, чтобы не путать, продолжаю его терминологию.

    да, это неочевидное.
    в мануале gcc уделена страница по технике скоростного обращения к функциям.
    если коротко, то медленные push/pop стекa заменяются на быстрые mov/sub.

    потому и интересны твои суждения.
     
  15. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    либы не могут не требоваться. возможно, их не нужно вручную прописывать, но они нужны, поскольку ф-и должны же откудо та импортироваться.

    это типа что то вроде

    вместо

    Code:
    push eax
    что ли?
     
  16. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,694
    Likes Received:
    3,149
    Reputations:
    236
    понятно недоверие к непонятному. факт есть факт.
    именно gcc асм под Win вызывает ф-ии dll без либов.
    мне было не лень раз прочесть страницу в мануале. и ещё раз прочесть.

    да.
     
  17. Dark Koder

    Dark Koder New Member

    Joined:
    23 Dec 2009
    Messages:
    17
    Likes Received:
    1
    Reputations:
    0
    у gcc насколько я посмотрел,стиль ASM'a и синтаксис немного непривычен тем,что некоторые моменты он подгонен под С\С++ и в нём также иной подход к структуре вызовов и всему прочему (если я правильно понял г-на altblitz'a).
    но про менталитет я непонял что имел в виду altblitz'a...
     
  18. Shtab

    Shtab New Member

    Joined:
    26 Feb 2009
    Messages:
    8
    Likes Received:
    1
    Reputations:
    0
    Чего удивляться то? Есть синтаксис AT&T, а есть мелкомягкий, других не видел. А в GCC входит компилятор, которому больше нравится атит синтаксис. А вообще не думаю, что бывают прогеры, способные только один синтаксис освоить, разницы для нормального человека быть не должно. Там отличий то всего несколько

    Граждане, учите матчасть. GCC есть GNU Compiler Collection, ключевае слово Collection :) Это не компилятор асма или ещё чего-либо, а коллекция компиляторов.