ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Статьи (https://forum.antichat.xyz/forumdisplay.php?f=30)
-   -   GUI на ассемблере. (https://forum.antichat.xyz/showthread.php?t=320055)

DooD 21.02.2012 04:38

Всем доброго времени суток.У меня сейчас за полночь,делать нечего.Решил статейку накатать.Речь сегодня пойдет о программировании gui на ассемблере+ немного затронем сторону безопасности.В качестве цели я выбрал недавнюю прогу мной написанную-что то вроде установщика ключей для АВ др.вэб.

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

Инструменты:

1)Ассемблер.Берите любой,я люблю масм.

2)а..блин больше ниче не надо

И так кратенький алгоритм программки:

1)Узнать и скачать ключи на сервисах

2)Распаковать зип архив

3)Инсталлировать ключ в выбранную папку

4)убраться за собой.

КОДЕС.

Я попытаюсь описать все по порядку.

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

Код:

.386
.model flat, stdcall
option casemap:none

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

Код:

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 макроса обычно добавляю их в код,я добавил следующий макрос

Код:

chr$ MACRO any_text:VARARG
LOCAL txtname
.data
txtname db any_text,0
.code
EXITM
ENDM

он позволит нам в некоторых местах заменить строчные переменные.

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

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

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

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

Ее код следующий

Код:

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

Описывать ее слишком долго,займет еще полстатьи)Если очень важно прям знать почему что и где-все гуглится.

Помните я говорил про прототипы?Вот сейчас нужно внести эту функцию в прототипы.

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

Код:

.386
.model flat, stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

DWORD-ы это кол-во параметров ф-ии (как в Delphi например Function(param1,param2…))

Что представляет собой прототип?Обычно функция вызывается так:

Код:

push param1
push param2
push …
call somefunc

то есть параметры передаются через стэк,а затем происходит вызов фу-ии.

В масме есть такая изумительная вещь как макросы.Прототип позволит вызвать функцию так

Код:

invoke somefunc,param1,param2,…
Теперь идет основная процедура окна.Вот тут то и начинается самый джигурдец.

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

1)Через ресуры

2)Через вин АПИ.

Создание интерфейса через ресурсы,не очень трудно,есть такой маленький инструмент- res ed. Он позволяет визуально разместить контроллы на форме и записать все в файл-ресурс,который потом прилинковывается к нашей программе.конечно хочу вас огорчить, но обрабатывать события эта штуковина не позволяет.все делается только ручками.

Если вас не заинтересовал хардкорный вариант создания контроллов,то вот есть хорошая статья от нашего d_x’a https://xakepy.cc/showthread.php?t=65611

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

и буду клепать контроллы через АПИ

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

http://4put.ru/pictures/max/268/823368.jpg

то есть у нас 4 кнопочки,1 лэйбл и 1 эдит.

Опишем все.

Наши контроллы на окне будут создаваться с помощью АПИ функции CreateWindowEx

В параметры ф-ии входят класс и ИД контролла.

в секции .data (инициализированных переменных) укажем их:

Код:

ButtonClassName db "button",0
EditClassName db "edit",0
LabelClassName DB "STATIC", 0

в секции .data? (не иниц. перем.) укажем их дескрипторы

Код:

hwndButton HWND ?
hwndButton3 HWND ?
hwndButton4 HWND ?
hwndButton5 HWND ?

hwndEdit HWND ?

hwndLabell HWND ?

в секции констант укажем их Ид и больше к секции констант мы не вернемся.

Код:

.const
ButtonID equ 1
Button3ID equ 3
Button4ID equ 5
Button5ID equ 6

EditID equ 4

LabelID EQU 8

эквивалентность равна любому значение,только нельзя указывать повторные. Id понадобятся нам для обработки событий контроллов.

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

Код:

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

Код:

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.

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

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

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

http://4put.ru/pictures/max/268/823369.jpg

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

значит после функций создания контроллов непосредственно идет код:

Код:

.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 с заданной информацией.

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

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

Код:

.IF ax==ButtonID
                                shr eax,16
                                .IF ax==BN_CLICKED
                                      call get_dir
                                      invoke SetWindowText,hwndEdit,addr txtbuff
                                        .ENDIF
                                        .ENDIF

И так у нас тут есть процедура get_dir. это опять же структура.она позволит нам выбрать каталог.после чего в поле edit поместится путь к этому каталогу.Сама процедура имеет вид:

g

Код:

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 структуры так же есть в нете.

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

Код:

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 ; структура

Код:

.data ?
pv  dd ?
txtbuff db  512 dup(?)

Да чего я еще не сказал,каждая процедура должна оканчиваться командой ret- возвращение в подпрограмму,

И ВОТ ОН,НАСТУПАЕТ САМЫЙ АДСКИЙ МОМЕНТ!!!.

Скачивание ключа.тут мы и затронем тему безопасности.

Сервисы я приводить не буду,захотите-отснифайте(в исходнике будет один).

Тут у меня было 3 варианта как поступить.

1)Скачивание через wininet

