Ну варианта два: 1) посчитать - дать правило, по которому вычисляются сами релоки 2) прочитать из файла оба вопроса непонятны, т.к. все это есть и у мета питрека, и у ицзелиона
Вы тут такие все грамотеи собрались я посмотрю. У ицзелиона про релоки ничо нету, там только импорт и экспорт. Мне нужно просто прочитать все смещения по которым расположены релоки, некогда разбиратся с пе форматом - вот и попросил пример. Вместо того чтобы умничать можно просто промолчать.
#define RVATOVA(Base,Rva) ((DWORD)Base + (DWORD)Rva) void CorrectRelocs(LPVOID pExe,DWORD Delta) { IMAGE_DOS_HEADER *imDh=(IMAGE_DOS_HEADER*)pExe; IMAGE_NT_HEADERS *imNTh=(IMAGE_NT_HEADERS*)((DWORD)pExe+imDh->e_lfanew); //VA IMAGE_BASE_RELOCATION *imBr=(IMAGE_BASE_RELOCATION*)RVATOVA(pExe, imNTh->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress); DWORD *pRelAddr; DWORD ii=0; printf("Delta=%X\n",Delta); printf("%-10s %-12s %-12s\n","Fixup #","Type","VirtAddr"); while(imBr->VirtualAddress) { DWORD BlockSize=(imBr->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))>>1; WORD *pRelBlock=(WORD*)((DWORD)imBr+sizeof(IMAGE_BASE_RELOCATION)); for(DWORD i=0;i<BlockSize;i++,ii++) { if(((pRelBlock & 0xF000)>>12)==IMAGE_REL_BASED_HIGHLOW) { pRelAddr=(DWORD*)((DWORD)pExe+imBr->VirtualAddress+(pRelBlock & 0x0FFF)); printf("%-10X %08X %08X\n",ii+1,IMAGE_REL_BASED_HIGHLOW,(DWORD)pRelAddr); *pRelAddr=*pRelAddr+Delta; } else printf("%-10X %08X %08s\n",ii+1,IMAGE_REL_BASED_HIGHLOW,((pRelBlock & 0xF000)>>12),"-"); } imBr=(IMAGE_BASE_RELOCATION*)((DWORD)imBr+imBr->SizeOfBlock); } } //вырвал со своего простого лоадера
непонятки вот сдесь возникли Код (Text): pRelAddr=(DWORD*)((DWORD)pExe+imBr->VirtualAddress+(pRelBlock[i] & 0x0FFF)); в поле VirtualAddress получается 6000h, а PE tools показывает 1000h, если вместо imBr->VirtualAddress подставить 1000h то всё работает. Помогите разобратся.