流沙团
PeTools开发(五)
2017-12-24 流沙团


功能:



01:展示输出表信息



02: 展示输入表信息



03:资源表信息



04:重定位表信息



05:绑定导入表信息







难点:



01: 定义全局变量, 区别每个点击按钮, 使用一个对话框,分别对消息进行接收



02: 读取PE信息, 对每个表的信息进行展示



03: 字符串的使用方法 sprintf  strcat  的用法



04 SendMessage







实例展示:



360截图20171224232343740.jpg







主要代码:






VOID SetPeFileInfo(HWND hwndDlg,LPSTR lpszFile)
{
HWND hInfoMation = GetDlgItem(hwndDlg,IDC_EDIT_INFOMATION);
TCHAR InfoStr[200240]={0};
TCHAR rn[100] = {0};

LPVOID pFileBuffer = NULL;
pFileBuffer= ReadPEFile(lpszFile);
if(!pFileBuffer)
{
printf("文件读取失败\n");
return;
}

PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
PIMAGE_DATA_DIRECTORY DataDirectory=NULL;

//Header信息
pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);
pPEHeader = (PIMAGE_FILE_HEADER)(((DWORD)pNTHeader)+4);
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader+IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader+pPEHeader->SizeOfOptionalHeader);

//定位Directory_Data;
DataDirectory = pOptionHeader->DataDirectory;
DWORD FoA = 0;

/*
TCHAR rn[100] = TEXT("www.gyarmy.com");
sprintf(InfoStr,"\r\n%d\r\n%d\r\n%d",InfoNum,InfoNum,InfoNum);
strcat(InfoStr,rn);
SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);
*/

