中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 系统
Fport 源码
作者:未知 时间:2005-07-20 14:20 出处:VC知识库 责编:chinaitpower
              摘要:Fport 源码

Fport 源码


作者:Phiger

下载源代码


  很多人都知道端口到进程映射的一个免费工具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的文章,实现可以参见我的源码。
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有