Fport 源碼
作者:Phiger
源代碼
很多人都知道端口到進程映射的一個免費工具FoundStone的Fport,可惜他不提供源碼,我試著能從其二進制文件中找出一些信息,大致知道他使用了些未公開函數(shù) ,諸如: ZwOpenSection,ZwQuerySystemInformation... 但僅此之比較難弄懂其原理的。我的這個源碼,得助于ilsy的名為《再談進程與端口的映射》的文章 ,但他也沒有提供源碼,但已經將Fport的原理講的很清楚了,在此我只是用源碼將其實現(xiàn)了一下。在具體實現(xiàn)上與其有點不同,具體的原理可以參見ilsy的文章。
主要修改是GetPTE,我發(fā)現(xiàn)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到程序名的轉換函數(shù):ProcessPidToName。具體程序思路依照ilsy的文章,實現(xiàn)可以參見我的源碼。
posted on 2008-04-21 11:01
ViskerWong 閱讀(430)
評論(0) 編輯 收藏 引用