Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9548490
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-04-23 21:43:33

Fport 源码


作者:




  很多人都知道端口到进程映射的一个免费工具FoundStone的Fport,可惜他不提供源码,我试着能从其二进制文件中找出一些信息,大致知道他使用了些未公开函数 ,诸如: ZwOpenSection,ZwQuerySystemInformation... 但仅此之比较难弄懂其原理的。我的这个源码,得助于ilsy的名为《再谈进程与端口的映射》的文章 ,但他也没有提供源码,但已经将Fport的原理讲的很清楚了,在此我只是用源码将其实现了一下。在具体实现上与其有点不同,具体的原理可以参见ilsy的文章。

主要修改是GetPTE,我发现ilsy的GetPTE有时会不对,修改如下:

BOOL GetPTE(PVOID objAddress, HANDLE hMapPhysicalMemory, HANDLE hSection, PTE& pte)

{

    DWORD dwPhysMemBuf = (DWORD)hMapPhysicalMemory, dwAddress = (DWORD)objAddress;

    LPVOID pNewMapPhy  = NULL;

	DWORD dwNewAddress = *((LPDWORD)(dwPhysMemBuf   (dwAddress >> 0x16) * 4));

	if ((dwNewAddress & 0x000000ff) < 0x01)

	{

		return FALSE;

	}

	if ((dwNewAddress & 0x000000ff) < 0x80)

	{

		pNewMapPhy = MapViewOfFile(hSection, 

		                           4, 

		                           0, 

		                           dwNewAddress & 0xFFFFF000, 

		                           0x1000);

		dwNewAddress = (dwAddress >> 0x0c) & 0x3ff; 

		dwNewAddress = *((LPDWORD)((DWORD)pNewMapPhy   

		                            4 * dwNewAddress)) & 0xFFFFF000;

		UnmapViewOfFile(pNewMapPhy);

		pNewMapPhy = NULL;

	}

	else

	{

		dwNewAddress = (dwNewAddress & 0xFFFFF000)   (dwAddress & 0x003ff000);

	}

	pNewMapPhy = MapViewOfFile(hSection, FILE_MAP_READ,

		0, dwNewAddress, 0x1000);

	if (pNewMapPhy == NULL) 

	{

		long lError = GetLastError();

		return FALSE;

	}

	else

	{

		memcpy(&pte, (char *)pNewMapPhy   (dwAddress & 0x00000FFF), sizeof(PTE));

	}

	UnmapViewOfFile(pNewMapPhy);

	return TRUE;

}      
  最后,我加上了一个Pid到程序名的转换函数:ProcessPidToName。具体程序思路依照ilsy的文章,实现可以参见我的源码。
阅读(398) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~