switch(InfoNum)
{
case INFO_EXPORT:
{

//确定导出表信息
//printf("%x \n",FoA);
DWORD Export_Directory_Address = DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
DWORD Export_Directory_Size = DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;

if(Export_Directory_Size == 0)
{
haveDirectory = FALSE;
MessageBox(0,TEXT("没有输出表"),TEXT("错误"),0);
return;
}else{
haveDirectory = TRUE;

}

FoA = RVAToFileOffset(pFileBuffer,Export_Directory_Address);
//定位导出表的位置
PIMAGE_EXPORT_DIRECTORY pExDirectory = NULL;
pExDirectory = (PIMAGE_EXPORT_DIRECTORY)((DWORD)pFileBuffer + FoA);

//基本信息
sprintf(rn,"输出表基本信息 : \r\n");
strcat(InfoStr,rn);

sprintf(rn,"Characteristics: %08X\r\n",pExDirectory->Characteristics);
strcat(InfoStr,rn);
sprintf(rn,"TimeDateStamp: %08X\r\n",pExDirectory->TimeDateStamp);
strcat(InfoStr,rn);
sprintf(rn,"MajorVersion: %08X\r\n",pExDirectory->MajorVersion);
strcat(InfoStr,rn);
sprintf(rn,"MinorVersion: %08X\r\n",pExDirectory->MinorVersion);
strcat(InfoStr,rn);
sprintf(rn,"Name: %08X\r\n",pExDirectory->Name);
strcat(InfoStr,rn);
sprintf(rn,"Base: %08X\r\n",pExDirectory->Base);
strcat(InfoStr,rn);
sprintf(rn,"NumberOfFunctions: %08X\r\n",pExDirectory->NumberOfFunctions);
strcat(InfoStr,rn);
sprintf(rn,"NumberOfNames: %08X\r\n",pExDirectory->NumberOfNames);
strcat(InfoStr,rn);
sprintf(rn,"AddressOfFunctions: %08X\r\n",pExDirectory->AddressOfFunctions);
strcat(InfoStr,rn);
sprintf(rn,"AddressOfNames: %08X\r\n",pExDirectory->AddressOfNames);
strcat(InfoStr,rn);
sprintf(rn,"AddressOfNameOrdinals: %08X\r\n-------------\r\n",pExDirectory->AddressOfNameOrdinals);
strcat(InfoStr,rn);

//输出函数地址表信息
//AddressOfFunctions
DWORD ExAddressOfFunctions = pExDirectory->AddressOfFunctions;
DWORD ExAddressOfFunctionsFoA = RVAToFileOffset(pFileBuffer,ExAddressOfFunctions);
DWORD ExNumberOfFunctions = pExDirectory->NumberOfFunctions;

PDWORD pExAddressOfFunctions = NULL;
pExAddressOfFunctions = (PDWORD)((DWORD)pFileBuffer + ExAddressOfFunctionsFoA);


sprintf(rn,"每个函数地址表信息: \r\n");
strcat(InfoStr,rn);

//输出每个函数地址表信息
DWORD k =0;
for(k=0;k<ExNumberOfFunctions;k++)
{
//printf("%d : %x \n",k,);
sprintf(rn,"%d : %08X\r\n",k,*pExAddressOfFunctions);
strcat(InfoStr,rn);

pExAddressOfFunctions++;
}
sprintf(rn,"-----------------\r\n");
strcat(InfoStr,rn);


sprintf(rn,"函数名称表: \r\n");
strcat(InfoStr,rn);

//函数名称表
DWORD ExAddressOfNames = pExDirectory->AddressOfNames;
DWORD ExAddressOfNamesFoA = RVAToFileOffset(pFileBuffer,ExAddressOfNames);
DWORD ExNumberOfNames = pExDirectory->NumberOfNames;

PDWORD pExAddressOfNames = NULL;
pExAddressOfNames = (PDWORD)((DWORD)pFileBuffer + ExAddressOfNamesFoA);

for(k=0;k<ExNumberOfNames;k++)
{
//printf("%d : %x \n",k,*pExAddressOfNames);

sprintf(rn,"%d : %08X\r\n",k,*pExAddressOfNames);
strcat(InfoStr,rn);

//函数名的地址转换为FoA ,输出函数名
PDWORD NameAddress = (PDWORD)RVAToFileOffset(pFileBuffer,*pExAddressOfNames);
//输出函数名
printf("%s \n",(char*)((DWORD)pFileBuffer + (DWORD)NameAddress));

sprintf(rn,"%s \r\n",(char*)((DWORD)pFileBuffer + (DWORD)NameAddress));
strcat(InfoStr,rn);

pExAddressOfNames++;
}

sprintf(rn,"-----------------\r\n");
strcat(InfoStr,rn);


//函数序号表

sprintf(rn,"函数序号表: \r\n");
strcat(InfoStr,rn);

DWORD ExAddressOfNameOrdinals = pExDirectory->AddressOfNameOrdinals;
DWORD ExAddressOfNameOrdinalsFoA = RVAToFileOffset(pFileBuffer,ExAddressOfNameOrdinals);
ExNumberOfNames = pExDirectory->NumberOfNames;
PWORD pExAddressOfNameOrdinals = NULL;
pExAddressOfNameOrdinals = (PWORD)((DWORD)pFileBuffer + ExAddressOfNameOrdinalsFoA);

for(k=0;k<ExNumberOfNames;k++)
{
//printf("%d : %x \n",k,*pExAddressOfNameOrdinals);
sprintf(rn,"%d : %08X \r\n",k,*pExAddressOfNameOrdinals);
strcat(InfoStr,rn);

pExAddressOfNameOrdinals++;
}


sprintf(rn,"-----------------\r\n");
strcat(InfoStr,rn);
SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);

break;
}
case INFO_IMPORT:
{
//基本信息
//sprintf(rn,"%d : %08X \r\n",k,*pExAddressOfNameOrdinals);



sprintf(rn,"输入表基本信息 : \r\n");
strcat(InfoStr,rn);

//确定导入表
//pImportDirectory = NULL;
IMAGE_DATA_DIRECTORY pImportDirectory = DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];

