本文共 1263 字,大约阅读时间需要 4 分钟。
BOOL CPeUtil::GetImportTable() { DWORD TableLen = 0; //1得到导入表地址 PIMAGE_IMPORT_DESCRIPTOR pImportTable = (PIMAGE_IMPORT_DESCRIPTOR)(RvaToFoa(pOptionHeader->DataDirectory[1].VirtualAddress) + FileBuff); PIMAGE_IMPORT_DESCRIPTOR pFirstImportTable = pImportTable; //2保存原本的导入表内容 while (pImportTable->Name != NULL) { TableLen++; pImportTable++; } if (TableLen == 0) { return TRUE; //说明没弄到导入表,或者没有导入表 } TableLen++;//这里加一是为了保存导入表后面一个空的结构体 this->ImportTableSize = sizeof(IMAGE_IMPORT_DESCRIPTOR) * TableLen; //3 开辟内存空间 pNewImportTable = new IMAGE_IMPORT_DESCRIPTOR[TableLen]{}; //4 复制内容到新开辟的空间memcpy(pNewImportTable,pFirstImportTable,ImportTableSize); //5 复制到新开辟的区段里面 //6 设置地址为这个导入表导入的区段的首地址 //需要注意的是需要转换为RVA return 0; }
这里的RvaToFoa
DWORD CPeUtil::RvaToFoa(DWORD Rva) { DWORD Foa = 0; PIMAGE_SECTION_HEADER pSectionHeader = IMAGE_FIRST_SECTION(pNtHeader); //遍历区段,判断该rva是哪一个区段的 while (pSectionHeader->Name != NULL) { if (pSectionHeader->VirtualAddress <= Rva && pSectionHeader->VirtualAddress + pSectionHeader->Misc.VirtualSize > Rva) { //如果该地址比区段起始地址大 //但是比区段结束地址小,说明在这个区段里面 Foa = Rva - pSectionHeader->VirtualAddress + pSectionHeader->PointerToRawData; break; } pSectionHeader++; } return Foa; }
这里写的很简陋啊,其实可以再弄一个假的导入表,然后加密字符串等等操作,参考上一文章的总结操作
转载地址:http://tlfkz.baihongyu.com/