首页
社区
课程
招聘
[原创]查找进程API内存地址的小程序
发表于: 2012-6-3 15:44 8408

[原创]查找进程API内存地址的小程序

2012-6-3 15:44
8408
最近几天学习PE格式,写了个这个查找进程API内存地址的小程序,算是对PE格式学习的总结。
原理很简单,先枚举系统中的所有进程,双击选择对应的进程后,再点击“查找API”,即可得到进程说用的API地址,除了系统API外,进程自带的Dll函数也可显示。
思路如下:
1、根据进程句柄查找其文件路径
2、载入进程的PE文件,查找输入表地址
3、根据输入表地址再遍历进程输入表,导出API名称及其地址,如果API无名称,则导出其函数序号

程序用汇编写的,很小,引用了几个库文件,大家OD一下就基本上是源文件

查询效果如图:


软件:
EnumAPI.zip

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 62
活跃值: (950)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
界面做得不好看,右面用列表控件整齐一些了。
2012-6-3 16:44
0
雪    币: 183
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
楼主附上源码啊!!! 顶一个!!
2012-6-3 17:05
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
4
遍历进程, 枚举导入表加载的模块然后调用下面我的这个函数就可以打印出API的地址了,

ULONG FindApiImportAddr ( ULONG  dwBaseImage, char* pModuleName, char* pFuncName )
{
	PIMAGE_DOS_HEADER pDosHeader;
	PIMAGE_NT_HEADERS  pNtHeader;
	PIMAGE_OPTIONAL_HEADER32  pOptionalHeader;
	PIMAGE_SECTION_HEADER  pSectionHeader;
	PIMAGE_THUNK_DATA pThunk, pIAT;
	PIMAGE_IMPORT_DESCRIPTOR pIID;
	ULONG  dwThunkValue = 0;
	ULONG   test;
	__asm int 3
	// 检查参数是否合法
	if ( 0==dwBaseImage || 0==pModuleName || 0==pFuncName )
		return 0 ;
	
	// pDosHeader指向DOS头结构
	pDosHeader = (PIMAGE_DOS_HEADER)dwBaseImage ;

	//pNtHeader指向PE文件头结构
	pNtHeader  = (PIMAGE_NT_HEADERS)(dwBaseImage + (pDosHeader->e_lfanew)) ;
	if ( 0 == pNtHeader )
		return 0;
	//pOptionalHeader指向可选头结构  
	pOptionalHeader = &(pNtHeader->OptionalHeader) ;
	if ( 0 == pOptionalHeader )
		return 0;	
	//pSectionHeader指向第一个段头部结构
	pSectionHeader = (PIMAGE_SECTION_HEADER)  
		((ULONG)pNtHeader + 0x18 + 
		pNtHeader->FileHeader.SizeOfOptionalHeader ) ;
	if ( 0 == pSectionHeader )
		return 0;	
	// 遍历导入表
	
	KdPrint(( "pOptionalHeader->DataDirectory[1].VirtualAddress@@@%X\n", pOptionalHeader->DataDirectory[1].VirtualAddress ));
	//pIID指向第一个导入DLL目录结构
	pIID = (PIMAGE_IMPORT_DESCRIPTOR) \
		(dwBaseImage + pOptionalHeader->DataDirectory[1].VirtualAddress ) ;

	__try {
		test = pIID->FirstThunk;
			} __except( GetExceptionCode() ) {
			return 0;
			}
	while ( pIID->FirstThunk )
	{
	
	__asm int 3
		// 找到指定的DLL导入目录
		if ( strcmp ( (char*)(dwBaseImage+pIID->Name), pModuleName ) )
		{
			pIID++ ;
			continue ;
		}
		//pIAT指向该导入DLL的IAT表
		pIAT = (PIMAGE_THUNK_DATA)( dwBaseImage + pIID->FirstThunk ) ;
		
		//pThunk指向INT表导入(即导入名称表)
		if ( pIID->OriginalFirstThunk )
			pThunk = (PIMAGE_THUNK_DATA)( dwBaseImage + 
			pIID->OriginalFirstThunk ) ;
		else
			pThunk = pIAT ; // pIAT在一开始时保存了名称表

		if ( 0 == pThunk )
			return 0;

		// 遍历IAT
		//dwThunkValue存放原始的IAT表中函数的虚拟地址
		while ( ( dwThunkValue = *((ULONG*)pThunk) ) != 0 )
		{
			if ( ( dwThunkValue & IMAGE_ORDINAL_FLAG32 ) == 0 )
			{
				// 寻找指定的函数在IAT表中的项
				if ( strcmp ( (char*)  (dwBaseImage+dwThunkValue + 2 ), 
					pFuncName ) == 0 )
				{
					return (ULONG)pIAT ;
				}
			}
			
			pThunk ++ ;
			pIAT ++ ;
		}
		
		pIID ++ ;
	}

	return 0 ;
}
2012-6-3 18:19
0
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
太空步滑过咯~~~~~~~~~~~~~~~~ 咦哈~
2012-6-3 20:00
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
有用的就要顶一下
2012-6-3 21:17
0
雪    币: 4902
活跃值: (120)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不错不错哈……
2012-6-3 21:21
0
游客
登录 | 注册 方可回帖
返回
//