rToRawData+sectionHeader->Misc.VirtualSize); printf("%x ",sectionHeader->PointerToRawData+sectionHeader->Misc.VirtualSize); printf("%d ",sizeof(IMAGE_IMPORT_DESCRIPTOR)); ImportDec=(IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)lpBase+RVAToOffset(lpBase,ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); i=0; while(ImportDec->FirstThunk) { *newImport=*ImportDec; i++; ImportDec++; newImport++; } IMAGE_IMPORT_DESCRIPTOR myImport; char *name="my.dll"; myImport.FirstThunk=(DWORD)(sectionHeader->Misc.VirtualSize+sectionHeader->VirtualAddress+sizeof(IMAGE_IMPORT_DESCRIPTOR)*(i+2)+20); myImport.TimeDateStamp=0; myImport.ForwarderChain=0; myImport.OriginalFirstThunk=(DWORD)(sectionHeader->Misc.VirtualSize+sectionHeader->PointerToRawData+sizeof(IMAGE_IMPORT_DESCRIPTOR)*(i+2)+20); myImport.Name=(DWORD)(sectionHeader->Misc.VirtualSize+sectionHeader->VirtualAddress+sizeof(IMAGE_IMPORT_DESCRIPTOR)*(i+2)); *newImport=myImport; newImport++; memset(newImport,0,sizeof(IMAGE_IMPORT_DESCRIPTOR)); newImport++; memcpy((char*)newImport,name,strlen(name)+1); DWORD newThunk; newThunk=(DWORD)newImport+20; *(DWORD*)newThunk=(DWORD)(sectionHeader->Misc.VirtualSize+sectionHeader->VirtualAddress+sizeof(IMAGE_IMPORT_DESCRIPTOR)*(i+2)+20+8); memset((void*)(newThunk+4),0,4); newThunk=newThunk+8; WORD hint=0x00; *(WORD*)newThunk=hint; newThunk=newThunk+sizeof(WORD); char *funname="MyFun"; memcpy((char*)newThunk,funname,strlen(funname)+2); ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress=sectionHeader->Misc.VirtualSize+sectionHeader->VirtualAddress; FlushViewOfFile(lpBase,0); UnmapViewOfFile(lpBase); CloseHandle(hMap); CloseHandle(hFile); return 0; }
|