脱壳与加壳-加壳-6-代码实现加密导入表

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

 这里写的很简陋啊,其实可以再弄一个假的导入表,然后加密字符串等等操作,参考上一文章的总结操作