Fport 源码

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

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的文章,实现可以参见我的源码。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航