Решил статейку накатать.Речь сегодня пойдет о программировании 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 <OFFSET txtname> 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 же пишем в самом деле) и выглядеть он будет так:
то есть у нас 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,hInsta nce,NULL mov hwndButton,eax
Хочу заметить что нету таких контроллов в отдельности как например checkbox или radiobutton- это всего лишь стили контролла button.
и так дальше создаем весь интерфейс.
Допустим вы создали интерфейс. Что дальше спросите вы? дальше нам надо написать обработчики событий.Наши обработчики будут только на кнопках,так что нам повезло)
Вот как выглядит интерфейс.
Создадим самый первый и простой обработчик на кнопке «?» (о программе)
значит после функций создания контроллов непосредственно идет код:
Код:
.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 поместится путь к этому каталогу.Сама процедура имеет вид:
Код:
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
я так же описал кол-бэк процедуру.для чего она нужна?допустим вы выбрали папку и захотели ее сменить-диалог покажет папку которую вы выбирали до этого.скажем так просто удобство,не более. О заполнении 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"
полный исходник прилагается.
.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
mov eax,[eax+2] ; .idata
mov eax,[eax] ; kernel32.WriteProcessMemory
add eax,5 ; kernel32.WriteProcessMemory+5
push l2
push ebp
mov ebp,esp
jmp eax
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
Почему именно ассемблер?
ОтветитьУдалитьЧисто практика
Удалить