![]() |
Всем доброго времени суток.У меня сейчас за полночь,делать нечего.Решил статейку накатать.Речь сегодня пойдет о программировании gui на ассемблере+ немного затронем сторону безопасности.В качестве цели я выбрал недавнюю прогу мной написанную-что то вроде установщика ключей для АВ др.вэб.
Ну пожалуй начнем. Инструменты: 1)Ассемблер.Берите любой,я люблю масм. 2)а..блин больше ниче не надо И так кратенький алгоритм программки: 1)Узнать и скачать ключи на сервисах 2)Распаковать зип архив 3)Инсталлировать ключ в выбранную папку 4)убраться за собой. КОДЕС. Я попытаюсь описать все по порядку. Сначала мы всегда указываем архитектуру процессора и модель памяти со стандартом вызова функций. Код:
.386Код:
include include\windows.incПосле этого у нас идет 2 прототипа функций,но к этому вернемся позже. Я обычно не люблю подключать макросы,а если надо 1-2 макроса обычно добавляю их в код,я добавил следующий макрос Код:
chr$ MACRO any_text:VARARGдалее у нас идет секция инициализированных перменных,к ней тоже чуть позже. За ней идет секция не инициализированных переменных. За тем идут константы,и собсно секция кода. Для того что бы писать gui нам надо для начала написать процедуру,где будет заполняться некая специальная структура,которая позволит отрисовать окно. Ее код следующий Код:
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORDПомните я говорил про прототипы?Вот сейчас нужно внести эту функцию в прототипы. то есть теперь начало будет выглядеть так: Код:
.386Что представляет собой прототип?Обычно функция вызывается так: Код:
push param1В масме есть такая изумительная вещь как макросы.Прототип позволит вызвать функцию так Код:
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Код:
hwndButton HWND ?Код:
.constи так создание контролла выглядит так Код:
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Более подробно параметры этой АПИ можно посмотреть в мсдн. так же создается label и button Код:
invoke CreateWindowEx, NULL,ADDR LabelClassName, NULL,WS_CHILD or WS_VISIBLE ,12, 1, 200, 15, hWnd, LabelID,hInstance, NULLи так дальше создаем весь интерфейс. Допустим вы создали интерфейс. Что дальше спросите вы? дальше нам надо написать обработчики событий.Наши обработчики будут только на кнопках,так что нам повезло) Вот как выглядит интерфейс. http://4put.ru/pictures/max/268/823369.jpg Создадим самый первый и простой обработчик на кнопке «?» (о программе) значит после функций создания контроллов непосредственно идет код: Код:
.ELSEIF uMsg==WM_COMMANDу меня это 3 напрмер.Теперь программа определит-если была нажата кнопка-показать MessageBox с заданной информацией. Второй по возрастанию сложности обработчик будет выбор папки для установки ключа его код следующий. Код:
.IF ax==ButtonIDg Код:
et_dir procперменные процедуры Код:
data.Код:
.data ?И ВОТ ОН,НАСТУПАЕТ САМЫЙ АДСКИЙ МОМЕНТ!!!. Скачивание ключа.тут мы и затронем тему безопасности. Сервисы я приводить не буду,захотите-отснифайте(в исходнике будет один). Тут у меня было 3 варианта как поступить. 1)Скачивание через wininet 2)скачивание одной апишкой- URLDownloadToFile 3)скачивание через сокеты. Так как программист по натуре личность крайне ленивая-сокеты я сразу выкинул(и как всегда это мне окупилось 3-ым п*здецом) Сразу попробовал на wininet скачивать,не тут то было-АВ (как раз др.вэб,себе же и писал тулзу)завопил,думаю ладно,попробовал через апишку-даже скомпилить не дал,заорал.ну думаю хрен там ,на сокетах принципиально делать не буду,а то угрохаю время,а он палить будет.Ох зря я так думал.Короче говоря я начал думать.Пришел к выводу что статический импорт функций оно то хорошо палит и решил заменить на динамический.Пара АВ изменили свое мнение,но мой по прежнему бил тревогу.Потом я подумал ай,побалуюсь с ПЭБ-посмотрел структуру PEB-нет спасибо.Дошел я до того что походу палит по строкам таблицы импорта,а то и по флагам функций,решил сделать так: зашифровать АПИ и библиотеки простым однобайтным ксором и вшить зашифрованные строки,после чего сделать что то вроде моста на writeprocessmemory, потом перед вызовом функции сделать так: расшифровать строки. динамически подгрузить ее из dll, передав в кач-ве параметров расшифрованные строки. вызвать функцию динамически из dll. После проведенных манипуляций и жесткого хардкора над разумом,АВ тупо молчал.он был повержен.я возрадовался.И в то же время понял,что 100% защиты не бывает.Конечно не стоит винить разрабов АВ,если бы я поксорил бы функции то он бы спокойно схавал downloader. Реализация: Код:
Crypt proc s:dword ; функцию можно внести в прототип.Код:
decrypt procКод:
SetLib procи теперь сам вызов выглядит так: Код:
.IF ax==BN_CLICKEDдекриптуем строки подгружаем функу вызываем ее. даем паузу 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а это процедура отвечающая за создание скрипта Код:
create_script procпоследний обработчик выглядит так: Код:
.IF ax==Button5IDобработчики закончились и огромная процедура закрывается так Код:
.ELSEвызывается Код:
start:для создания стиля windows я использовал такой вот файлик ресурсов,добавляет манифест и иконку Код:
rsrc.rc |
сорец:
Код:
;написано и скомпилировано в assembler editor |
Еще бы литературу указал бы , которою почитывал , щикарно было бы.
Или рандом_гугл_скилл ? |
Готов выслушать разумную критику,замечания и пожелания.
OK. начинаем. Библиотеки которые нам потребуются никакие не потребуются. DooD, респект, что освоил masm. только с правильным ассемблером он и рядом не стоял, потому и Microsoft больше им не занимается. это не твоя ошибка, что выбрал говно-асм-компилятор. есть слабая, но всё же надежда, что ты осознаешь всю силу и свободу OpenSource, а именно - GCC. фрагмент keygen online-chat и сноса бана на чате http://img27.imageshack.us/img27/861/2012022002.png |
по поводу статьи: галопом по европам называется.
по поводу масма: masm32(masm32.com) от Хатчинсона никак не относится к микрософту и нормально таки себе развивается. а этот гццшный асм выглядит по меншей мерее как то странно. не буду использовать никогда. |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
имхо для gui лучше никидать все в билдере.
|
Цитата:
всё для гибкости и полной свободы в реализации задуманного кода. без догм и связанных рук. UPD. о листингах выходного кода. в gcc - читается проще. just imho. про то, что не требуются дополнительные libs уже написал, так вот, ещё одна приятная изюминка - обращения к функциям в gcc быстрее, чем в masm, за счёт использования неMicrosoft-way, но правильного вызова и выхода из функций. но для этого - надо перестроить менталитейт на другой уровень. DooD, готов с тобой поговорить эту тему.только в отдельном треде в болталке. и что из этого получится? )) |
| Время: 14:15 |