void ImPortD() {
DWORD dwDataStartRVA;//输入表的RVA
PIMAGE_IMPORT_DESCRIPTOR pImportDesc;//指向输入表的指针
//IMAGE_DIRECTORY_ENTRY_IMPORT=1
dwDataStartRVA = ycOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
if (!dwDataStartRVA)
return;
//RVA转VA,注意VA是打开的PE文件在本进程空间中映射的VA
pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageRvaToVa(ycNTHeader, ImageBase, dwDataStartRVA, NULL);
//分析IID数组成员,直到成员为0
while (pImportDesc->FirstThunk){ // while(pImportDesc-> OriginalFirstThunk
//当前IID数组成员的取值:
pImportDesc->OriginalFirstThunk; //INT RVA
pImportDesc->TimeDateStamp;
pImportDesc->ForwarderChain;
pImportDesc->Name; //Name RVA
pImportDesc->FirstThunk; //IAT RVA
pImportDesc++; //指针++,下1个数组成员
}//end while
//分析某个.dll对应的INT或IAT数组成员
char cOrd[30], cMemAddr[30], * FuncName; //函数序号,地址,函数名
DWORD dwThunk; //OriginalFirstThunk或FirstThunk值
DWORD* pdwRVA = NULL; //OriginalFirstThunk或FirstThunk RVA指针
DWORD* pdwThunk = NULL; //IMAGE_THUNK_DATA的指针
PIMAGE_IMPORT_BY_NAME pByName = NULL; // BY_NAME的指针
//获取第一个IID
pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageRvaToVa(ycNTHeader, ImageBase, dwDataStartRVA, NULL);
while (pImportDesc->FirstThunk) { //pImportDesc->OriginalFirstThun
//取OriginalFirstThunk或FirstThunk 32位取值
dwThunk = pImportDesc->OriginalFirstThunk;
//取OriginalFirstThunk或FirstThunk RVA值
pdwRVA = (DWORD*)dwThunk;
//IMAGE_THUNK_DATA的VA
pdwThunk = (DWORD*)ImageRvaToVa(ycNTHeader, ImageBase, dwThunk, NULL);
if (!pdwThunk)
return;
while (*pdwThunk)//指向INT或IAT数组
{
if (HIWORD(*pdwThunk) == 0x8000) {//判断ThunkValue最高位的取值0?1
//printf("序号");
}//是序号
else { //是函数名
//循环处理下一个函数
++pdwRVA; //OriginalFirstThunk或FirstThunk RVA值++
++pdwThunk; //IMAGE_THUNK_DATA的指针
}//end while
}
pImportDesc++;//循环,下1个.dll的导入函数
}//end while
printf("IID=%X\n", (int)pImportDesc-(int)ImageBase);
printf("name=%X\n", (char*)ImageRvaToVa(ycNTHeader, ImageBase, pImportDesc->Name, NULL));