сделать автономный exe-файл, извлекающий файлы и другие команды - PullRequest
0 голосов
/ 05 апреля 2011

Я делаю фильтрующий сниффер в C и winPCAP, который запускается при каждой загрузке.Для этого я хочу создать автономный exe файл, который извлекает (нет, не сжатие!) Exe и DLL-файлы в новую папку и выполняет другие команды (например, изменяет параметры запуска) без вывода сообщений.окно / терминал.

Итак

  1. Один файл содержит исполняемый файл и библиотеки DLL.

  2. При выполнении он копирует файлы в папкуи выполняет другие команды

  3. Он делает это тихо, без каких-либо окон или терминалов или вмешательства пользователя

Я подчеркиваю Тихо часть, поэтому я не могу выбрать несколько простых установщиков.Можете ли вы порекомендовать что-то, что генерирует этот исполняемый файл?

Для любопытных: это программа стелс-пакетирования для моего проекта в колледже.Часть «стелс» будет опробована только на виртуальных машинах xp2 с IE6 (да, старые вещи).

EDIT : ответ на комментарии: это вредоносного характера.Так что я запускаю его в virtualbox, никогда не на свободе .И я могу скомпрометировать только незащищенные системы XP с IE6, без антивируса, то есть со старого установочного диска.Это сфера использования IE css после бесплатной уязвимости , AFAIK никогда не видел в дикой природе.Так что тут неэтичное поведение.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

Вы можете легко встраивать ресурсы, связывая их с компилятором или используя специальную программу и инструментируя Windows API.

Что-то вроде:

char file_to_be_altered[] = "MyInstaller.exe"

HANDLE hUpdate = BeginUpdateResource( file_to_be_altered, FALSE );
UpdateResource( hUpdate, "MyResType", "MyResName1", 0, pData, data_len );
EndUpdateResource( hUpdate, FALSE );

Затем, когда ваш исполняемый файл запускается, вы перечисляете свои ресурсы и выбираете те, которые имеют тип «MyResType».

struct res_entry { BYTE* pData; unsigned int len; }

BOOL CALLBACK EnumNamesCB(
    HMODULE hModule,  // module handle
    LPCTSTR lpType,   // address of resource type
    LPTSTR lpName,    // address of resource name
    LONG_PTR lParam)      // 
{
    std::vector<res_entry>& lst = *(reinterpret_cast< std::vector<res_entry>* >( lParam ));
    HRSRC hRes = FindResource( hModule, lpName, lpType );
    if( hRes == 0 )     return TRUE;
    unsigned int len = SizeofResource( hModule, hRes );

    HGLOBAL hGlob = LoadResource( hModule, hRes );
    if( hGlob == 0 )    return TRUE;

    res_entry t;
    t.pData = LockResource( hGlob );
    t.len = len;


    lst.push_back( t );     // this is safe, because the resources are never deallocated
    return TRUE;
}

....

void enum_entries()
{
    std::vector<res_entry> lst;
    ::EnumResourceNames( hFileToQuery, "MyResType", &EnumNamesCB, reinterpret_cast<LONG_PTR>(&lst) );
}

Вы можете делать с этими данными все, что хотите, например, Создать файл ... и записать данные на диск.

NB. Это то, как установщики могут делать это в Windows, и это было разработано для извлечения файлов в временный каталог и установки оттуда.

0 голосов
/ 06 апреля 2011

Тривиальный способ сделать это - создать очень большой массив внутри вашей программы и сохранить данные, которые будут извлечены внутри этого массива.При выполнении программа берет массив и записывает его в файл или файлы по мере необходимости, а затем выполняет файл, который вы хотите запустить после извлечения файлов.См., Например, C Вопрос: Как хранить данные внутри исполняемого файла .

После компиляции программы вы можете заменить данные в EXE-файле, используя двоичный редактор для копирования ваших файлов.на месте без необходимости конвертировать ваши файлы в массив C или другую структуру данных каждый раз, когда вы меняете полезную нагрузку.

Чтобы уменьшить размер, основная программа обычно распаковывает массив и ожидает сжатый массив.Многие инсталляторы просто используют zip, так как декомпрессор заботится о нескольких файлах в одном массиве, и вам не нужно возиться с добавлением массива каталогов и ссылочного массива - все это встроено, а компрессоры zip из командной строки распространены и простыиспользовать.

Открывает ли основная программа терминал, зависит от того, как вы его запрограммируете.Я ожидаю, что вам понадобится программа для win32, чтобы windows не открывал DOS-терминал, и вы просто не открываете никаких окон внутри вашей программы.Однако это отдельный вопрос, поэтому подумайте над тем, чтобы задать его как новый вопрос.

Как указывает Дэвид, этот процесс обычно автоматизируется на этапе компоновки.Каждый компоновщик немного отличается, но вы можете проверить Встраивание ресурсов в .exe, используя GCC , для примера использования одного из наиболее распространенных компиляторов.

Я полагаю, вы знаете, что делаете,но имейте в виду, что существует множество непатентованных стандартных систем winxp sp2 - при условии, что вы никому не навредите, потому что не считаете, что такие системы онлайн, - плохой выбор. убедитесь, что ваша программа не может покинуть виртуальные машины.Есть способы, например, подключить их сети, не давая машинам доступ к Интернету или сети вашего компьютера.Имейте в виду, что червь Моррис был любимым проектом, который тоже не собирался и не ожидал сойти с ума.

...