Всем доброго дня. Пишу что-то вроде юзермодного руткита. Схема простая - загрузчик пишет дллку на диск,прописывает соответствующие ключи реестра. При перезагрузке компа загрузчик удаляется,а дллка скрывает ключи и сама себя. Порядок действии по извлечению dll: 1)При помощи вот этой программки "C:\MASM32\BINTODB.EXE" получаю дамп дллки. 2)Переношу полученный массив в VisualStudio2005. 3)Пишу на диск следующим образом: Код (Text): void Extract (void) { //Create dll file: LPCWSTR NameOfDll = L"C:\\mydll.dll"; HANDLE HandleOfDll = CreateFile((LPCWSTR)NameOfDll, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); //Writing data in this file: if(HandleOfDll != INVALID_HANDLE_VALUE) { DWORD BytesWritten = 0; if(!WriteFile(HandleOfDll,(LPCVOID)DllDump,2560,&BytesWritten,NULL))//DllDump - указатель на полученный с пом. BINTODB.EXE //массив { printf("WriteFile failed with error %d\n",GetLastError()); _getch(); } CloseHandle(HandleOfTrojanDll); } } Результат : При загрузке этой дллки получаем ERROR_BAD_EXE_FORMAT. В чем может быть причина?
если проблема в bintodb - пишите свою подобную утилиту... много ума для этого не надо... если проблема в записи - отлаживайте код, тоже много ума для этого не надо... если не разберетесь с этим, то просто кладете dll в ресурсы... так почти все малварщики делают))) что-то маленькая dll, вам не кажется?...
Rel в bintodb проблем быть не должно,писать самому что-то подобное не хочется т.к. не факт что прокатит хотя ,зато надо время. Вот поэтому в ресурсы и не хочу. Это просто каркас - она ничего не умеет. Сначала загружу,а потом ее дописывать буду.
В том что по ней можно понять есть ли проблемы на данном этапе. Может файлы идентичны и проблема в том, как ты её загрузить пытаешься.
Kaimi Дампы полученные из исходной длл и записанной моей программой различны - видно даже на глаз. Если не писать дллку из загрузчика, а положить оригинал на диск ручками никаких проблем с загрузкой через реестр не возникает. А вот почему массивы байт,исходный и записанный в длл,различны я ума не приложу . В текстовые файлы всегда писал без проблем,а почему с длл такая хрень непонятно.
в чем разница? покажи, как выглядит DllDump... проблема может быть в выравнивании например... чему равно BytesWritten?
Rel Дампы очевидно разные: Исходный(Приведены различающиеся участки): Код (Text): db 77,90,144,0,3,0,0,0,4,0,0,0,255,255,0,0 db 184,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,176,0,0,0 db 14,31,186,14,0,180,9,205,33,184,1,76,205,33,84,104 db 105,115,32,112,114,111,103,114,97,109,32,99,97,110,110,111 db 116,32,98,101,32,114,117,110,32,105,110,32,68,79,83,32 db 109,111,100,101,46,13,13,10,36,0,0,0,0,0,0,0 db 157,6,185,217,217,103,215,138,217,103,215,138,217,103,215,138 db 37,71,197,138,216,103,215,138,87,120,196,138,220,103,215,138 db 82,105,99,104,217,103,215,138,0,0,0,0,0,0,0,0 db 80,69,0,0,76,1,4,0,247,60,242,76,0,0,0,0 db 0,0,0,0,224,0,14,33,11,1,5,12,0,2,0,0 Полученный : Код (Text): 77,90,144,0,3,0,0,0,4,0,0,0,255,255,0,0 db 184,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,232,0,0,0 db 14,31,186,14,0,180,9,205,33,184,1,76,205,33,84,104 db 105,115,32,112,114,111,103,114,97,109,32,99,97,110,110,111 db 116,32,98,101,32,114,117,110,32,105,110,32,68,79,83,32 db 109,111,100,101,46,13,13,10,36,0,0,0,0,0,0,0 db 181,112,252,61,241,17,146,110,241,17,146,110,241,17,146,110 db 214,215,233,110,242,17,146,110,214,215,239,110,240,17,146,110 db 214,215,252,110,243,17,146,110,214,215,255,110,253,17,146,110 db 50,30,207,110,243,17,146,110,241,17,147,110,239,17,146,110 db 214,215,224,110,240,17,146,110,214,215,234,110,240,17,146,110 db 82,105,99,104,241,17,146,110,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0,80,69,0,0,76,1,5,0 Add: На счет BytesWritten - размеры одинаковы.
AndjellaArtavazdovna Кажется тут наброски твоего руткита, только на фасме. Ну с этого поста и дальше. Там в конце треда рабочий вариант. Там EXE - производит exe, но подставить ей dll - не трудно. http://wasm.ru/forum/viewtopic.php?id=39419&p=5 Или ... это принципиально ?
Rel Добавил #pragma pack(push,1)/#pragma pack(pop) - тоже самое. _sheva740 Если MASM32 и студия по разному выравнивают байты,то возможно да.
AndjellaArtavazdovna Можно еще свою dll из ресурсов выгрузить. А то пока с выравниванием разбираться, так и интерес пропадет )) вот by (с)Connor Douthat пример Код (Text): void DumpResource(char *resource, char *filepath, HMODULE module = NULL) { HRSRC res = FindResource(module, resource, "BINARY"); if(res) { HGLOBAL res_loaded = LoadResource(module, res); if(res_loaded) { LPVOID res_data = LockResource(res_loaded); if(res_data) { int res_size = SizeofResource(module, res); HANDLE file = CreateFile(filepath, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL); if(file != INVALID_HANDLE_VALUE) { DWORD written; WriteFile(file, res_data, res_size, &written, NULL); SetEndOfFile(file); CloseHandle(file); } } } } } )
AndjellaArtavazdovna Лучше сравни дампы исходной длл и скомпилированного файла exe по смещению DllDump. Мне кажется что проблема возникает еще на стадии компиляции, а сама запись скорее всего происходит верно. p.s. опоздал я с постом )