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的文章,實現可以參見我的源碼。