在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例常规C/C++编程 → 滴水三期PE解析实例(Funtion.cpp)

滴水三期PE解析实例(Funtion.cpp)

常规C/C++编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.06M
  • 下载次数:20
  • 浏览次数:362
  • 发布时间:2020-06-12
  • 实例类别:常规C/C++编程
  • 发 布 人:gogobn
  • 文件格式:.cpp
  • 所需积分:2
 相关标签: pe 解析 实例

实例介绍

【实例简介】
【实例截图
//函数文件
#include<Windows.h>
#include"Funtion.h"
#include"tools.h"
#include "malloc.h"//动态申请分配内存函数需要的头文件


BOOL Initialization_PROCESS(HWND hDlg)//hDlg是主窗口句柄
{
	LV_COLUMN lv; //LV_COLUMN是框的表头属性包含(显示文本,多少行,多少列)
	HWND hListProcess;//控件框句柄
	memset(&lv,0,sizeof(LV_COLUMN));//将lv写0,在堆栈中建立的 里面有垃圾值
	//获取主窗口上控件框句柄 
	hListProcess=GetDlgItem(hDlg,IDC_LIST_PROCESS);
	//设置整行选中风格,发消息给系统 告诉系统这个框里面的内容如果被选中就整行选中
	SendMessage(hListProcess,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);
	//设置表头
	lv.mask=LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	//设置表头第一列 iSubItem=0 ,0开始
	lv.pszText=TEXT("进程"); //列标题
	lv.cx= 300;				 //列宽
	lv.iSubItem=0;           //这是第几列
	SendMessage(hListProcess,LVM_INSERTCOLUMN,0,(DWORD)&lv);
	//第二列
	lv.pszText=TEXT("PID");
	lv.cx= 65;
	lv.iSubItem=1;   //这是第几列
	SendMessage(hListProcess,LVM_INSERTCOLUMN,1,(DWORD)&lv);
	//第三列
	lv.pszText=TEXT("镜像基址");
	lv.cx= 110;
	lv.iSubItem=2;   //这是第几列
	SendMessage(hListProcess,LVM_INSERTCOLUMN,2,(DWORD)&lv);
	//第四列
	lv.pszText=TEXT("镜像大小");
	lv.cx= 110;
	lv.iSubItem=3;   //这是第几列
	SendMessage(hListProcess,LVM_INSERTCOLUMN,3,(DWORD)&lv);
	EnumProcess(hListProcess);
 return TRUE;
}
//初始化Moudle框的表头属性
BOOL Initialization_MOUDLE(HWND hDlg)
{
	LV_COLUMN lv;
	HWND hListMoudle;
	memset(&lv,0,sizeof(LV_COLUMN));
	hListMoudle=GetDlgItem(hDlg,IDC_LIST_MOUDLE);
	//设置整行选中
	SendMessage(hListMoudle,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);
	lv.mask=LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;//指定LV_COLUMN结构里成员几个有效这里是-->表头内容,表头列宽,表头列下标(索引)
	lv.pszText=TEXT("模块名");
	lv.cx=292;
	lv.iSubItem=0;
	ListView_InsertColumn(hListMoudle,0,&lv);//和send函数一样 插入表头0列属性
	lv.pszText=TEXT("模块基址");
	lv.cx=293;
	lv.iSubItem=1;
	ListView_InsertColumn(hListMoudle,1,&lv);//和send函数一样 插入表头1列属性



	return TRUE;
}

//遍历所有进程将其显示在LIST_PROCESS框里
BOOL EnumProcess(HWND hLstprocess)//hLstprocess是主窗口上面那个列表框的句柄
{
	CHAR a[260]={0};
	HANDLE hSnapshot=0;//创建进程快照句柄变量
	PROCESSENTRY32 pi;//创建进程信息结构体变量(该结构体包含进程信息属性如PID,模块,线程,基址,路径等等)
	memset(&pi,0,sizeof(PROCESSENTRY32));//写0 栈中分配所以要写0
	LV_ITEM vitem;//这是列表框中显示的内容结构
	memset(&vitem,0,sizeof(LV_ITEM));//写0;
	vitem.mask=LVIF_TEXT;
	hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);//获取系统进程快照信息
	pi.dwSize=sizeof(PROCESSENTRY32);//将大小初始化
	
	//首次遍历

	BOOL bRet=Process32First(hSnapshot,&pi);
	if(bRet==FALSE)
	{
		return FALSE;
	 
	
	}
	  int i=0;
	int i1=0;
	int i3=0;
	char str[25];//堆栈中的数组用于将数据转换成unicode格式
	
	memset(&m_module,0,sizeof(ModuleEntry32));//写0
	ModuleEntry32* Pm_module=&m_module;//定义一个指针指向模块结构 
	
	//开始循环遍历进程信息
	while(bRet)
	{
		memset(&m_module,0,sizeof(ModuleEntry32));//写0
	    EnumMoudle(pi.th32ProcessID,pi.szExeFile,Pm_module);//获取当前进程中模块名基址和大小
		if(m_module.hModule!=0)
		{
				vitem.pszText=(TCHAR*)pi.szExeFile;
				vitem.iItem=i3; //行
				i3  ;//列表框下一行
				vitem.iSubItem=0; //列
				SendMessage(hLstprocess,LVM_INSERTITEM,0,(DWORD)&vitem);//LVM_INSERTITEM是插入1行
				memset(str,0,25);


				sprintf(str,"%x",pi.th32ProcessID);//将整数型转为char型字符串
				 i=0;
				 i1=0;
				/*DbgPrintf("%s,  %x\n",pi.szExeFile,pi.th32ProcessID);*/
				 while(str[i]!=0)
				{
					a[i1]=str[i];
					a[i1 1]=0;
					a[i1 2]=0;
					i  ;
					i1=i1 2;
				}
				vitem.pszText=(TCHAR*)a;//uncode字符串
				vitem.iSubItem=1;//列
				SendMessage(hLstprocess,LVM_SETITEM,0,(DWORD)&vitem);//LVM_SETITEM是设置1行
				memset(str,0,25);
				sprintf(str,"%x",m_module.hModule);//将整数型转为char型字符串
					i=0;
					i1=0;
				//DbgPrintf("%s,  %x\n",pi.szExeFile,pi.th32DefaultHeapID);
					while(str[i]!=0)
				{
					a[i1]=str[i];
					a[i1 1]=0;
					a[i1 2]=0;
					i  ;
					i1=i1 2;
				}
				vitem.pszText=(TCHAR*)a;//uncode字符串
				vitem.iSubItem=2;//列
				SendMessage(hLstprocess,LVM_SETITEM,0,(DWORD)&vitem);//LVM_INSERTITEM是设置1行
			    //这是镜像大小
				//DbgPrintf("%x,  %x\n",m_module.modBaseAddr,m_module.modBaseSize);
				memset(str,0,25);
				sprintf(str,"%x",m_module.modBaseSize);//将整数型转为char型字符串
					i=0;
					i1=0;
				//DbgPrintf("%s,  %x\n",pi.szExeFile,pi.th32DefaultHeapID);
					while(str[i]!=0)
				{
					a[i1]=str[i];  //复制为unicode字符串类型
					a[i1 1]=0;
					a[i1 2]=0;
					i  ;
					i1=i1 2;
				}
				vitem.pszText=(TCHAR*)a;//uncode字符串
				vitem.iSubItem=3;//列
				SendMessage(hLstprocess,LVM_SETITEM,0,(DWORD)&vitem);//LVM_SETITEM是设置1行
		
				

		}
		bRet = Process32Next(hSnapshot,&pi);//获取pi里的进程的下一个进程


		
	    
	}
	CloseHandle (hSnapshot); //关闭  

   return TRUE;
}


//遍历当前进程模块函数
BOOL EnumMoudle(DWORD PID,WCHAR* Modulename,ModuleEntry32* pModule)//参数1系统进程快照句柄,参数2 需遍历的进程PID,参数三是OUT参数模块结构体
{
   //创建遍历模块需要的结构体
	MODULEENTRY32 m_Module;
	
	memset(&m_Module,0,sizeof(MODULEENTRY32));//堆中分配 写0安全
	HANDLE hSnapshot;//创建进程块照信息变量
	m_Module.dwSize=sizeof(MODULEENTRY32);//必须初始化大小才能用Module32First函数
	hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,PID);//获取系统进程快照信息
	
	//开始遍历所有模块
	///*ModuleEntry32* m_pModule;*/
	BOOL bRet=Module32First(hSnapshot,&m_Module);//首次遍历进程快照信息
	int i=0;
	int i1=0;
	TCHAR a[50];
	memset(a,0,50);
	while(bRet)
	{
		while(i1>=0)
		{
			if((m_Module.szModule[i1])!=0&&(m_Module.szModule[i1 1]!=0))//判断模块名多长用于内存比较
			{
			   i  ;//模块名长度
			
			}else
			{
			
			  i1=-2;
			
			}
		 
		  i1  ;
		
		}
	
		
		if(memcmp(m_Module.szModule,Modulename,i-8)==0)//判断这个模块是不是属于我这个进程
		{
			memcpy(pModule,&m_Module,sizeof(MODULEENTRY32));//复制进我传进来的结构体内
		}
	
	 bRet=Module32Next(hSnapshot,&m_Module);//获取当前m_Module里面的进程的下一个进程信息;
	  
	}
    CloseHandle (hSnapshot); //关闭进程快照 

	return TRUE;
}