2)скачивание одной апишкой- URLDownloadToFile

3)скачивание через сокеты.

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

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

зашифровать АПИ и библиотеки простым однобайтным ксором и вшить зашифрованные строки,после чего сделать что то вроде моста на writeprocessmemory, потом перед вызовом функции сделать так:

расшифровать строки.

динамически подгрузить ее из dll, передав в кач-ве параметров расшифрованные строки.

вызвать функцию динамически из dll. После проведенных манипуляций и жесткого хардкора над разумом,АВ тупо молчал.он был повержен.я возрадовался.И в то же время понял,что 100% защиты не бывает.Конечно не стоит винить разрабов АВ,если бы я поксорил бы функции то он бы спокойно схавал downloader.

Реализация:

Код:

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

динамическая подгрузка.

и теперь сам вызов выглядит так:

Код:

.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 скрипт,эти скрипты не раз мне уже спасали жизнь.за пару мгновений был создан скриптик:

Код:

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, что то вроде оптимизации.

а это процедура отвечающая за создание скрипта

Код:

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

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

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

Код:

.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, так что я более чем доволен.Запускается скрипт,распаковывая наш ключ,проверяется наличие старого ключа-удаляется,помещается новый-выдается извещение.после чего все удаляется что появилось.

обработчики закончились и огромная процедура закрывается так

Код:

.ELSE
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam
                ret
 .ENDIF
        xor    eax,eax
        ret
WndProc endp

после директивы .code

вызывается

Код:

start:

 invoke GetModuleHandle, NULL
 mov    hInstance,eax
 invoke GetCommandLine
 mov CommandLine,eax
 invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
 invoke ExitProcess,eax

наша главная процедура.

для создания стиля windows я использовал такой вот файлик ресурсов,добавляет манифест и иконку

Код:

rsrc.rc

#define MANIFEST 24
#define IDR_XPMANIFEST1 1
#define ico 100

IDR_XPMANIFEST1 MANIFEST "xpmanifest.xml"
ico ICON DISCARDABLE "ico.ico"

полный исходник прилагается.Готов выслушать разумную критику,замечания и пожелания.Надеюсь объяснял понятно(ну старался по крайней мере)и интересно.Спасибо за внимание да прибудут с вами знания асма!!

DooD 21.02.2012 04:49

сорец:

Код:

;написано и скомпилировано в assembler editor
;/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
ENDM

.data
urldtf db '[\BJay`baojZaHgbkO',0
shlexc db ']fkbbKvkm{zkO',0

krnl32 db 'ek|`kb=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


notkeo 21.02.2012 05:04

Еще бы литературу указал бы , которою почитывал , щикарно было бы.

Или рандом_гугл_скилл ?

altblitz 21.02.2012 06:30

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

OK. начинаем.

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

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

DooD, респект, что освоил masm.

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

это не твоя ошибка, что выбрал говно-асм-компилятор.

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

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

http://img27.imageshack.us/img27/861/2012022002.png

Ins3t 21.02.2012 15:25

по поводу статьи: галопом по европам называется.

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

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

DooD 21.02.2012 15:55

Цитата:

Сообщение от Ins3t
по поводу статьи: галопом по европам называется.

обоснуй?

Цитата:

Сообщение от None
Еще бы литературу указал бы , которою почитывал , щикарно было бы.
Или рандом_гугл_скилл ?

функции в мсдн,а так вроде ничего больше.

Ins3t 21.02.2012 16:11

Цитата:

Сообщение от None
обоснуй?

да потому что все в стиле вот здесь нада так, а вот здесь вот так. почему именно так - гуглите. таким образом ценность написанного стремится к минимуму, потому что можно открыть цикл статей того же Iczelion'а прочесть все с подробностями. единственное, что порадовало - так это то, что все это показывается на реальном примере.

DooD 21.02.2012 16:14

Цитата:

Сообщение от Ins3t
да потому что все в стиле вот здесь нада так, а вот здесь вот так. почему именно так - гуглите. таким образом ценность написанного стремится к минимуму, потому что можно открыть цикл статей того же Iczelion'а прочесть все с подробностями. единственное, что порадовало - так это то, что все это показывается на реальном примере.

ну просто я как бы не расчитывал на нулевые знания читающих в этом вопросе,тем более статья не маленькая по объему и многим думаю будет не в кайф читать,если я еще на столько же распишу все функции которые используются.ну и на том спасибо

MTV 21.02.2012 16:25

имхо для gui лучше никидать все в билдере.

altblitz 21.02.2012 17:08

Цитата:

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

не столь странно, сколь непривычно выглядит синтаксис gcc.

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

UPD.

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

про то, что не требуются дополнительные libs уже написал,

так вот, ещё одна приятная изюминка - обращения к функциям в gcc быстрее, чем в masm,

за счёт использования неMicrosoft-way, но правильного вызова и выхода из функций.

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

DooD, готов с тобой поговорить эту тему.только в отдельном треде в болталке.

и что из этого получится? ))


Время: 14:15