Отсутствием желания в первую очередь подкованным нехваткой свободного времени, если для вас формат таблицы импорт PE файла сложна, исходня из ваших ответах мне, то вам следует ее изучить так же, как и автору. Все последующие ответы желательно писать в ЛС, дабы не разводить флуд.
да, в современном бешеном темпе жизни очень тяжело найти пол часа, чтобы написать программу пересобирающую таблицу импорта... как я вас понимаю...
смысл форума не в том чтобы разжевывать вам открытый формат исполняемых файлов и разжеванный в куче статей сто лет назад. Вам же сказали методы, а писать вы должны сами.
Естественно не учитываются различные исключительные ситуации. Код (Text): #include <stdio.h> #include <string.h> #include <windows.h> const char DLL_Name_Target[] = "kernel32.dll"; const char DLL_Name_New[] = "kernel33.dll"; const char API_Name_Target[] = "ExitProcess"; struct struct_Section { char Name[8]; DWORD VirtualSize; DWORD VirtualAddress; DWORD PhysicalSize; DWORD PhysicalOffset; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORD Characteristics; } *pSection; struct struct_IMAGE_IMPORT_DESCRIPTOR { DWORD OriginalFirstThunk; DWORD TimeDateStamp; DWORD ForwarderChain; DWORD DllNameOffset; DWORD FirstThunk; } *pIID, *orig_pIID; WORD SectionNum; DWORD RVA2RAW(DWORD RVA) { for(int i=0;i<SectionNum;i++) if(RVA >= pSection[i].VirtualAddress && RVA <= pSection[i].VirtualAddress + pSection[i].VirtualSize) { return pSection[i].PhysicalOffset + (RVA - pSection[i].VirtualAddress); } return 0; } DWORD AlignValue(DWORD Value, DWORD Alignment) { return (Value % Alignment != 0) ? Value += Alignment - (Value % Alignment) : Value; } int main(int argc, char *argv[]) { DWORD i, FileSize, PEHeaderOffset, ImportTableAddr, pAPI, orig_ImportTableAddr; WORD SizeOfOptionalHeaders; struct struct_Section NewSection; struct struct_IMAGE_IMPORT_DESCRIPTOR NewIID; byte *File; FILE* FHandle; bool Exists = false; if(argc < 2) return -1; FHandle = fopen(argv[1], "rb+"); if(FHandle == NULL) return -1; fseek(FHandle, 0, SEEK_END); FileSize = ftell(FHandle); fseek(FHandle, 0, SEEK_SET); File = (byte*) malloc(FileSize); fread(File, 1, FileSize, FHandle); PEHeaderOffset = *(PDWORD) &File[0x3C]; SectionNum = *(PWORD) &File[PEHeaderOffset+0x06]; SizeOfOptionalHeaders = *(PWORD) &File[PEHeaderOffset+0x14]; ImportTableAddr = *(PDWORD) &File[PEHeaderOffset+0x80]; pSection = (struct struct_Section*) malloc(sizeof(struct struct_Section)*SectionNum); for(i=0;i<SectionNum;i++) memcpy(&pSection[i], &File[PEHeaderOffset+SizeOfOptionalHeaders+0x18+i*sizeof(struct struct_Section)], sizeof(struct struct_Section)); ImportTableAddr = RVA2RAW(ImportTableAddr); if(ImportTableAddr == 0) return -1; orig_pIID = pIID; orig_ImportTableAddr = ImportTableAddr; pIID = (struct struct_IMAGE_IMPORT_DESCRIPTOR*) &File[ImportTableAddr]; while(pIID->DllNameOffset != 0) { if(strcmpi((char*) &File[RVA2RAW(pIID->DllNameOffset)], DLL_Name_Target) == 0) { pAPI = RVA2RAW(pIID->FirstThunk); while(*(PDWORD) &File[pAPI] != 0) { if(strcmpi((char*) &File[RVA2RAW(*(PDWORD) &File[pAPI])+2], API_Name_Target) == 0) { Exists = true; break; } pAPI += 4; } } else { ImportTableAddr += sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR); pIID = (struct struct_IMAGE_IMPORT_DESCRIPTOR*) &File[ImportTableAddr]; } if(Exists) break; } if(!Exists) return -1; /* Создаем новую секцию */ *(PWORD) &File[PEHeaderOffset+0x06] = SectionNum+1; File = (byte*) realloc(File, FileSize+0x1000); FileSize += 0x1000; strcpy(NewSection.Name, ".NewImp"); NewSection.VirtualSize = 0x1000; NewSection.VirtualAddress = AlignValue(pSection[SectionNum-1].VirtualAddress + pSection[SectionNum-1].VirtualSize, 0x1000); NewSection.PhysicalSize = 0x1000; NewSection.PhysicalOffset = pSection[SectionNum-1].PhysicalOffset + pSection[SectionNum-1].PhysicalSize; NewSection.PointerToRelocations = 0; NewSection.PointerToLinenumbers = 0; NewSection.NumberOfRelocations = 0; NewSection.NumberOfLinenumbers = 0; NewSection.Characteristics = 0x40000040; memcpy(&File[PEHeaderOffset+SizeOfOptionalHeaders+0x18+sizeof(struct struct_Section)*SectionNum], &NewSection, sizeof(struct struct_Section)); /* Новый адрес таблицы импорта */ *(PDWORD) &File[PEHeaderOffset+0x80] = NewSection.VirtualAddress; *(PDWORD) &File[PEHeaderOffset+0x50] = NewSection.VirtualAddress + NewSection.VirtualSize; /* Пересобираем таблицу импорта */ i = 0; pIID = (struct struct_IMAGE_IMPORT_DESCRIPTOR*) &File[orig_ImportTableAddr]; while(pIID->DllNameOffset != 0) { memcpy(&File[NewSection.PhysicalOffset+sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i], &File[orig_ImportTableAddr], sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)); orig_ImportTableAddr += sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR); pIID = (struct struct_IMAGE_IMPORT_DESCRIPTOR*) &File[orig_ImportTableAddr]; i++; } i+=2; /* Формируем новый IMAGE_IMPORT_DESCRIPTOR */ NewIID.OriginalFirstThunk = 0x00000000; NewIID.TimeDateStamp = 0x00000000; NewIID.ForwarderChain = 0x00000000; NewIID.DllNameOffset = NewSection.VirtualAddress + 8 + sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i; NewIID.FirstThunk = NewSection.VirtualAddress + sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i; /* Записываем новое имя DLL и API */ strcpy((char*) &File[NewSection.PhysicalOffset + 8 + sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i], DLL_Name_New); strcpy((char*) &File[NewSection.PhysicalOffset + 8 + sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i+strlen(DLL_Name_New)+3], API_Name_Target); *(PDWORD) &File[NewSection.PhysicalOffset + sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i] = NewSection.VirtualAddress + 8 +sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*i +strlen(DLL_Name_New) + 1; /* Записываем новый IMAGE_IMPORT_DESCRIPTOR */ memcpy(&File[NewSection.PhysicalOffset+sizeof(struct struct_IMAGE_IMPORT_DESCRIPTOR)*(i-2)], &NewIID, sizeof(NewIID)); fseek(FHandle, 0, SEEK_SET); fwrite(File, 1, FileSize, FHandle); fclose(FHandle); }
Кого положил? Библиотеку? Зачем, "kernel33.dll" это случайное имя которое предложил ТС, ясен пень что нет такой dll.