首页
社区
课程
招聘
[原创]PE编辑器之浅谈导入表信息的读取(附VC源程序)
发表于: 2008-7-27 20:33 13887

[原创]PE编辑器之浅谈导入表信息的读取(附VC源程序)

2008-7-27 20:33
13887

又好久没有发帖子了!今天我也来凑个热闹!
其实起这么一个标题真的让我感到很惭愧,因为读取导入表这里我学的真是一塌糊涂!
外加上最近不知道怎么了,个人头脑智商低下,看了挺多读取导入表的程序,还是没有弄明白怎么用一个指针把导入表中的所有信息都读出来!
无奈之下,想了一个最笨的方法:按照《加密与解密》(第二版)中导入表的实例的步骤,把各个指针的地址转换成文件偏移,然后在用CFile类从文件里面读出数据来!
虽然这个方法效率确实低下,在程序中实在不可取!但是无论怎么说,这也是我学习PE文件结构的一个见证!也是我经过近四天努力的结果,几经考虑,终于还是决定帖出来,让新手朋友参考,请高手指教!

好了,废话不说了,进入主题!
要读取导入表的信息需要知道:区段表、目录表还有地址偏移转换相关的东西!
怎么转换地址可以看我的另一个帖子:
http://bbs.pediy.com/showthread.php?t=67955

怎么读取区段和目录表不是这个帖子的主题,朋友们可以看其它相关的帖子文章或者看我附件中的源程序!

获取导入表的代码如下:

void CImportViewsDlg::GetImports(DWORD _Addr)
{
	CFileException     ex;

	CFile pFile;
	if (!pFile.Open(m_FilePathName,CFile::shareDenyNone|CFile::typeBinary,&ex))       
	{
		TCHAR     szError[1024];       
		ex.GetErrorMessage(szError,1024);
		MessageBox(szError); 
	}

	pFile.Seek(_Addr,CFile::begin);

	CString szTemp = "";
	m_DllList.DeleteAllItems();
	int i = 0;
	while ( 1 )
    {
		pFile.Read(&_Imports,sizeof(IMAGE_IMPORT_DESCRIPTOR));

        if((_Imports.TimeDateStamp==0 ) && (_Imports.Name==0) )
            break;
		szTemp = GetNames(RVAtoFileOffSet(_Imports.Name));
		m_DllList.InsertItem(i,szTemp);

		szTemp.Format("%p",_Imports.OriginalFirstThunk);
		m_DllList.SetItemText(i,1,szTemp);
		szTemp.Format("%p",_Imports.TimeDateStamp);
		m_DllList.SetItemText(i,2,szTemp);
		szTemp.Format("%p",_Imports.ForwarderChain);
		m_DllList.SetItemText(i,3,szTemp);
		szTemp.Format("%p",_Imports.FirstThunk);
		m_DllList.SetItemText(i,4,szTemp);
		i++;

	}
	pFile.Close();
}
CString CImportViewsDlg::GetNames(DWORD _Addr)
{
	CString Name = "";
	CString sTemp = "";
	CFileException     ex;
	CFile pFile;

	if (!pFile.Open(m_FilePathName,CFile::shareDenyNone|CFile::typeBinary,&ex))       
	{
		TCHAR     szError[1024];       
		ex.GetErrorMessage(szError,1024);
		MessageBox(szError);       
		return "";       
	}
	BYTE  fileBur;
	pFile.Seek(_Addr,CFile::begin);
	pFile.Read(&fileBur,0x1);
	sTemp.Format("%c",fileBur);
	Name += sTemp;
	for(int i=0;fileBur!=0;i++)
	{
		pFile.Read(&fileBur,0x1);
		sTemp.Format("%c",fileBur);
		Name += sTemp;
	}
	pFile.Close();
	return Name;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (13)
雪    币: 707
活跃值: (1301)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
2
不错!!....................
2008-7-27 20:51
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
3
谢谢分享~

2008-7-27 22:05
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持,感佩楼主孜孜以求的探索精神@
2008-7-27 22:19
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
顶一个
2008-7-27 22:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
支持楼主,我现在也是刚学PE, 向你学习!
2008-7-28 00:23
0
雪    币: 29249
活跃值: (7774)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
7
正在学习。。
2008-7-28 01:19
0
雪    币: 411
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不错。谢谢啦。
2008-8-25 13:08
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢分享,下载中,
2009-2-18 13:04
0
雪    币: 33
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习学习,谢谢分享!
2009-9-15 00:18
0
雪    币: 118
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习一下,!!
2010-8-10 13:55
0
雪    币: 357
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢分享了...
2011-3-28 14:15
0
雪    币: 563
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习!!!
2011-3-28 18:20
0
雪    币: 52
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
现在想做一个和输入表相关的程序,刚好可以借鉴楼主的程序。源码万岁
2011-11-9 10:01
0
游客
登录 | 注册 方可回帖
返回
//