Категория > Новости > Качественная склейка. Пишем джоинер исполняемых файлов для Win64 - «Новости»

Качественная склейка. Пишем джоинер исполняемых файлов для Win64 - «Новости»


11-11-2020, 00:02. Автор: Wesley
Пред­ста­вим, что нам нуж­но запус­тить некий злов­редный код на машине жер­твы. Дос­тупа к это­му ком­пу у нас нет, и кажет­ся, что самым прос­тым вари­антом будет вынудить жер­тву сде­лать все за нас. Конеч­но, ник­то в здра­вом уме не запус­тит сом­нитель­ное ПО на сво­ем девай­се, поэто­му жер­тву нуж­но заин­тересо­вать — пред­ложить что-то полез­ное. Тут в дело всту­пает джо­инер — тул­за, которая встро­ит в полез­ную наг­рузку наш код и скрыт­но его запус­тит.

warning


Статья пред­назна­чена для «белых хакеров», про­фес­сиональ­ных пен­тесте­ров и руково­дите­лей служ­бы информа­цион­ной безопас­ности (CISO). Ни автор, ни редак­ция не несут ответс­твен­ности за любой воз­можный вред, при­чинен­ный при­мене­нием информа­ции дан­ной статьи.



Су­щес­тву­ют ли готовые решения, пред­назна­чен­ные для склей­ки прог­рамм и вре­донос­ной наг­рузки? Безус­ловно, но здесь есть ряд проб­лем. Такие инс­тру­мен­ты детек­тятся анти­виру­сами, сто­ят денег и час­то про­дают­ся как сер­вис, то есть тре­буют опла­ты за разовую склей­ку. Бес­плат­ные и прос­тые спо­собы встро­ить полез­ную наг­рузку вида «помес­тим фай­лы в саморас­паковы­вающий­ся архив» и вов­се баналь­ный фуф­ломицин. Решение же, сде­лан­ное сво­ими руками, может быть улуч­шено, исправ­лено в слу­чае детек­та и, конеч­но, оста­нет­ся бес­плат­ным.


Немного теории


Джо­инер может и дол­жен скле­ивать два исполня­емых фай­ла. Пер­вый — визу­аль­ная обо­лоч­ка, кра­сивая кар­тинка и отвле­кающий маневр. Это то, что уви­дит юзер на экра­не сво­его компь­юте­ра, ког­да запус­тит исполня­емый файл. Вто­рой — полез­ная наг­рузка, которая запус­кает­ся без явно­го желания поль­зовате­ля. По умол­чанию вто­рой файл не будет как-то скрыт: если в нем при­сутс­тву­ют окна или, нап­ример, гром­кое музыкаль­ное соп­ровож­дение, то это все юзер заметит. Поэто­му нуж­но обес­печить скрыт­ную работу полез­ной наг­рузки. Джо­инер лишь скле­ивает, но не мас­киру­ет вре­донос­ное при­ложе­ние.


А может ли джо­инер скле­ить исполня­емый файл с кар­тинкой? Может, но это не име­ет смыс­ла. Чис­то теоре­тичес­ки, если бы он скле­ивал исполня­емый файл и кар­тинку, на выходе все рав­но получал­ся бы исполня­емый файл, который не имел бы рас­ширения .jpg, .png или дру­гого подоб­ного. Редак­торы и прос­мот­рщи­ки кар­тинок такой файл открыть не смо­гут. Либо мы получим кар­тинку, но в таком слу­чае не смо­жем запус­тить исполня­емый файл. Есть еще вари­ант, ког­да при­ложе­ние стар­тует и откры­вает кар­тинку через API ShellExecute. Дей­ствие занят­ное, но толь­ко в качес­тве фокуса — поль­зы от него никакой.


Как устроен наш вариант


На­шей целью будет Windows 10 x64, но, поняв прин­цип, лег­ко мож­но перера­ботать инс­тру­мен­тарий под дру­гие вер­сии семей­ства Windows. Код дол­жен работать и на Windows 7/8, но не тес­тировал­ся там. Мы будем исполь­зовать смесь С++ и ассем­бле­ра.


Алгоритм работы


Обо­лоч­ка — наш пер­вый ехе, который будет виден кли­енту. Это, так ска­зать, при­ман­ка. Наг­рузка — вто­рой ехе, в котором содер­жится злов­редный кон­тент. В обо­лоч­ку добав­ляет­ся допол­нитель­ная сек­ция, куда записы­вает­ся шелл-код и наг­рузка. Управле­ние сра­зу переда­ется на шелл-код, задача которо­го — извлечь наг­рузку, сох­ранить ее на диск и запус­тить. На вер­хнем уров­не все сво­дит­ся к тому, что мы получа­ем некий бай­товый мас­сив, который дол­жны положить в допол­нитель­ную сек­цию. Потом оста­нет­ся лишь испра­вить точ­ку вхо­да у обо­лоч­ки, и все — склей­ка завер­шена.


try {
const auto goodfile = std::wstring(argv[1]);
const auto badfile = std::wstring(argv[2]);
const auto content = CreateData(badfile,goodfile);
AddDataToFile(goodfile, content, L"fixed.exe");
}
catch (const std::exception& error)
{
std::cout << error.what() << std::endl;
}


Перейти обратно к новости