WEB开发网
开发学院软件开发VC Fport 源码 阅读

Fport 源码

 2006-07-20 11:38:46 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 很多人都知道端口到进程映射的一个免费工具FoundStone的Fport,可惜他不提供源码,Fport 源码,我试着能从其二进制文件中找出一些信息,大致知道他使用了些未公开函数 ,我加上了一个Pid到程序名的转换函数:ProcessPidToName,具体程序思路依照ilsy的文章,诸

本文示例源代码或素材下载

很多人都知道端口到进程映射的一个免费工具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的文章,实现可以参见我的源码。

Tags:Fport 源码

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接