//遍历选中进程的所有模块,将其显示在Listcontrol_MODULE控件窗口上
BOOL ENummoduleTolistcrotrol(HWND hLstprocess,HWND hwndDLg)//hLstprocess是Listcontrol_PROCESS控件的句柄;
{
	//hLstprocess得到列表框当前选中项的PID的值
	DWORD dwRowId=0;//进程pid变量
	LV_ITEM lv;  
	lv.mask=LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	TCHAR szPid[0x20];
	char a[0x20]={0};
	int i3=0;
	BOOL mFalse;
	HWND hListModule;
	TCHAR a1[0x20]={0};
	hListModule=GetDlgItem(hwndDLg,IDC_LIST_MOUDLE);//获取主窗口模块列表框句柄;
	SendMessage(hListModule,LVM_DELETEALLITEMS,0,0);//清空列表框里面的内容
	memset(&lv,0,sizeof(LV_ITEM));
	memset(szPid,0,0x20);
	dwRowId=SendMessage(hLstprocess,LVM_GETNEXTITEM,-1,LVNI_SELECTED);//得到当前选中行
	if(dwRowId==-1)
	{
		MessageBox(NULL,TEXT("请选择进程"),TEXT("ERROR"),MB_OK);
	
	   return FALSE;
	}
	lv.iSubItem=1;						//要获取的列
	lv.pszText=szPid;					//指定储存查询结构的缓冲区
	lv.cchTextMax=0x20;					//指定缓冲区大小
	SendMessage(hLstprocess,LVM_GETITEMTEXT,dwRowId,(DWORD)&lv);//得到选中行中第1列里面的信息 即选中进程PID值;
	//MessageBox(NULL,szPid,TEXT("PID"),MB_OK);
	 //创建遍历模块需要的结构体
	int i=0;
	int i1=0;
	while(szPid[i]!=0)
	{
		a[i1]=szPid[i];
		a[i1 1]=0;
		i  ;
		i1  ;
	}

	DWORD PID=ConvertDWORD(a);
	
	MODULEENTRY32 m_Module;
	
	memset(&m_Module,0,sizeof(MODULEENTRY32));//堆中分配 写0安全
	HANDLE hSnapshot;//创建进程块照信息变量
	m_Module.dwSize=sizeof(MODULEENTRY32);//必须初始化大小才能用Module32First函数
	
	hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,PID);//获取系统进程快照信息
	
	//开始遍历所有模块
	/*ModuleEntry32* m_pModule;*/
	BOOL bRet=Module32First(hSnapshot,&m_Module);//首次遍历进程快照信息
	while(bRet)
	{
		lv.iItem=i3;
		i3  ;
	    lv.pszText=m_Module.szModule;
		lv.iSubItem=0;
		SendMessage(hListModule,LVM_INSERTITEM,0,(DWORD)&lv);//LVM_INSERTITEM是插入1行
		
		mFalse=ConvertUNICODE((DWORD)m_Module.hModule,a1);
		if(mFalse==FALSE)
		{
		  return FALSE;
		
		}
		lv.pszText=a1;
		lv.iSubItem=1;
		SendMessage(hListModule,LVM_SETITEM,0,(DWORD)&lv);//LVM_INSERTITEM是插入1行
	
	    bRet=Module32Next(hSnapshot,&m_Module);//获取当前m_Module里面的进程的下一个进程信息;
	
	
	}


	 CloseHandle (hSnapshot); //关闭进程快照 
	return TRUE;
}

