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++;
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;
}