DWORD ImportVirtualAddress = pImportDirectory.VirtualAddress;
DWORD ImportFoa = RVAToFileOffset(pFileBuffer,ImportVirtualAddress);

if(pImportDirectory.Size == 0)
{
haveDirectory = FALSE;
MessageBox(0,TEXT("没有输入表"),TEXT("错误"),0);
return;
}else{
haveDirectory = TRUE;

}

sprintf(rn,"ImportVirtualAddress: %08X \r\n",ImportVirtualAddress);
strcat(InfoStr,rn);
sprintf(rn,"Size: %08X \r\n",pImportDirectory.Size);
strcat(InfoStr,rn);
sprintf(rn,"ImportFoa: %08X \r\n",ImportFoa);
strcat(InfoStr,rn);

//输出所有的导入表
//PIMAGE_THUNK_DATA32 pThunkData = NULL;
//第一个导入表
PIMAGE_IMPORT_DESCRIPTOR pImportDes = NULL;
pImportDes = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)pFileBuffer + ImportFoa);

while(pImportDes->OriginalFirstThunk != 0x0 && pImportDes->FirstThunk != 0x0 )
{
//输出所有的dll
sprintf(rn,"OriginalFirstThunk: %08X \r\n",pImportDes->OriginalFirstThunk);
strcat(InfoStr,rn);
DWORD pNameAddress = RVAToFileOffset(pFileBuffer,pImportDes->Name);
PSTR pDllName = (PSTR)((DWORD)pFileBuffer + pNameAddress);

sprintf(rn,"name: %s \r\n",pDllName);
strcat(InfoStr,rn);
sprintf(rn,"------------------------------- : \r\n");
strcat(InfoStr,rn);
//输出OriginalFirstThunk的信息
DWORD Thunk_Address = RVAToFileOffset(pFileBuffer,pImportDes->OriginalFirstThunk);
PIMAGE_THUNK_DATA32 pThunkData = (PIMAGE_THUNK_DATA32)((DWORD)pFileBuffer + Thunk_Address);

//根据pThunkData 的最高为来判断
DWORD ImportOrdinal = pThunkData->u1.Ordinal;
while(ImportOrdinal)
{
//输出所有所有的信息
//#define IMAGE_ORDINAL_FLAG32 0x80000000
if(ImportOrdinal & IMAGE_ORDINAL_FLAG32)
{
sprintf(rn,"按序号导入: %08X \r\n",ImportOrdinal&0x0FFF);
strcat(InfoStr,rn);
}else
{
DWORD ImageNameAddress = RVAToFileOffset(pFileBuffer,ImportOrdinal);
PIMAGE_IMPORT_BY_NAME pImageName = (PIMAGE_IMPORT_BY_NAME)(DWORD(pFileBuffer)+ImageNameAddress);
//printf("按名字导入:%x - %s \n",pImageName->Hint,pImageName->Name);
sprintf(rn,"按名字导入: %08X -- %s \r\n",pImageName->Hint,pImageName->Name);
strcat(InfoStr,rn);
}
//向下移动
pThunkData = (PIMAGE_THUNK_DATA32)((DWORD)pThunkData + 4);
ImportOrdinal = pThunkData->u1.Ordinal;
}

sprintf(rn,"------------------------------- : \r\n");
strcat(InfoStr,rn);
//printf("FirstThunk:%x \n",pImportDes->FirstThunk);
DWORD pFirstThunk = (DWORD)pImportDes->FirstThunk;
printf("FirstThunk:%x \n",pImportDes->FirstThunk);

sprintf(rn,"FirstThunk:%08X \r\n",pImportDes->FirstThunk);
strcat(InfoStr,rn);
sprintf(rn,"------------------------------- : \r\n");
strcat(InfoStr,rn);

DWORD FirstThunk_Address = RVAToFileOffset(pFileBuffer,pFirstThunk);
PIMAGE_THUNK_DATA32 pNewThunkData = (PIMAGE_THUNK_DATA32)((DWORD)pFileBuffer + FirstThunk_Address);


DWORD newImportOrdinal = pNewThunkData->u1.Ordinal;

while(newImportOrdinal)
{
//输出所有所有的信息
//#define IMAGE_ORDINAL_FLAG32 0x80000000
if(newImportOrdinal & IMAGE_ORDINAL_FLAG32)
{
//printf("按序号导入:%x\n",newImportOrdinal&0x0FFF);
sprintf(rn,"按序号导入:%08X \r\n",newImportOrdinal&0x0FFF);
strcat(InfoStr,rn);

}else
{
DWORD newImageNameAddress = RVAToFileOffset(pFileBuffer,newImportOrdinal);
PIMAGE_IMPORT_BY_NAME pNewImageName = (PIMAGE_IMPORT_BY_NAME)(DWORD(pFileBuffer)+newImageNameAddress);
//printf("按名字导入:%x - %s \n",pNewImageName->Hint,pNewImageName->Name);
sprintf(rn,"按名字导入::%08X - %s \r\n",pNewImageName->Hint,pNewImageName->Name);
strcat(InfoStr,rn);

}
//向下移动
pNewThunkData = (PIMAGE_THUNK_DATA32)((DWORD)pNewThunkData + 4);
newImportOrdinal = pNewThunkData->u1.Ordinal;
}


sprintf(rn,"------------------------------- \r\n");
strcat(InfoStr,rn);
pImportDes = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)pImportDes + 20);