DWORD ConvertDWORD(char* a)//将ascii数字字符串转换成16进制DWORD类型返回  参数a是需要被转字符串指针
{
	//a=4578
	char b[22]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'};//一个个相等找到了再用相等的表下标..
	int  c[22]={0,1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf};//int型表
	DWORD A=0;
	DWORD B=0;
	int i=0;
	int i2=0;
	
	while(i>=0)//这个循环判断字符串的长度
	{
		if (a[i]!=0)
		{
		  i2  ;//
		
		}else
		{
		  i=-2;
		}
	  i  ;
	
	}
	if(i2==0)
	{
		return -1;
	}
	int i3=0;
	for(i=0;i<i2;i  )//这个循环是遍历每个字节的数值相符的数
	{
		A=0;
		for(int i1=0;i1<22;i1  )
		{
			if(a[i]==b[i1])
			{
				if(i1<16)
				{
					A=c[i1];//查表 用表里面的值赋给他
					break;
				}else
				{
					A=c[i1-6];//表里面大写英文字符串
				}
			}
		}
	    B=B*0x10;//从低位到高位一字节一字节转换,所以需要*0x10(注意是16进制的10)
		B=B A;//再加上A就等于数字了;
	}
	return B;

}
//将DWORD类型转换成unicode字符串类型
BOOL ConvertUNICODE(DWORD a,TCHAR* b)//参数a是被转DWORD型数值,b是out参数 转换后保存的字符串的指针
{
	/*
0000 0000
1111 1111
F     F
1111 0010
F    2    */
 
	if(a==0)
	{
	  return FALSE;
	
	}
	char* b2=(char*)&a;
	char  c[16]={0,1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf};//用来比较是否相等 相等则查下面的表
	char b1[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//用来赋值的表
	unsigned char d=0;
	unsigned char e=0;//注意这里两个要用无符号数
	int i3=0;
	int i=4;
	int i2=0;
	char a3[0x20]={0};
	while(i)
	{
	    d=b2[i-1];
		d=d>>4;//取数字高4位与c数组元素相比较
		e=b2[i-1];
		e=e<<4;//取数字低4位与c数组元素相比较
		e=e>>4;
		for(int i1=0;i1<16;i1  )
		{
			if (d==c[i1])//高4位如果相等 则说明找到相匹配的数字然后让其等于相匹配的字符串即可
			{
				d=b1[i1];//d等于c[i1]相符的字符串 
				
				
			}
			if (e==c[i1])//低4位如果相等 则说明找到相匹配的数字然后让其等于相匹配的字符串即可
			{
				e=b1[i1];//e等于c[i1]相符的字符串
			}
		
		}
		if (i==4&&d=='0'&&e=='0')
		{
			 i--;
			continue;//如果等于4或者表明4字节前面1字节为0不用显示;
         }
			if((d!='0')|(i3==-1))
			{
			  a3[i2]=d;
			  i2  ;
			  i3=-1;
			}
			if((e!='0')|(i3==-1))
			{
			 a3[i2]=e;
			 i2  ;
			 i3=-1;
			}
     i--;
	}
  i=0;
  while(a3[i])
  {
    b[i]=a3[i];
   i  ;
  
  }

 return TRUE;
}


//弹出打开窗口 获取文件路径名函数
BOOL FindFileName(HWND hwndDLg) //hwndDLg主窗口句柄
{
		OPENFILENAME stOpenFile;																			//获取文件路径名窗口需要的结构;(文件打开窗口)        
		TCHAR szFileName[256];																				//将获取到的文件路径名存到这个缓冲区  unicode类型
		
		memset(szFileName,0,256);																			//写0
		memset(&stOpenFile,0,sizeof(OPENFILENAME));															//写0
		stOpenFile.lStructSize=sizeof(OPENFILENAME);														 //指定结构大小
		stOpenFile.Flags=OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;												//上MSDN查 记不住这么多
		stOpenFile.hwndOwner=hwndDLg;																		//指定'打开窗口'的父进程
		//注意这里的 \0   '\0'前面是显示文本(提示用户过滤些什么),'\0'后面是真实过滤器,  总之注意这里的过滤怎么写的
		stOpenFile.lpstrFilter=TEXT("PE文件(*.exe;*.dll;*.scr;*.drv;*.sys)\0*.exe;*.dll;*.scr;*.drv;*.sys\0所有文件(*.*)\0*.*\0\0");  
		stOpenFile.lpstrFile=szFileName;																	//指定获取到的文件路径名放到这个缓冲区
		stOpenFile.nMaxFile=MAX_PATH;																		//指定参数作用自己上MSDN查
		GetOpenFileName(&stOpenFile);																		//获取 
		
		int len=WideCharToMultiByte(CP_ACP,0,szFileName,-1,NULL,0,NULL,NULL);								//取长度  unicode转化函数需要

		WideCharToMultiByte(CP_ACP,0,szFileName,-1,pFileName,len,NULL,NULL);								//将其转化成unicode字符串 并写入全局变量
		if(pFileName[0]==0)
		{
			return FALSE;
		}
		DbgPrintf("wenjianming=  %s\n",pFileName);
		//这里写弹出PE信息窗口 ,记住要写个回调事件处理函数
		
		DialogBox(hINSTANCE,LPCTSTR(IDD_DIALOG_PE_CHECK),NULL,wndproc_PE);//弹出窗口

 return TRUE;

}
//PE查看信息窗口回调事件处理函数
BOOL CALLBACK wndproc_PE(
	                    HWND hwndDLg,
						UINT uMsg,
						WPARAM wParam,
						LPARAM lParam
						)
{
	hPe=hwndDLg;
	switch(uMsg)
	{
		
	    
	case WM_INITDIALOG: //窗口创建完成在显示前会发送一条这种消息
		{
		 //在这里需要加入LIST_CROTROL_PROCESS和LIST_CROTORL_MOUDLE 的行与列;初始化函数
		 HICON hIcon;
		 hIcon=LoadIcon(hINSTANCE,MAKEINTRESOURCE(IDI_ICON1));//加载图标资源,这步还没显示
		 SendMessage(hwndDLg,WM_SETICON,ICON_BIG,(DWORD)hIcon);//发送消息显示大图标
		SendMessage(hwndDLg,WM_SETICON,ICON_SMALL,(DWORD)hIcon);//发送消息显示小图标
		ReadPE(hwndDLg);//读取pe基本信息
		 //在这里加入遍历PE文件的函数 
		 return TRUE;
		}
	//标准控件走这;
	case WM_COMMAND:
		{
		switch(LOWORD(wParam))
		 {
		 case IDC_BUTTON_PE_OUT://这是自己添加的按钮
			 {
				 DestroyWindow(hPe);
				 hPe=NULL;
				 SendMessage(MainWnd,WM_SETFOCUS,0,0);//激活窗口
				 return TRUE;
			 }
		 case IDC_BUTTON_PE_SEC: //这是自己添加的按钮
			 {
				 DialogBox(hINSTANCE,LPCTSTR(IDD_DIALOG_SECTIONS),NULL,wndproc_Section);//弹出窗口
			 
			 
				 return TRUE;
			 }
		 case IDC_BUTTON_PE_CATALOG://这是自己添加的按钮
			 {//MessageBox(NULL,TEXT("目录"),TEXT("目录"),MB_OK);
				 DialogBox(hINSTANCE,LPCTSTR(IDD_DIALOG_CATALOG),NULL,wndproc_Catalog);//弹出窗口
				 return TRUE;
			 }
		 case IDCANCEL://窗口上的X键消息
			 {
				 DestroyWindow(hPe);
				 hPe=NULL;
				 SendMessage(MainWnd,WM_SETFOCUS,0,0);//激活窗口
				 return TRUE;
			 }
			 break;
		 }
	     break;
		}
		break;
	}




	return FALSE;//其余消息全部走这里出去

}
//读取PE信息函数
BOOL ReadPE(HWND hwndDLg)
{
	if(pFileName[0]==0)
	{
		MessageBox(0,TEXT("文件路径名错误!"),TEXT("Error"),MB_OK);
		return FALSE;
	}
	
	//定义局部变量区
	FILE* A=NULL;
	char* a=NULL;
	DWORD c=0;

	TCHAR Text[0x20]={0};
	HWND hEdit_IMAGEBASE=GetDlgItem(hwndDLg,IDC_EDIT_IMAGEBASE);						 //镜像基址编辑框
	HWND hEdit_SizeOfImage=GetDlgItem(hwndDLg,IDC_EDIT_SizeOfImage);					 //镜像大小编辑框
	HWND hEdit_BASEOFCODE=GetDlgItem(hwndDLg,IDC_EDIT_BASEOFCODE);						 //代码基址
	HWND hEdit_BASEOFDATA=GetDlgItem(hwndDLg,IDC_EDIT_BASEOFDATA);                       //数据基址
	HWND hEdit_SECTIONALIGNMENT=GetDlgItem(hwndDLg,IDC_EDIT_SECTIONALIGNMENT);           //内存对齐
	HWND hEdit_FILEALIGNMENT=GetDlgItem(hwndDLg,IDC_EDIT_FILEALIGNMENT);				 //文件对齐
	HWND hEdit_WIN32VERSIONVALUE=GetDlgItem(hwndDLg,IDC_EDIT_WIN32VERSIONVALUE);		 //子系统
	HWND hEdit_E_MAGIC=GetDlgItem(hwndDLg,IDC_EDIT_E_MAGIC);							 //标志字
	HWND hEdit_NUMBEROFSECTIONS=GetDlgItem(hwndDLg,IDC_EDIT_NUMBEROFSECTIONS);				//节区数目
	HWND hEdit_TIMEDATASTAMP=GetDlgItem(hwndDLg,IDC_EDIT_TIMEDATASTAMP);					//时间戳
	HWND hEdit_SIZEOFHEADERS=GetDlgItem(hwndDLg,IDC_EDIT_SIZEOFHEADERS);					//PE头大小
	HWND hEdit_CHARACTERISTICS=GetDlgItem(hwndDLg,IDC_EDIT_CHARACTERISTICS);				//特征值
	HWND hEdit_CHECKSUM=GetDlgItem(hwndDLg,IDC_EDIT_CHECKSUM);								//效验和
	HWND hEdit_SIZEOFOPTIONALHEADER=GetDlgItem(hwndDLg,IDC_EDIT_SIZEOFOPTIONALHEADER);		//可选PE头大小
	HWND hEdit_NUMBEROFRVAANDSIZES=GetDlgItem(hwndDLg,IDC_EDIT_NUMBEROFRVAANDSIZES);		//目录项数量
	HWND hEdit_AddressOfEntryPoint=GetDlgItem(hwndDLg,IDC_EDIT_AddressOfEntryPoint);		//程序入口
	


	
	//-------------------------------------局部变量区


	
	c=longfile(pFileName);
	if (c<=0)
	{
	  MessageBox(0,TEXT("文件路径名错误!"),TEXT("Error"),MB_OK);
		return FALSE;
	
	}
	a=(char*)malloc(sizeof(char)*c);
	memset(a,0,c);//写0;
	A=fopen(pFileName,"rb");
	fread(a,sizeof(char),c,A);
	fclose(A);
	PE  A1;
	A1.getdata(a,0);
	ConvertUNICODE(A1.IMAGEBASE,Text);
	SendMessage(hEdit_IMAGEBASE,WM_SETTEXT,0,(LPARAM)Text);//镜像基址
	memset(Text,0,0x20);
	ConvertUNICODE(A1.sizeofimage,Text);
	SendMessage(hEdit_SizeOfImage,WM_SETTEXT,0,(LPARAM)Text);//镜像大小
	memset(Text,0,0x20);
	ConvertUNICODE(A1.baseofcode,Text);
	SendMessage(hEdit_BASEOFCODE,WM_SETTEXT,0,(LPARAM)Text);//代码基址
	memset(Text,0,0x20);
	ConvertUNICODE(A1.baseofdata,Text);
	SendMessage(hEdit_BASEOFDATA,WM_SETTEXT,0,(LPARAM)Text);//数据基址
	memset(Text,0,0x20);
	ConvertUNICODE(A1.sectionalignment,Text);
	SendMessage(hEdit_SECTIONALIGNMENT,WM_SETTEXT,0,(LPARAM)Text);//内存对齐
	memset(Text,0,0x20);
	ConvertUNICODE(A1.filealignment,Text);
	SendMessage(hEdit_FILEALIGNMENT,WM_SETTEXT,0,(LPARAM)Text);//文件对齐
	memset(Text,0,0x20);
	ConvertUNICODE(A1.minorsubsystemversion,Text);
	SendMessage(hEdit_WIN32VERSIONVALUE,WM_SETTEXT,0,(LPARAM)Text);	//子系统
	memset(Text,0,0x20);
	ConvertUNICODE(A1.e_magic,Text);
	SendMessage(hEdit_E_MAGIC,WM_SETTEXT,0,(LPARAM)Text);//标志字
	memset(Text,0,0x20);
	ConvertUNICODE(A1.numberofsections,Text);
	SendMessage(hEdit_NUMBEROFSECTIONS,WM_SETTEXT,0,(LPARAM)Text);//节区数量
	memset(Text,0,0x20);
	ConvertUNICODE(A1.timedatestamp,Text);
	SendMessage(hEdit_TIMEDATASTAMP,WM_SETTEXT,0,(LPARAM)Text);//时间戳
	memset(Text,0,0x20);
	ConvertUNICODE(A1.sizeofheaders,Text);
	SendMessage(hEdit_SIZEOFHEADERS,WM_SETTEXT,0,(LPARAM)Text);//PE头大小
	memset(Text,0,0x20);
	ConvertUNICODE(A1.characteristics,Text);
	SendMessage(hEdit_CHARACTERISTICS,WM_SETTEXT,0,(LPARAM)Text);//特征值
	memset(Text,0,0x20);
	ConvertUNICODE(A1.cheecksum,Text);
	SendMessage(hEdit_CHECKSUM,WM_SETTEXT,0,(LPARAM)Text);//效验和
	memset(Text,0,0x20);
	ConvertUNICODE(A1.sizeofoptionalheader,Text);
	SendMessage(hEdit_SIZEOFOPTIONALHEADER,WM_SETTEXT,0,(LPARAM)Text);//可选PE头大小
	memset(Text,0,0x20);
	ConvertUNICODE(A1.numberofrvaandsizes,Text);
	SendMessage(hEdit_NUMBEROFRVAANDSIZES,WM_SETTEXT,0,(LPARAM)Text);//目录项数量
	memset(Text,0,0x20);
	ConvertUNICODE(A1.addressofentrypoint,Text);
	SendMessage(hEdit_AddressOfEntryPoint,WM_SETTEXT,0,(LPARAM)Text);//程序入口

	//读取文件至内存filebuff,先打开
	free(a);
	return TRUE;

}

DWORD longfile(char* x)//返回文件长度,即filebuff所需的空间;
{
	DWORD y=0,z=0;
	FILE* a;
	a=fopen(x,"r");//打开文件至流中
	y=ftell(a);//保存当前光标的位置
	
	fseek(a,0,SEEK_END);//当前光标移动到文件末
	z=ftell(a);//把当前光标离文件首位置距离赋值给z
	fseek(a,y,SEEK_SET);//把当前光标移回去
	fclose(a);//关闭流
	return z;

}


//PE查看信息窗口回调事件处理函数
BOOL CALLBACK wndproc_Section(
	                    HWND hwndDLg,
						UINT uMsg,
						WPARAM wParam,
						LPARAM lParam
						)
{
	hSection=hwndDLg;
	switch(uMsg)
	{
		
	    
	case WM_INITDIALOG: //窗口创建完成在显示前会发送一条这种消息
		{
		 //在这里需要加入LIST_CROTROL_PROCESS和LIST_CROTORL_MOUDLE 的行与列;初始化函数
			 HICON hIcon;
			 hIcon=LoadIcon(hINSTANCE,MAKEINTRESOURCE(IDI_ICON1));//加载图标资源,这步还没显示
			 SendMessage(hwndDLg,WM_SETICON,ICON_BIG,(DWORD)hIcon);//发送消息显示大图标
			SendMessage(hwndDLg,WM_SETICON,ICON_SMALL,(DWORD)hIcon);//发送消息显示小图标
			PE_Section(hwndDLg);
			 //在这里加入遍历PE文件节表的函数 
			 return TRUE;
		}
	//标准控件走这;
	case WM_COMMAND:
		{
		switch(LOWORD(wParam))
		 {
		 case IDCANCEL://窗口上的X键消息
			 { 
				 DestroyWindow(hwndDLg); 
				 hSection=NULL;
				 SendMessage(hPe,WM_SETFOCUS,0,0);//激活窗口
				 return TRUE;
			 }
			break;
		 }
	    
		}
		break;
	}




	return FALSE;//其余消息全部走这里出去

}

//遍历节表将其显示在窗口上
BOOL PE_Section(HWND hwndDLg)
{
	if(pFileName[0]==0)
	{
		MessageBox(0,TEXT("文件路径名错误!"),TEXT("Error"),MB_OK);
		return FALSE;
	}
	
	//定义局部变量区
	FILE* A=NULL;
	char* a=NULL;
	DWORD c=0;
	DWORD c1=0;
	int   c2=0;
	int   i3=0;
	section_table* A3;
	section_table  A2;
	char* a2=NULL;
	WCHAR  b[9]={0};
	//-------------------------------------局部变量区
	LV_COLUMN lv; //LV_COLUMN是框的表头属性包含(显示文本,多少行,多少列)
	LV_ITEM vitem;//这是列表框中显示的内容结构
	HWND hListProcess;//控件框句柄
	memset(&lv,0,sizeof(LV_COLUMN));//将lv写0,在堆栈中建立的 里面有垃圾值
	memset(&vitem,0,sizeof(LV_ITEM));
	vitem.mask=LVIF_TEXT;
	//获取主窗口上控件框句柄 
	hListProcess=GetDlgItem(hwndDLg,IDC_LIST_SECTION_SECTION);
	//设置整行选中风格,发消息给系统 告诉系统这个框里面的内容如果被选中就整行选中
	SendMessage(hListProcess,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);
	//设置表头
	lv.mask=LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	//设置表头第一列 iSubItem=0 ,0开始
	lv.pszText=TEXT("节名"); //列标题
	lv.cx= 80;				 //列宽
	lv.iSubItem=0;           //这是第几列
	SendMessage(hListProcess,LVM_INSERTCOLUMN,0,(DWORD)&lv);
	//第二列
	lv.pszText=TEXT("文件偏移");
	lv.cx= 100;
	lv.iSubItem=1;   //这是第几列
	SendMessage(hListProcess,LVM_INSERTCOLUMN,1,(DWORD)&lv);
	//第三列
	lv.pszText=TEXT("文件大小");
	lv.cx= 100;
	lv.iSubItem=2;   //这是第几列
	SendMessage(hListProcess,LVM_INSERTCOLUMN,2,(DWORD)&lv);
	//第四列
	lv.pszText=TEXT("内存偏移");
	lv.cx= 100;
	lv.iSubItem=3;   //这是第几列
	SendMessage(hListProcess,LVM_INSERTCOLUMN,3,(DWORD)&lv);
	lv.pszText=TEXT("内存大小");
	lv.cx= 100;
	lv.iSubItem=4;   //这是第几列
	SendMessage(hListProcess,LVM_INSERTCOLUMN,4,(DWORD)&lv);
	lv.pszText=TEXT("节区属性");
	lv.cx= 100;
	lv.iSubItem=5;   //这是第几列
	SendMessage(hListProcess,LVM_INSERTCOLUMN,5,(DWORD)&lv);

	
	c=longfile(pFileName);
	if (c<=0)
	{
	  MessageBox(0,TEXT("文件路径名错误!"),TEXT("Error"),MB_OK);
		return FALSE;
	}
	a=(char*)malloc(sizeof(char)*c);
	memset(a,0,c);//写0;
	A=fopen(pFileName,"rb");
	fread(a,sizeof(char),c,A);
	fclose(A);
	PE  A1;
	A1.getdata(a,0);//初始化
	c1=*A1.e_lfanew 0x4 0x14 A1.sizeofoptionalheader;//得到第一个节表所在偏移
	a2=&a[c1];
	A3=(section_table*)a2;
	c2=1;
	while(c2)
	{
		A2.getdata(a2);
		//节区名字写入列表框
		for(int i=0;i<8;i  )
		{
			b[i]=A2.name[i];
			b[i 1]=0;
		}
	    vitem.pszText=b;
		vitem.iItem=i3; //行
		i3  ;//列表框下一行
		vitem.iSubItem=0; //列
		SendMessage(hListProcess,LVM_INSERTITEM,0,(DWORD)&vitem);//LVM_INSERTITEM是插入1行
		memset(b,0,18);
		//文件偏移 写入列表框
		ConvertUNICODE( A2.Pteradata,b);
		if(b[0]==0)
		{
			b[0]='0';
		}
	    vitem.pszText=b;//uncode字符串
		vitem.iSubItem=1;//列
		SendMessage(hListProcess,LVM_SETITEM,0,(DWORD)&vitem);//LVM_SETITEM是设置1行
		memset(b,0,18);
		//文件大小 写入列表框
		ConvertUNICODE( A2.Sizeradata,b);
		if(b[0]==0)
		{
			b[0]='0';
		}
	    vitem.pszText=b;//uncode字符串
		vitem.iSubItem=2;//列
		SendMessage(hListProcess,LVM_SETITEM,0,(DWORD)&vitem);//LVM_SETITEM是设置1行
		memset(b,0,18);
		//内存偏移 写入列表框
		ConvertUNICODE( A2.VIAddress,b);
		if(b[0]==0)
		{
			b[0]='0';
		}
	    vitem.pszText=b;//uncode字符串
		vitem.iSubItem=3;//列
		SendMessage(hListProcess,LVM_SETITEM,0,(DWORD)&vitem);//LVM_SETITEM是设置1行
		memset(b,0,18);
		//内存大小 写入列表框
		ConvertUNICODE( A2.Misc,b);
		if(b[0]==0)
		{
			b[0]='0';
		}
	    vitem.pszText=b;//uncode字符串
		vitem.iSubItem=4;//列
		SendMessage(hListProcess,LVM_SETITEM,0,(DWORD)&vitem);//LVM_SETITEM是设置1行
		memset(b,0,18);
		//节属性 写入列表框
		ConvertUNICODE( A2.Charstics,b);
		if(b[0]==0)
		{
			b[0]='0';
		}
	    vitem.pszText=b;//uncode字符串
		vitem.iSubItem=5;//列
		SendMessage(hListProcess,LVM_SETITEM,0,(DWORD)&vitem);//LVM_SETITEM是设置1行
	    memset(b,0,18);
		a2=a2 0x28;
	 A3=(section_table*)a2;
	 if(A3->Pteradata==0&&A3->VIAddress==0&&A3->Sizeradata==0)
	 {
	   c2=0;//跳出循环
	 
	 }
	}


	free(a);
  return TRUE;
}

//PE查看信息窗口回调事件处理函数
BOOL CALLBACK wndproc_Catalog(
	                    HWND hwndDLg,
						UINT uMsg,
						WPARAM wParam,
						LPARAM lParam
						)
{
	hCatalog=hwndDLg;
	switch(uMsg)
	{
		
	    
	case WM_INITDIALOG: //窗口创建完成在显示前会发送一条这种消息
		{ 
		 //在这里需要加入LIST_CROTROL_PROCESS和LIST_CROTORL_MOUDLE 的行与列;初始化函数
		 HICON hIcon;
		 hIcon=LoadIcon(hINSTANCE,MAKEINTRESOURCE(IDI_ICON1));//加载图标资源,这步还没显示
		 SendMessage(hwndDLg,WM_SETICON,ICON_BIG,(DWORD)hIcon);//发送消息显示大图标
		 SendMessage(hwndDLg,WM_SETICON,ICON_SMALL,(DWORD)hIcon);//发送消息显示小图标
		  EnumCatalog(hwndDLg);
		 //在这里加入遍历PE文件目录项的函数 
		 return TRUE;
		}
	//标准控件走这;
	case WM_COMMAND:
		{
		switch(LOWORD(wParam))
		 {
		 case IDCANCEL://窗口上的X键消息
			 { 
			 DestroyWindow(hwndDLg); 
			 hCatalog=NULL;
			 SendMessage(hPe,WM_SETFOCUS,0,0);//激活窗口 参数1是需激活的窗口句柄
			 return TRUE;
			 }
		 case IDC_BUTTON_CATALOG_EXPORT:
			 {
			 Enumport(1);
			 
			 return TRUE;
			 }
         case IDC_BUTTON_CATALOG_IMPORT:
			 {
			 Enumport(2);
			 return TRUE;
			 }
		 case IDC_BUTTON_CATALOG_RESOURCE:
			 {
			 Enumport(3);
			 return TRUE;
			 }
		 case IDC_BUTTON_CATALOG_RELOCATION:
			 {
				 Enumport(4);
			 
				 return TRUE;
			 }
		 case IDC_BUTTON_CATALOG_IMPORTDES:
			 {
			 Enumport(5);
			 return TRUE;
			 }
		 case IDC_BUTTON_CATALOG_IAT:
			 {
			 Enumport(6);
			 return TRUE;
			 }
			 break;
		}
		}
	     break;

	}




	return FALSE;//其余消息全部走这里出去

}

//PE查看信息窗口回调事件处理函数
BOOL CALLBACK wndproc_MINUTE(
	                    HWND hwndDLg,
						UINT uMsg,
						WPARAM wParam,
						LPARAM lParam
						)
{
	hMinute=hwndDLg;
	switch(uMsg)
	{
		
	    
	case WM_INITDIALOG: //窗口创建完成在显示前会发送一条这种消息
		{
		 //在这里需要加入LIST_CROTROL_PROCESS和LIST_CROTORL_MOUDLE 的行与列;初始化函数
		 HICON hIcon;
		 hIcon=LoadIcon(hINSTANCE,MAKEINTRESOURCE(IDI_ICON1));//加载图标资源,这步还没显示
		 SendMessage(hwndDLg,WM_SETICON,ICON_BIG,(DWORD)hIcon);//发送消息显示大图标
		 SendMessage(hwndDLg,WM_SETICON,ICON_SMALL,(DWORD)hIcon);//发送消息显示小图标
		 Getmport();

		 //在这里加入遍历表里面详细信息的函数 


		 return TRUE;
		}
	//标准控件走这;
	case WM_COMMAND:
		{
		switch(LOWORD(wParam))
		 {
		 case IDCANCEL://窗口上的X键消息
			 { 
			 DestroyWindow(hwndDLg); 
			 hMinute=NULL;
			 hListuse=0;
			 SendMessage(hCatalog,WM_SETFOCUS,0,0);//激活窗口 参数1是需激活的窗口句柄
			 return TRUE;
			 }
			break; 
		}
		}
	case WM_SETFOCUS://当窗口被激活时调用遍历各种表的函数
		{
			Getmport();
		 
	       return FALSE;//返回未处理让系统显示窗口
		}
     break;
	}




	return FALSE;//其余消息全部走这里出去

}

BOOL Enumport(int c)
{
	mEnumport=c;
	if (hMinute==0)//等于0证明详细窗口还未创建
	{
		DialogBox(hINSTANCE,LPCTSTR(IDD_DIALOG_MINUTE),NULL,wndproc_MINUTE);//弹出详细窗口
		return TRUE;
	}

	SendMessage(hMinute,WM_SETFOCUS,0,0);//激活窗口
	return TRUE;
}


   //ascii转成unicode字符串
  //参数1是ascii字符串指针,参数2是接收转换后字符串的缓冲区指针,参数3接收的缓冲区大小;
   BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
  {
    // 获取接收Unicode字符串的缓冲区的所需大小。
    DWORD dwMinSize;
    dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);
 
    //如果获取到所需缓冲区大小比参数3接收缓冲区大小大则不转 直接返回 
    if(dwSize < dwMinSize)
    {  
     return FALSE;
    }
    // 将ascii字符串转换成unicode字符串
    MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);  
    return TRUE;
  }
 
     //参数1是需转换unicode字符串指针,参数2是接收ascii字符串缓冲区指针,参数3是接收缓冲区的大小;
  BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)
  {
   DWORD dwMinSize;
   //获取需求接收缓冲区的大小
   dwMinSize = WideCharToMultiByte(CP_ACP,0,lpcwszStr,-1,NULL,0,NULL,0);
   if(dwSize < dwMinSize)//如果需要缓冲区比接收缓冲区大则返回
   {
    return FALSE;
   }
   //转换函数
   WideCharToMultiByte(CP_ACP,0,lpcwszStr,-1,lpszStr,dwSize,NULL,NULL);
   return TRUE;
  }

  //遍历可选PE头里面16个表的目录项将其显示在目录项窗口
  BOOL EnumCatalog(HWND hwndDLg)
  {
	  if (pFileName[0]==0)
	  {
		  MessageBox(0,TEXT("文件路径丢失,无法读取信息"),TEXT("Error"),MB_OK);
		  return FALSE;
	  }
	 TCHAR  str[0x10]={0};
     char* a=NULL;
	 char* b=NULL;
	 DWORD c=0;
	 DWORD c1=0;
	 FILE* A=NULL;
	 PE    B;
	 //变量定义区
	 HWND hEditexport1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_EXPORT_RVA);
	 HWND hEditexport2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_EXPORT_FOA);//导出表
	 HWND hEditexport3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_EXPORT_SIZE);
	
	 HWND hEditimport1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IMPORT_RVA);
	 HWND hEditimport2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IMPORT_FOA);//导入表
	 HWND hEditimport3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IMPORT_SIZE);
	
	 HWND hEditresport1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_RESOURCE_RVA);
	 HWND hEditresport2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_RESOURCE_FOA);//资源表
	 HWND hEditresport3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_RESOURCE_SIZE);

	 HWND hEditexceport1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_EXCEPTION_RVA);
	 HWND hEditexceport2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_EXCEPTION_FOA);//异常表
	 HWND hEditexceport3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_EXCEPTION_SIZE);

	 HWND hEditsafeport1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_SAFEPORT_RVA);
	 HWND hEditsafeport2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_SAFEPORT_FOA);//安全表
	 HWND hEditsafeport3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_SAFEPORT_SIZE);

	 HWND hEditrecport1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_RELOCATION_RVA);
	 HWND hEditrecport2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_RELOCATION_FOA);//重定位表
	 HWND hEditrecport3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_RELOCATION_SIZE);

	 HWND hEditdeport1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_DEBUG_RVA);
	 HWND hEditdeport2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_DEBUG_FOA);//调试表
	 HWND hEditdeport3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_DEBUG_SIZE);

	 HWND hEditcopport1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_COPYRIGHT_RVA);
	 HWND hEditcopport2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_COPYRIGHT_FOA);//版权表
	 HWND hEditcopport3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_COPYRIGHT_SIZE);

	 HWND hEditgobport1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_GLOBALPT_RVA);
	 HWND hEditgobport2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_GLOBALPT_FOA);//全局指针
	 HWND hEditgobport3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_GLOBALPT_SIZE);

	 HWND hEdittlsport1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_TLSPORT_RVA);
	 HWND hEdittlsport2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_TLSPORT_FOA);//TLS
	 HWND hEdittlsport3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_TLSPORT_SIZE);

	 HWND hEditimporttool1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IMPORTTOOL_RVA);
	 HWND hEditimporttool2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IMPORTTOOL_FOA);//导入配置
	 HWND hEditimporttool3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IMPORTTOOL_SIZE);

	 HWND hEditimportdes1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IMPORTDES_RVA);
	 HWND hEditimportdes2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IMPORTDES_FOA);//绑定导入
	 HWND hEditimportdes3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IMPORTDES_SIZE);

	 HWND hEditIATport1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IATPORT_RVA);
	 HWND hEditIATport2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IATPORT_FOA);//IAT表
	 HWND hEditIATport3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IATPORT_SIZE);

	 HWND hEditimportdea1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IMPORTDEA_RVA);
	 HWND hEditimportdea2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IMPORTDEA_FOA);//延迟导入
	 HWND hEditimportdea3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_IMPORTDEA_SIZE);


	 HWND hEditcomport1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_COMPORT_RVA);
	 HWND hEditcomport2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_COMPORT_FOA);//COM
	 HWND hEditcomport3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_COMPORT_SIZE);

	 HWND hEditreserve1=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_RESERVE_RVA);
	 HWND hEditreserve2=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_RESERVE_FOA);//保留
	 HWND hEditreserve3=GetDlgItem(hwndDLg,IDC_EDIT_CATALOG_RESERVE_SIZE);
    //-----------------------↑获取编辑框句柄--------------------------------------
	 c=longfile(pFileName);
	 if (c==0)
	 {
		 return  FALSE;
	 
	 
	 }
	 a=(char*)malloc(sizeof(char)*c);
	 memset(a,0,c);
	 A=fopen(pFileName,"rb");
	 fread(a,sizeof(char),c,A);
	 fclose(A);
	 B.getdata(a,0);
	 if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditexport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditexport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditexport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditexport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditexport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditexport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	  B.getdata(a,1);
	   if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditimport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditimport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditimport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditimport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditimport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditimport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	   B.getdata(a,2);
	   if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditresport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditresport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditresport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditresport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditresport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditresport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	    B.getdata(a,3);
		if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditexceport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditexceport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditexceport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditexceport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditexceport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditexceport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	  B.getdata(a,4);
	 if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditsafeport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditsafeport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditsafeport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditsafeport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditsafeport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditsafeport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	 B.getdata(a,5);
	 if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditrecport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditrecport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditrecport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditrecport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditrecport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditrecport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }

	 B.getdata(a,6);
	 if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditdeport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditdeport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditdeport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditdeport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditdeport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditdeport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	 B.getdata(a,7);
	  if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditcopport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditcopport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditcopport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditcopport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditcopport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditcopport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	 B.getdata(a,8);
	 if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditgobport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditgobport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditgobport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditgobport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditgobport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditgobport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	 B.getdata(a,9);
	 if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEdittlsport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEdittlsport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEdittlsport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEdittlsport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEdittlsport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEdittlsport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	 B.getdata(a,10);
	 if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditimporttool1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditimporttool2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditimporttool3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditimporttool1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditimporttool3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditimporttool2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	 B.getdata(a,11);
	if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditimportdes1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditimportdes2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditimportdes3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditimportdes1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditimportdes3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditimportdes2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	 B.getdata(a,12);
	 if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditIATport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditIATport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditIATport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditIATport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditIATport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditIATport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	 B.getdata(a,13);
	 if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditimportdea1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditimportdea2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditimportdea3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditimportdea1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditimportdea3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditimportdea2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	  B.getdata(a,14);
	  if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditcomport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditcomport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditcomport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditcomport1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditcomport3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditcomport2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
	 }
	 B.getdata(a,15);
	 if(B.DataDirectory->VirtualAddress==0)
	 {
		 str[0]=L'无';
	   SendMessage(hEditreserve1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditreserve2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	   SendMessage(hEditreserve3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 }else
	 {
		 ConvertUNICODE(B.DataDirectory->VirtualAddress,str);
		 SendMessage(hEditreserve1,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 ConvertUNICODE(B.DataDirectory->SIZE,str);
		 SendMessage(hEditreserve3,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
		 memset(str,0,0x10);
		 c1=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);
		 ConvertUNICODE(c1,str);
		 SendMessage(hEditreserve2,WM_SETTEXT,0,(LPARAM)str);//这是文本内容写入文本编辑框;
	 
	 }

	 free(a);
	 return TRUE;
  }
  BOOL SetEditzero(void)//设置详细窗口上编辑框的内容为空
  {
	  if(hListuse==0)
	  {
		  if(hMinute!=0)
		  {
		  hListuse=GetDlgItem(hMinute,IDC_LIST_DIALOG_MINUTE);
		  }else
		  {
		    return FALSE;
		  
		  }
	  }
     SendMessage(hListuse, LVM_DELETEALLITEMS, 0, 0);//删除所有行
	 return TRUE;
  
  }

  //遍历导出表 函数地址表 ,序号表,函数名称表的值;
BOOL Enumexport(void)
{
	if(pFileName[0]==0)
	{
		MessageBox(0,TEXT("文件路径错误请从新打开文件"),TEXT("Error"),MB_OK);
		return FALSE;
	}
	SetEditzero();//将编辑框置0;
	Str_s=(TCHAR*)malloc(sizeof(TCHAR)*0x100);
	memset(Str_s,0,sizeof(TCHAR)*0x100);
	TCHAR m_str[80]={0};
	FILE* A=NULL;
	char* a=NULL;
	DWORD c=0;
	DWORD c1=0;
	
	memset(&m_lv,0,sizeof(LV_COLUMN));
	memset(&m_mlv,0,sizeof(LV_ITEM));
	m_mlv.mask=LVIF_TEXT;
	m_lv.mask=LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	m_hang=0;
	PE   B;  //PE头结构
	export_table B1;//导出表结构
	c=longfile(pFileName);
	if(c==0)
	{
		MessageBox(0,TEXT("文件错误,无法打开!"),TEXT("Error"),MB_OK);
		return FALSE;
	}
	m_lv.pszText=TEXT("导出表详情");//表头标题
	m_lv.cx=580;//列宽
	m_lv.iSubItem=0;//第几列
	SendMessage(hListuse,LVM_INSERTCOLUMN,0,(DWORD)&m_lv);//设置表头标题

	m_mlv.pszText=Str_1;//这是导出表第一行字符
	m_mlv.iItem=m_hang;//这是行的下标
	m_mlv.iSubItem=0;
	m_hang  ;
	SendMessage(hListuse,LVM_INSERTITEM,0,(DWORD)&m_mlv);

	a=(char*)malloc(sizeof(char)*c);//动态申请堆中内存读取文件filebuff
	memset(a,0,c);//写0
	A=fopen(pFileName,"rb");
	fread(a,sizeof(char),c,A);
	fclose(A);
	B.getdata(a,0);
	c=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);//将导出表rva地址转换成foa地址
	B1.getdata(&a[c]);//初始化导出表成员的值
	
	//将导出表成员的值输出出来;
	//第一个 模块名 :成员name
	Str_cat(Str_s,Str_Name); //成员名
	ConvertUNICODE(B1.Name,m_str);
	Str_cat(Str_s,m_str);
	memset(m_str,0,160);
	Str_cat(Str_s,Str_h);
	//得到模块名;
	c=RVA_FOA(B1.Name,a,0);
	
	MByteToWChar(&a[c],m_str,80);
	Str_cat(Str_s,m_str);
	memset(m_str,0,160);
	expListText(hListuse,Str_s);
	
	//第二个 base 起始序号;
	memset(Str_s,0,200);
	Str_cat(Str_s,Str_Base); 
	ConvertUNICODE(B1.Base,m_str);
	Str_cat(Str_s,m_str);
	memset(m_str,0,160);
	Str_cat(Str_s,Str_h);
	
	//输出到列表框封装函数
	expListText(hListuse,Str_s);

	//第三个 NumberOfFunctions 所有导出函数个数;
	memset(Str_s,0,200);//写0
	Str_cat(Str_s,Str_NumberOfFunctions); //拼接成员名字
	ConvertUNICODE(B1.NumberOfFunctions,m_str);//转换数字成unicode
	Str_cat(Str_s,m_str);//拼接 数字转换后的字符串
	memset(m_str,0,160);//用完将缓冲区写0
	Str_cat(Str_s,Str_h);//拼接中间空格部分字符串
	//输出到列表框封装函数
	expListText(hListuse,Str_s);

	//第四个 NumberOfNames 所有以名字导出函数个数;
	memset(Str_s,0,200);//写0
	Str_cat(Str_s,Str_NumberOfNames); //拼接成员名字
	ConvertUNICODE(B1.NumberOfNames,m_str);//转换数字成unicode
	Str_cat(Str_s,m_str);//拼接 数字转换后的字符串
	memset(m_str,0,160);//用完将缓冲区写0
	Str_cat(Str_s,Str_h);//拼接中间空格部分字符串
	//输出到列表框封装函数
	expListText(hListuse,Str_s);

	//第五个 AddressOfFunctions 所有以名字导出函数个数;
	memset(Str_s,0,200);//写0
	Str_cat(Str_s,Str_AddressOfFunctions); //拼接成员名字
	ConvertUNICODE(B1.AddressOfFunctions,m_str);//转换数字成unicode
	Str_cat(Str_s,m_str);//拼接 数字转换后的字符串
	memset(m_str,0,160);//用完将缓冲区写0
	Str_cat(Str_s,Str_h);//拼接中间空格部分字符串
	//输出到列表框封装函数
	expListText(hListuse,Str_s);
	
	//第六个 AddressOfNames 所有以名字导出函数个数;
	memset(Str_s,0,200);//写0
	Str_cat(Str_s,Str_AddressOfNames); //拼接成员名字
	ConvertUNICODE(B1.AddressOfNames,m_str);//转换数字成unicode
	Str_cat(Str_s,m_str);//拼接 数字转换后的字符串
	memset(m_str,0,160);//用完将缓冲区写0
	Str_cat(Str_s,Str_h);//拼接中间空格部分字符串
	//输出到列表框封装函数
	expListText(hListuse,Str_s);
	
	//第七个 AddressOfNameOrdinals 所有以名字导出函数个数;
	memset(Str_s,0,200);//写0
	Str_cat(Str_s,Str_AddressOfNameOrdinals); //拼接成员名字
	ConvertUNICODE(B1.AddressOfNameOrdinals,m_str);//转换数字成unicode
	Str_cat(Str_s,m_str);//拼接 数字转换后的字符串
	memset(m_str,0,160);//用完将缓冲区写0
	Str_cat(Str_s,Str_h);//拼接中间空格部分字符串
	//输出到列表框封装函数
	expListText(hListuse,Str_s);
	//第八个 AddressOfNameOrdinals 所有以名字导出函数个数;
	memset(Str_s,0,200);//写0
	Str_cat(Str_s,Str_TimeDateStamp); //拼接成员名字
	ConvertUNICODE(B1.TimeDateStamp,m_str);//转换数字成unicode
	Str_cat(Str_s,m_str);//拼接 数字转换后的字符串
	memset(m_str,0,160);//用完将缓冲区写0
	Str_cat(Str_s,Str_h);//拼接中间空格部分字符串
	//输出到列表框封装函数
	expListText(hListuse,Str_s);
	

	expListText(hListuse,Str_h);
	expListText(hListuse,Str_h);
	expListText(hListuse,Str_h);
	expListText(hListuse,Str_n);
	expListText(hListuse,Str_h);
	expListText(hListuse,Str_h);
	//遍历导出函数地址表 应该是名字 加序号加地址 再输出
    expListText(hListuse,Str_EXaddress);
	expListText(hListuse,Str_h);
	c=RVA_FOA(B1.AddressOfFunctions,a,0);
	DWORD* C=(DWORD*)&a[c];
	WORD*  C1=NULL;
	WORD*  C2=NULL;
	DWORD* C3=NULL;
	DWORD* C5=NULL;
	char*  C4=NULL;
	C1=(WORD*)&a[RVA_FOA(B1.AddressOfNameOrdinals,a,0)];
	C3=(DWORD*)&a[RVA_FOA(B1.AddressOfNames,a,0)];
	C5=C3;
	int i=0;
	int i2=0;
	int i3=0;
	int i5=0;
	int i1=0;
	int i4=0;
	i2=B1.NumberOfFunctions;
	i5=i2;
	
	while(i2)
	{
		if(*C==0)
		{
		  C=C 1;
		  i2--;
	      i  ;//导出函数地址表下标
		  continue;
		
		}
		C2=C1;
		//遍历所有序号表找出函数地址表的下标
	    i1=0;
		i3=i5;
		while(i3)
		  {
			  if(*C2==i)
			  {
				  i4=0;
			    break;
			  
			  }else
			  {
				  i4=-1;
			     i1  ;
			  }
			  C2=C2 1;//指向序号表下一个序号
		      i3--;
		  }
		
	    if (i4==0)
		{
			C3=C5 i1;
			C4=(char*)&a[RVA_FOA(*C3,a,0)];//得到名字在foa地址首地址
			memset(Str_s,0,200);
			MByteToWChar(C4,Str_s,100);
		}else
		{
		  memset(Str_s,0,200);
		  Str_cat(Str_s,Str_h3);
		
		}
		Str_cat(Str_s,Str_h1);
		//函数名字拼好了,再拼序号
		ConvertUNICODE(i1 B1.Base,m_str);
		Str_cat(Str_s,m_str);
		memset(m_str,0,160);
		Str_cat(Str_s,Str_h2);
		
		//拼接函数地址
		ConvertUNICODE(*C,m_str);
		Str_cat(Str_s,m_str);
		memset(m_str,0,160);
		expListText(hListuse,Str_s);

		expListText(hListuse,Str_h);
		//拼接空格

	  C=C 1;
	  i2--;
	  i  ;//导出函数地址表下标
	}


	free(Str_s);
	free(a);
	return TRUE;
}

BOOL Enumimport(void)//遍历导入表信息
{
	if(pFileName[0]==0)
	{
		MessageBox(0,TEXT("文件路径错误请从新打开文件"),TEXT("Error"),MB_OK);
		return FALSE;
	}
	SetEditzero();//将编辑框置0;
	Str_s=(TCHAR*)malloc(sizeof(TCHAR)*0x100);
	memset(Str_s,0,sizeof(TCHAR)*0x100);
	TCHAR m_str[80]={0};
	FILE* A=NULL;
	char* a=NULL;
	DWORD c=0;
	DWORD c1=0;
	DWORD c2=0;
	DWORD c3=0;
	DWORD* C=NULL;
	char*  C1=NULL;
	unsigned int C2;
	memset(&m_lv,0,sizeof(LV_COLUMN));
	memset(&m_mlv,0,sizeof(LV_ITEM));
	m_mlv.mask=LVIF_TEXT;
	m_lv.mask=LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	m_hang=0;
	PE   B;  //PE头结构
	import_table* B1;//导出表结构
	c=longfile(pFileName);
	if(c==0)
	{
		MessageBox(0,TEXT("文件错误,无法打开!"),TEXT("Error"),MB_OK);
		return FALSE;
	}
	m_lv.pszText=TEXT("导入表详情");//表头标题
	m_lv.cx=580;//列宽
	m_lv.iSubItem=0;//第几列
	SendMessage(hListuse,LVM_INSERTCOLUMN,0,(DWORD)&m_lv);//设置表头标题

	m_mlv.pszText=Str_2;//这是导入表第一行字符
	m_mlv.iItem=m_hang;//这是行的下标
	m_mlv.iSubItem=0;
	m_hang  ;
	SendMessage(hListuse,LVM_INSERTITEM,0,(DWORD)&m_mlv);

	a=(char*)malloc(sizeof(char)*c);//动态申请堆中内存读取文件filebuff
	memset(a,0,c);//写0
	A=fopen(pFileName,"rb");
	fread(a,sizeof(char),c,A);
	fclose(A);
	B.getdata(a,1);//第二个是导入表
	c=RVA_FOA(B.DataDirectory->VirtualAddress,a,0);//将导出表rva地址转换成foa地址
	//得到首个导入表首地址
	B1=(import_table*)&a[c];//
	int i=0;
	while(B1->Name)
	{
		
		c=RVA_FOA(B1->Name,a,0);
		memset(m_str,0,160);
		MByteToWChar(&a[c],m_str,80);
		Str_cat(Str_s,Str_module);
		Str_cat(Str_s,m_str);
		expListText(hListuse,Str_s);//将模块名输出后输出各成员的值
		expListText(hListuse,Str_h);

			//第1个 OriginalFirstThunk 所有以名字导出函数个数;
		memset(Str_s,0,200);//写0
		memset(m_str,0,160);//用完将缓冲区写0
		Str_cat(Str_s,Str_OriginalFirstThunk); //拼接成员名字
		ConvertUNICODE(B1->OriginalFirstThunk,m_str);//转换数字成unicode
		Str_cat(Str_s,m_str);//拼接 数字转换后的字符串
		memset(m_str,0,160);//用完将缓冲区写0
		Str_cat(Str_s,Str_h);//拼接中间空格部分字符串
		expListText(hListuse,Str_s);//输出字符串
	    	//第2个 TimeDateStamp 所有以名字导出函数个数;
		memset(Str_s,0,200);//写0
		Str_cat(Str_s,Str_TimeDateStamp); //拼接成员名字
		ConvertUNICODE(B1->TimeDateStamp,m_str);//转换数字成unicode
		Str_cat(Str_s,m_str);//拼接 数字转换后的字符串
		memset(m_str,0,160);//用完将缓冲区写0
		Str_cat(Str_s,Str_h);//拼接中间空格部分字符串
		expListText(hListuse,Str_s);//输出字符串
	    
		 	//第3个 Name 所有以名字导出函数个数;
		memset(Str_s,0,200);//写0
		Str_cat(Str_s,Str_Name); //拼接成员名字
		ConvertUNICODE(B1->Name,m_str);//转换数字成unicode
		Str_cat(Str_s,m_str);//拼接 数字转换后的字符串
		memset(m_str,0,160);//用完将缓冲区写0
		Str_cat(Str_s,Str_h);//拼接中间空格部分字符串
		expListText(hListuse,Str_s);//输出字符串

		 	//第4个 FirstThunk 所有以名字导出函数个数;
		memset(Str_s,0,200);//写0
		Str_cat(Str_s,Str_FirstThunk); //拼接成员名字
		ConvertUNICODE(B1->FirstThunk,m_str);//转换数字成unicode
		Str_cat(Str_s,m_str);//拼接 数字转换后的字符串
		memset(m_str,0,160);//用完将缓冲区写0
		Str_cat(Str_s,Str_h);//拼接中间空格部分字符串
		expListText(hListuse,Str_s);//输出字符串
		expListText(hListuse,Str_h);//输出字符串
		expListText(hListuse,Str_n2);//输出字符串
		expListText(hListuse,Str_h);//输出字符串
		expListText(hListuse,Str_h);//输出字符串

		//所有成员输出后;输出该模块所有函数的名字及IAT地址
		//得到int地址表首地址 判断int地址表里面的值最高位是否为1
		C=(DWORD*)&a[RVA_FOA(B1->OriginalFirstThunk,a,0)];
		while(*C)
		{
			c1=*C;
			C2=c1;
			C2=C2>>31; 
			memset(Str_s,0,200);//用完将缓冲区写0
			if(C2==1)//表明是序号
			{
			   C2=c1;
			   C2=C2>>1;
			  //得到序号输出

				ConvertUNICODE(C2,m_str);
				Str_cat(Str_s,m_str);//拼接 数字转换后的字符串
				memset(m_str,0,160);//用完将缓冲区写0

			}else
			{
				
				C1=&a[RVA_FOA(c1,a,0)];


				C1=C1 2;
				
				MByteToWChar(C1,m_str,80);
				Str_cat(Str_s,m_str);//得到函数名字
				memset(m_str,0,160);//用完将缓冲区写0
		
		
		
			}
		  
			Str_cat(Str_s,Str_h3);//得到函数名字
			Str_cat(Str_s,Str_IATaddr);//得到函数名字
			c=B1->FirstThunk i*4;
			ConvertUNICODE(c,m_str);
			Str_cat(Str_s,m_str);//得到IAT表地址
			 memset(m_str,0,160);//用完将缓冲区写0
			 expListText(hListuse,Str_s);//输出字符串
			 expListText(hListuse,Str_h);//输出字符串

			C=C 1;//指向INT表下一个下标
			i  ;
		}
		memset(Str_s,0,200);//用完将缓冲区写0
      expListText(hListuse,Str_h);//输出字符串
	  expListText(hListuse,Str_h);//输出字符串
	  expListText(hListuse,Str_n);//输出字符串
	  expListText(hListuse,Str_h);//输出字符串
	  expListText(hListuse,Str_h);//输出字符串
	 B1=B1 1;//指向下一个导入表
	}



}


//	调用遍历表的函数
BOOL Getmport(void)
{
	switch(mEnumport)
	{
		case 1:
				Enumexport();//遍历导出表
				mEnumport=0;
				return TRUE;

		case 2:
				{//MessageBox(0,TEXT("这回对了吧2"),0,MB_OK);
				Enumimport();
				mEnumport=0;
				return TRUE;
				}
		case 3:
			{	
			//MessageBox(0,TEXT("这回对了吧3"),0,MB_OK);
				mEnumport=0;
				return TRUE;
				
			}
		case 4:
			{
			//MessageBox(0,TEXT("这回对了吧4"),0,MB_OK);
				mEnumport=0;
				return TRUE;
				
			}
		case 5:
			{
		        //MessageBox(0,TEXT("这回对了吧5"),0,MB_OK);
				mEnumport=0;
				return TRUE;
				
			}
		case 6:
			{
				//MessageBox(0,TEXT("这回对了吧6"),0,MB_OK);
				mEnumport=0;
				return TRUE;
			}
				break;
	}


	return TRUE;

}
//将unicode输出到列表框中显示
BOOL expListText(HWND hwndlist,TCHAR* a)//参数1需输出列表框句柄,参数2 unicode字符串;
{
	
	TCHAR* b=NULL;
	if(hwndlist==0)
	{
		return FALSE;
	}
	int len=WideCharToMultiByte(CP_ACP,0,a,-1,NULL,0,NULL,NULL);
	if(len>96)
	{
		b=(TCHAR*)malloc(sizeof(TCHAR)*50);
		memset(b,0,100);
	    memcpy(b,a,94);
		m_mlv.pszText=b;
		m_mlv.iItem=m_hang;
		m_hang  ;
		SendMessage(hwndlist,LVM_INSERTITEM,0,(DWORD)&m_mlv);
		free(b);
		b=a 47;
        expListText(hwndlist,b);
	}else
	{
		m_mlv.pszText=a;
		m_mlv.iItem=m_hang;
		m_hang  ;
		SendMessage(hwndlist,LVM_INSERTITEM,0,(DWORD)&m_mlv);
	}

 return TRUE;
}
//字符串拼接程序
BOOL Str_cat(TCHAR* a,TCHAR* b)//字符串拼接 将b的unicode字符串拼接到a字符串里面
{
	if ((a==0)|(b==0))
	{
		return FALSE;
	}
	if(b[0]==0)
	{
	  return FALSE;
	
	}
	int i=0;
	int i1=0;
	short a1=0;
	while(a[i])
	{
		i  ;
	}
	while(b[i1])
	{
		a[i]=b[i1];
		i  ;
		i1  ;
	}
	a[i 1]=0;
	return TRUE;
}

【核心代码】

标签: pe 解析 实例

实例下载地址

滴水三期PE解析实例(Funtion.cpp)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警