Доброе время суток. Мне нужно добавить свою dll в таблицу импорта, погуглил, прочел http://bugtraq.ru/library/programming/harddll.html http://www.insidepro.com/kk/019/019r.shtml http://www.wasm.ru/article.php?article=1002006 Вот что я сделал: Код (Text): // --- [ File headers ] ------ IMAGE_DOS_HEADER *MZHead; IMAGE_NT_HEADERS *PEHead; IMAGE_OPTIONAL_HEADER *OptionalHead; IMAGE_SECTION_HEADER *Section; IMAGE_IMPORT_DESCRIPTOR *ImportDescriptor; HANDLE hFile, hMap; LPVOID lpFile, lpImport, lpImportTable, lpImportEnd, lpMaxFree, lpPrevPtr, lpNextPtr; DWORD dwMapSize, dwImportRVA, i, dwSectNum, dwNewImportTableSize, dwDllCount; char lpszFileName[20], lpszDllName[] = {"InStream.dll"}; strcpy(lpszFileName, "drozz.exe"); //Opening file hFile = CreateFile(lpszFileName, GENERIC_ALL, 0, NULL, OPEN_EXISTING, 0, NULL); if (hFile == INVALID_HANDLE_VALUE) RiseError("Can't open file"); //Creating file mapping hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL); if (hMap == NULL) RiseError("Can't map file"); lpFile = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, GetFileSize(hFile, NULL)); CloseHandle(hFile); MZHead = (IMAGE_DOS_HEADER *)lpFile; PEHead = (IMAGE_NT_HEADERS *)((DWORD)lpFile + (DWORD)MZHead->e_lfanew); OptionalHead = &PEHead->OptionalHeader;//(DWORD)pe_opt_head = (DWORD)pe_head + sizeof(IMAGE_FILE_HEADER); dwImportRVA = OptionalHead->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; Section = (IMAGE_SECTION_HEADER *)((DWORD)OptionalHead + sizeof(IMAGE_OPTIONAL_HEADER)); for (i = 0, dwSectNum = 0; i < PEHead->FileHeader.NumberOfSections; i++) { if (dwImportRVA < Section->VirtualAddress) { Section--; dwSectNum = i - 1; break; } Section++; } lpImport = (LPVOID)((DWORD)lpFile + Section->PointerToRawData); lpImportTable = (LPVOID)(dwImportRVA - Section->VirtualAddress); lpImportTable = (LPVOID)((DWORD)lpImport + (DWORD)lpImportTable); ImportDescriptor = (IMAGE_IMPORT_DESCRIPTOR *)lpImportTable; dwDllCount = 0; while ((ImportDescriptor + dwDllCount)->Name != NULL) dwDllCount++;//, ImportDescriptor++;//, RiseError((LPCSTR)(ImportDescriptor->Name - Section->VirtualAddress + (DWORD)lpImport)), ; dwNewImportTableSize = sizeof(IMAGE_IMPORT_DESCRIPTOR) * (dwDllCount + 2); dwNewImportTableSize += lstrlenA(lpszDllName) + 1; lpImportEnd = (LPVOID)((DWORD)(Section + 1)->PointerToRawData + (DWORD)lpFile - 1); lpMaxFree = NULL; while (lpImportEnd >= lpImport) { if (*(BYTE *)lpImportEnd == 0x00) { lpPrevPtr = lpImportEnd; while (*(BYTE *)lpImportEnd == 0x00) lpImportEnd = (LPVOID)((DWORD)lpImportEnd - 1); } if (((DWORD)lpPrevPtr - (DWORD)lpImportEnd) > (DWORD)lpMaxFree) { lpMaxFree = (LPVOID)((DWORD)lpPrevPtr - (DWORD)lpImportEnd); lpNextPtr = (LPVOID)((DWORD)lpImportEnd + 1); } lpImportEnd = (LPVOID)((DWORD)lpImportEnd - 1); } lpNextPtr = (LPVOID)((DWORD)lpNextPtr + 1); lpMaxFree = (LPVOID)((DWORD)lpMaxFree - 4); if ((DWORD)lpMaxFree < dwNewImportTableSize) RiseError("xXXXXXXXXXXX"); memcpy(lpNextPtr, lpImportTable, sizeof(IMAGE_IMPORT_DESCRIPTOR) * dwDllCount); memcpy(lpImportTable, lpszDllName, strlen(lpszDllName)); LPDWORD Zero = (LPDWORD)(DWORD)lpImportTable + strlen(lpszDllName); IMAGE_IMPORT_BY_NAME myname; myname.Hint = 0x00; myname.Name[0x00] = 0x00; WORD hint = 0; char lpszFuncName[] = {"ImStreamFoo"}; HR p; p.ZDword = 0; p.IAT = dwImportRVA + strlen(lpszFuncName) + sizeof(p); p.IATEnd = 0; DWORD IIBN_Table; memcpy(Zero, &p, sizeof(p)); Zero = (LPDWORD)((DWORD)Zero + sizeof(p)); memcpy(Zero, &hint, sizeof(WORD)); Zero = (LPDWORD)((DWORD)Zero + sizeof(WORD)); memcpy(Zero, lpszFuncName, strlen(lpszFuncName) + 1); Zero = (LPDWORD)((DWORD)Zero + 1 + strlen(lpszFuncName)); memcpy(Zero, &myname, sizeof(myname)); IMAGE_IMPORT_DESCRIPTOR myDLL; IIBN_Table = dwImportRVA + strlen(lpszDllName) + sizeof(DWORD); myDLL.Characteristics = IIBN_Table; myDLL.TimeDateStamp = NULL; myDLL.ForwarderChain = NULL; //Записываем адрес строки с именем файла нашей DLL myDLL.Name = dwImportRVA; // //Указатель на таблицу FirstThunk myDLL.FirstThunk = IIBN_Table; // //Записываем в новую таблицу импорта запись о нашей DLL LPVOID OldFreePtr = lpNextPtr; lpNextPtr = (LPVOID)((DWORD)lpNextPtr + sizeof(IMAGE_IMPORT_DESCRIPTOR) * dwDllCount); memcpy(lpNextPtr, &myDLL, sizeof(IMAGE_IMPORT_DESCRIPTOR)); // //Создаем "финальную" нулевую запись со всеми полями равными нулю myDLL.Characteristics = NULL; myDLL.TimeDateStamp = NULL; myDLL.ForwarderChain = NULL; myDLL.Name = NULL; myDLL.FirstThunk = NULL; // LPVOID OldFreePtr = FreePtr; // //И записываем её в конец новой таблицы импорта. lpNextPtr = (LPVOID)((DWORD)lpNextPtr + sizeof(IMAGE_IMPORT_DESCRIPTOR) * dwDllCount); memcpy(lpNextPtr, &myDLL, sizeof(IMAGE_IMPORT_DESCRIPTOR)); // //3. Устанавливаем указатель на нашу таблицу импорта. // // Вычисляем RVA нашей таблицы DWORD NewImportTableRVA = (DWORD)OldFreePtr - (DWORD)lpImport + Section->VirtualAddress; OptionalHead->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = NewImportTableRVA; OptionalHead->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = (dwDllCount + 1) * sizeof(IMAGE_IMPORT_DESCRIPTOR); UnmapViewOfFile(hMap); CloseHandle(hMap); Но файл такой оказывается невалидным... Облазил весь гугл, буду рад если покажут пример...
Luke Не совсем понятно что нужно, инфект или инжект. Наверно первое. Тогда пропатчить экзешник, вфп кстати просто отключается, остаётся чексумму править или обнулить.
ну, если это и впрямь инфект(что нам подсказывает логика), то слово "процесс" надо заменить на "файлес" ,) а разве указано что файлес системный? и да: Use the force, Luke!
Да, вы угадали, инфект=) Да, Clerk правильно угадал - нужен инфект в системный файл... Вся проблема в том, что я не знаю как пропатчить ехешник... Все делаю по статье, описание формата знаю, но что то не так.. . p.S>Оффтопик=) Клерк, а каким способом вы предлагаете отключать WFP?=)
ну а по сабжу ("Добавление своей dll в таблицу испорта") - так вообще у тебя никаких проблем - бинарь, ведь, портится! )