//getchar();
}

SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);
break;
}

case INFO_RES:
{
sprintf(rn,"资源表基本信息 : \r\n");
strcat(InfoStr,rn);

IMAGE_DATA_DIRECTORY ResourceDirectory = DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];

DWORD ResourceVirtualAddress = ResourceDirectory.VirtualAddress;
DWORD ResourceSize = ResourceDirectory.Size;

if(ResourceSize== 0)
{
haveDirectory = FALSE;
MessageBox(0,TEXT("没有资源表"),TEXT("错误"),0);
return;
}else{
haveDirectory = TRUE;

}

sprintf(rn,"ResourceVirtualAddress :%08X \r\n",ResourceVirtualAddress);
strcat(InfoStr,rn);
sprintf(rn,"ResourceSize :%08X \r\n",ResourceSize);
strcat(InfoStr,rn);

DWORD dwFoa = RVAToFileOffset(pFileBuffer,ResourceVirtualAddress);
PIMAGE_RESOURCE_DIRECTORY pResource = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)pFileBuffer + dwFoa);

//输出PIMAGE_RESOURCE_DIRECTORY 的信息

sprintf(rn,"NumberOfNamedEntries :%08X \r\n",pResource->NumberOfNamedEntries);
strcat(InfoStr,rn);
sprintf(rn,"NumberOfIdEntries :%08X \r\n",pResource->NumberOfIdEntries);
strcat(InfoStr,rn);

//第一层类型的解析
//第一个资源表
PIMAGE_RESOURCE_DIRECTORY_ENTRY pResdirectoryEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pResource + sizeof(IMAGE_RESOURCE_DIRECTORY));
DWORD NumberOfResType = pResource->NumberOfNamedEntries + pResource->NumberOfIdEntries;

//找到图标资源
PIMAGE_RESOURCE_DIRECTORY pResICODir=NULL;


for(DWORD i=0;i<NumberOfResType;i++)
{
//解析内容:
DWORD NameIsString = pResdirectoryEntry->NameIsString;
DWORD ResName = pResdirectoryEntry->Name;
DWORD OffsetToData = pResdirectoryEntry->OffsetToData;
DWORD DataIsDirectory = pResdirectoryEntry->DataIsDirectory;

//printf("Info: %d -NameIsString: %d - Name: %x -- OffToDa: %x - IsD - %d \n",i+1,
//NameIsString,ResName,OffsetToData,DataIsDirectory);
sprintf(rn,"Info: %08X -NameIsString: %08X - Name: %08X -- OffToDa: %08X : IsD - %08X \r\n",i+1,NameIsString,ResName,OffsetToData,DataIsDirectory);
strcat(InfoStr,rn);

if(ResName == 0x3)
{
//PIMAGE_RESOURCE_DIRECTORY pResource = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)pFileBuffer + dwFoa);
pResICODir = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)pResource +pResdirectoryEntry->OffsetToDirectory);
break;
}

pResdirectoryEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pResdirectoryEntry + 8);
}

//确定图标的地址,找第二层
DWORD NumberOffICO = pResICODir->NumberOfIdEntries + pResICODir->NumberOfNamedEntries;
//printf("NumberOffICO : %d \n",NumberOffICO);
sprintf(rn,"NumberOffICO :%08X \r\n",NumberOffICO);
strcat(InfoStr,rn);

//第一个图标描述
PIMAGE_RESOURCE_DIRECTORY_ENTRY pICOEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pResICODir + sizeof(IMAGE_RESOURCE_DIRECTORY));

PIMAGE_RESOURCE_DIRECTORY pICOContent = NULL;

for(DWORD j = 0;j<NumberOffICO;j++)
{
//解析内容:
DWORD NameIsString = pICOEntry->NameIsString;
DWORD ResName = pICOEntry->Name;
DWORD OffsetToData = pICOEntry->OffsetToData;
DWORD DataIsDirectory = pICOEntry->DataIsDirectory;

//printf("Info: %d -NameIsString: %d - Name: %x -- OffToDa: %x - IsD - %d \n",i+1,
// NameIsString,ResName,OffsetToData,DataIsDirectory);

sprintf(rn,"Info: %d -NameIsString: %d - Name: %08X -- OffToDa: %08X - IsD - %08X \n",i+1,
NameIsString,ResName,OffsetToData,DataIsDirectory);
strcat(InfoStr,rn);

//依次解析页码表
pICOContent = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)pResource +pICOEntry->OffsetToDirectory);
//页码表解析
DWORD NumberOfICOContent = pICOContent->NumberOfIdEntries + pICOContent->NumberOfNamedEntries;
//printf("NumberOfICOContent: %d \n",NumberOfICOContent);
sprintf(rn,"NumberOfICOContent :%08X \r\n",NumberOfICOContent);
strcat(InfoStr,rn);

//图标测试只有一个,不循环测试
//找到关键点:
PIMAGE_RESOURCE_DIRECTORY_ENTRY pICOGetVS = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pICOContent + sizeof(IMAGE_RESOURCE_DIRECTORY));
//找到图标资源的VistrualAddress 和 Size
PIMAGE_DATA_DIRECTORY pDataIco = (PIMAGE_DATA_DIRECTORY)((DWORD)pResource + pICOGetVS->OffsetToDirectory);
//输出每个图标信息
//printf("VirtualAddress: %x, Size: %x \n",pDataIco->VirtualAddress,pDataIco->Size);
sprintf(rn,"VirtualAddress: %08X, Size: %08X \n",pDataIco->VirtualAddress,pDataIco->Size);
strcat(InfoStr,rn);
pICOEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pICOEntry + 8);
}
SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);
break;
}

case INFO_RELOC:
{
sprintf(rn,"重定位表的基本信息 : \r\n");
strcat(InfoStr,rn);

DWORD BaseReloc_Directory_Address = DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;
DWORD BaseReloc_Directory_Size = DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size;
FoA = RVAToFileOffset(pFileBuffer,BaseReloc_Directory_Address);

if(BaseReloc_Directory_Size == 0)
{
haveDirectory = FALSE;
MessageBox(0,TEXT("没有重定位表"),TEXT("错误"),0);
return;
}else{
haveDirectory = TRUE;

}

//定位到第一个重定位块
PIMAGE_BASE_RELOCATION pRelocData = (PIMAGE_BASE_RELOCATION)((DWORD)pFileBuffer + FoA);

//输出所有的标信息
while(pRelocData->VirtualAddress||pRelocData->SizeOfBlock)
{
DWORD RelocVirtualAddress = pRelocData->VirtualAddress;
DWORD RelocSize = pRelocData->SizeOfBlock;

sprintf(rn,"VirtualSize: %08X ,Size: %08X , Number: %08X \r\n",RelocVirtualAddress,RelocSize,(RelocSize-8)/2);
strcat(InfoStr,rn);

int k = (RelocSize-8)/2;
PWORD pMyRelocAddress = NULL;
pMyRelocAddress = (PWORD)((DWORD)pRelocData+8);

for(int i=0;i<k;i++)
{
//printf();
sprintf(rn,"第%04X个 : 标志 : %08X 偏移 : %08X\r\n",i+1,pMyRelocAddress[i]&0xF000,RelocVirtualAddress+(pMyRelocAddress[i]&0x0FFF));
strcat(InfoStr,rn);
}
pRelocData = (PIMAGE_BASE_RELOCATION)((DWORD)pRelocData + RelocSize);
}

SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);
break;
}
case INFO_BIND:
{
sprintf(rn,"绑定导入表的基本信息 : \r\n");
strcat(InfoStr,rn);

IMAGE_DATA_DIRECTORY pBindImportDirectory = DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT];

DWORD BindImportVirtualAddress = pBindImportDirectory.VirtualAddress;
DWORD BindImportFoa = BindImportVirtualAddress;

PIMAGE_BOUND_IMPORT_DESCRIPTOR pBindImport = (PIMAGE_BOUND_IMPORT_DESCRIPTOR)((DWORD)pFileBuffer + BindImportFoa);

if(pBindImportDirectory.Size == 0)
{
haveDirectory = FALSE;
MessageBox(0,TEXT("没有绑定导入表"),TEXT("错误"),0);
return;
}else{
haveDirectory = TRUE;

}


while(pBindImport->TimeDateStamp !=0x0)
{
//输出第一个绑定
DWORD bindTime = pBindImport->TimeDateStamp;
WORD ModuleName = pBindImport->OffsetModuleName;
WORD numberModule = pBindImport->NumberOfModuleForwarderRefs;

//输出名字
PSTR pModuleName = (PSTR)((DWORD)pFileBuffer+(DWORD)BindImportVirtualAddress+ModuleName);

sprintf(rn,"ModuleName:%s \r\n",pModuleName);
strcat(InfoStr,rn);
//printf("ModuleName:%s \n",pModuleName);
//printf("--numberModule:%x \n",numberModule);
sprintf(rn,"--numberModule:%08X \r\n",numberModule);
strcat(InfoStr,rn);

for(int i=0;i<numberModule;i++)
{
PIMAGE_BOUND_FORWARDER_REF pBoundRef = (PIMAGE_BOUND_FORWARDER_REF)((DWORD)pBindImport+i*8);
pBindImport = (PIMAGE_BOUND_IMPORT_DESCRIPTOR)((DWORD)pBindImport+i*8);

//输出名字
DWORD refTime = pBoundRef->TimeDateStamp;
WORD refName = pBoundRef->OffsetModuleName;
PSTR pRefName = (PSTR)((DWORD)pFileBuffer+(DWORD)BindImportVirtualAddress+refName);
//printf(" RefName:%s \r\n",pRefName);
sprintf(rn," RefName:%s \r\n",pRefName);
strcat(InfoStr,rn);
}

pBindImport = (PIMAGE_BOUND_IMPORT_DESCRIPTOR)((DWORD)pBindImport+8);
}

SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);
break;
}
case INFO_IAT:
{
sprintf(rn,"绑定导入表的基本信息 : \r\n");
strcat(InfoStr,rn);

sprintf(rn,"测试使用,未实现 : \r\n");
strcat(InfoStr,rn);
SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);
break;
}

}


//释放内存
free(pFileBuffer);
}








发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容