




已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
很多單機版的防火墻都是利用了的技術(shù)來實現(xiàn)對網(wǎng)絡(luò)封包的截獲處理當然也有結(jié)合及驅(qū)動的,不再本貼范圍內(nèi):),也可以通過技術(shù)實現(xiàn)無進程的木馬這里Winsock2 SPI的原理在這就不多說了,網(wǎng)上多得是以下僅為我前段時間學習技術(shù)時的寫的一些代碼,望大家一起來研究討論以下分別為wskfilter.dll及nfilter.exe的代碼,編譯成功后將兩個文件放在同一目錄下,下運行nfilter.exe便可以加載自己的(分層服務(wù)提供者)來截獲相關(guān)的調(diào)用了當然如何處理需要在wskfilter.dll中進行控制,在此不作詳述/wskfilter.dll by miyagi2007.5.21/wskfilter.cpp : Defines the entry point for the DLL application./ 開發(fā)思路:/ / 1)每個DLL都必須有一個入口點,故通過DllMain這個缺省函數(shù)做為入口函數(shù)。該函數(shù)負責/ DLL的初始化與結(jié)束的工作;/ 1.1)在DllMain中,通過GetModuleFileName獲取到當前調(diào)用該DLL的進程名稱,以備后需;/ 1.2)分別定義枚舉服務(wù)提供者函數(shù)GetProvider(),釋放服務(wù)提供者函數(shù)FreeProvider();/ / 2)通過g_NextProcTable中保存的下層服務(wù)提供者的函數(shù)列表,來Hook咸興趣的函數(shù),并將/ Hook的函數(shù)進行自定義處理,即實現(xiàn)了Winsock的過濾及監(jiān)控處理;/ 3)WSPStartup是LSP必須導出的函數(shù)。同時在創(chuàng)建DLL工程后,先向工程中添加一個.def文件。/ 即模塊定義文件,聲明所有要導出的函數(shù);/ 3.1)判斷WSPStartup函數(shù)是否被調(diào)用LSP(分層服務(wù)者)調(diào)用的;/ 3.2)枚舉各協(xié)議服務(wù)提供者,找到LSP下層協(xié)議服務(wù)提供者的WSAPROTOCOL_INFOW結(jié)構(gòu);/ 3.3)通過以上遍歷得到的下層服務(wù)提供者(現(xiàn)存放于NextProtocolInfo中)的GUID來確定其DLL/ 的路徑;/ 3.4)通過函數(shù)WSCGetProviderPath()獲取及ExpandEnvironmentStrings()擴展來得到下層服務(wù)/ 提供者的DLL;/ 路徑,該路徑是包含了環(huán)境變量的;/ 3.5)加載下層服務(wù)提供者,即加載其下載服務(wù)提供者的DLL;/ 3.6)通過自定義的一個指向WSPSTARTUP函數(shù)指針,來啟動下一層服務(wù)提供者;/ 3.7)調(diào)用下層服務(wù)提供者的WSPStartup函數(shù),調(diào)用成功后其中l(wèi)pProcTable變量將在后期進行/ Hook時經(jīng)常用到;/ 3.8)通過修改傳遞給下層服務(wù)提供者的函數(shù)列表,Hook相關(guān)WSP函數(shù);/#define UNICODE#define _UNICODE#include #include #include #include #include Debug.h#pragma comment(lib, Ws2_32.lib)WSPUPCALLTABLE g_UpCallTable; WSPPROC_TABLE g_NextProcTable; TCHAR g_szCurrentAppMAX_PATH; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )switch(ul_reason_for_call)/獲取調(diào)用wskfilter.dll的進程名稱;case DLL_PROCESS_ATTACH:GetModuleFileName(NULL,g_szCurrentApp,MAX_PATH);break; return TRUE;/枚舉各協(xié)議的服務(wù)提供者LPWSAPROTOCOL_INFOW GetProvider(LPINT lpnTotalProtocols)DWORD dwSize = 0;int nError;LPWSAPROTOCOL_INFOW pProtoInfo = NULL;/ 取得需要的長度,即通過將WSCEnumProtocols函數(shù)的dwSize參數(shù)置0進行第一次調(diào)用,后/以獲得枚舉服務(wù)提供者所需的緩沖區(qū)大小,置于dwSize變量中;if(:WSCEnumProtocols(NULL, pProtoInfo, &dwSize, &nError) = SOCKET_ERROR)if(nError != WSAENOBUFS)return NULL;/根據(jù)dwSize中的值來申請內(nèi)存空間;pProtoInfo = (LPWSAPROTOCOL_INFOW):GlobalAlloc(GPTR, dwSize);/第二次通過WSCEnumProtocols()正式枚舉到各服務(wù)提供者并存放于pProtoInfo(數(shù)組)中,/并將服務(wù)提供者的個數(shù)存到lpnTotalProtocols中;*lpnTotalProtocols = :WSCEnumProtocols(NULL, pProtoInfo, &dwSize, &nError);return pProtoInfo;void FreeProvider(LPWSAPROTOCOL_INFOW pProtoInfo)/釋放用于存放服務(wù)提供者數(shù)組的內(nèi)存空間,pProtoInfo;:GlobalFree(pProtoInfo);/通過g_NextProcTable中保存的下層服務(wù)提供者的函數(shù)列表,來Hook咸興趣的函數(shù),這里Hook的是/WSPSendToint WSPAPI WSPSendTo( SOCKETs, LPWSABUFlpBuffers, DWORDdwBufferCount, LPDWORDlpNumberOfBytesSent, DWORDdwFlags, const struct sockaddr FAR * lpTo, intiTolen, LPWSAOVERLAPPEDlpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPWSATHREADIDlpThreadId, LPINTlpErrno )ODS1(LFilter Winsock send to.%s,g_szCurrentApp);return 0;/return g_NextProcTable.lpWSPSendTo(s,lpBuffers,dwBufferCount,lpNumberOfBytesSent, /dwFlags,lpTo,iTolen,lpOverlapped,lpCompletionRoutine, /lpThreadId,lpErrno);int WSPAPI WSPStartup( WORD wVersionRequested, LPWSPDATA lpWSPData, LPWSAPROTOCOL_INFO lpProtocolInfo, WSPUPCALLTABLE UpcallTable, LPWSPPROC_TABLE lpProcTable )ODS1(L WSPStartup.%s,g_szCurrentApp);/判斷WSPStartup函數(shù)是否被調(diào)用LSP(分層服務(wù)者)調(diào)用的;if(lpProtocolInfo-ProtocolChain.ChainLenProtocolChain.ChainEntries1;for(int i=0;i=nTotalProtos)ODS(LWSPStartup: Can not find underlying protocol!n);return WSAEPROVIDERFAILEDINIT;/通過以上遍歷得到的下層服務(wù)提供者(現(xiàn)存放于NextProtocolInfo中)的GUID來確定其DLL路徑;int nError;TCHAR szBaseProviderDllMAX_PATH;int nLen=MAX_PATH;/故需要通過ExpandEnvironmentStrings()來擴展成絕對路徑;if(:WSCGetProviderPath(&NextProtocolInfo.ProviderId,szBaseProviderDll,&nLen,&nError)=SOCKET_ERROR)ODS1(LWSPStartup:WSCGetProviderPath() failed %dn,nError);return WSAEPROVIDERFAILEDINIT;if(!:ExpandEnvironmentStrings(szBaseProviderDll,szBaseProviderDll,MAX_PATH)ODS1(LWSPStartup: ExpandEnvironmentStrings() failed %d,:GetLastError();return WSAEPROVIDERFAILEDINIT;/通過上面已獲取到的DLL絕對路徑,來加載下層服務(wù)提供者,即加載其下載服務(wù)提供者的DLL;HMODULE hModule=:LoadLibrary(szBaseProviderDll);if(hModule=NULL)ODS1(LWSPStartup: LoadLibrary() failed %d,:GetLastError();return WSAEPROVIDERFAILEDINIT;/通過自定義的一個指向WSPSTARTUP函數(shù)指針,來啟動下一層服務(wù)提供者;LPWSPSTARTUP pfnWSPStartup=NULL;pfnWSPStartup=(LPWSPSTARTUP):GetProcAddress(hModule,WSPStartup);if(pfnWSPStartup=NULL)ODS1(LWSPStartup: GetProcAddress() failed %dn,:GetLastError();return WSAEPROVIDERFAILEDINIT;/調(diào)用下層服務(wù)提供者的WSPStartup函數(shù);LPWSAPROTOCOL_INFOW pInfo=lpProtocolInfo;if(NextProtocolInfo.ProtocolChain.ChainLen=BASE_PROTOCOL)pInfo=&NextProtocolInfo;/通過自定義的pfnWSPStartup()來調(diào)用下層服務(wù)提供者的WSPStartup函數(shù),調(diào)用成功后其中/lpProcTable變量將在后期進行Hook時經(jīng)常用到;int nRet=pfnWSPStartup(wVersionRequested,lpWSPData,pInfo,UpcallTable,lpProcTable);if(nRet!=ERROR_SUCCESS)ODS1(LWSPStartup: underlying providers WSPStartup() failed %dn,nRet);return nRet;/保存下層服務(wù)提供者的函數(shù)列表;g_NextProcTable=*lpProcTable;/通過修改傳遞給下層服務(wù)提供者的函數(shù)列表,Hook相關(guān)WSP函數(shù);lpProcTable-lpWSPSendTo=WSPSendTo;FreeProvider(pProtoInfo);return nRet;/END/ nfilter.EX by miyagi/ 開發(fā)思路:/1)定義要安裝的LSP的硬編碼,在卸載LSP時還要會使用;/ 2)定義GetProvider()、FreeProvider()函數(shù),枚舉服務(wù)提供者和釋放枚舉到的結(jié)構(gòu)數(shù)組;/3)通過InstallProvider()來安裝自定義的LSP;/3.1)通過GetProvider()來枚舉所有的提供者;/3.2)遍歷pProtoInfo數(shù)據(jù)里的每個服務(wù)提供者,并將TCP、UDP、RAW對應的服務(wù)提供者結(jié)構(gòu)/以及入口ID分別保存至OriginalProtocolInfo數(shù)組及dwOrigCatalogId數(shù)組中,同時去/掉XP1_IFS_HANDLES標志;/3.3)安裝我們自定義的分層協(xié)議,獲取一個dwLayeredCatalogID,即LSP入口ID;/3.3.1)任意將一個下層服務(wù)提供者的結(jié)構(gòu)復制到LayeredProtocolInfo中,進行LSP服務(wù)/ 提供者結(jié)構(gòu)的自定義;/3.3.2)構(gòu)造我們自定義的LSP結(jié)構(gòu);/3.3.3)通過WSCInstallProvider()開始安裝我們自定義的LSP;/3.3.4)重新枚舉各服務(wù)提供者,獲取剛才我們安裝好的自定義的LSP的入口ID;/3.3.5)遍歷pProtoInfo數(shù)組,尋找我們自定義的LSP的入口ID,并保存至/ dwLayeredCatalogId中;/3.3.6)安裝協(xié)議鏈前,分別先構(gòu)造好TCP、UPD、RAW各自的協(xié)議鏈順序;/3.3.7)為協(xié)議鏈獲取一個GUID,并通過OriginalProtocol數(shù)組來安裝三個協(xié)議鏈;/3.3.8)協(xié)議鏈安裝完畢后,需要重新排序,將我們的協(xié)議鏈提到最前面;/3.3.9)移除我們自定義的LSP及協(xié)議鏈;/#include #include / 定義了WSCWriteProviderOrder()函數(shù)#include #include #pragma comment(lib, Ws2_32.lib)#pragma comment(lib, Rpcrt4.lib)/ 實現(xiàn)了UuidCreate()函數(shù)/定義要安裝的LSP的硬編碼,在卸載LSP時還要會使用;GUID ProviderGuid=0xd3c21122, 0x85e1, 0x48f3, 0x9a,0xb6,0x23,0xd9,0x0c,0x73,0x07,0xef;/枚舉當前各協(xié)議服務(wù)提供者的函數(shù);LPWSAPROTOCOL_INFOW GetProvider(LPINT lpnTotalProtocols)DWORD dwSize = 0;int nError;LPWSAPROTOCOL_INFOW pProtoInfo = NULL; /用于申請存放服務(wù)提供者結(jié)構(gòu)的內(nèi)存空間;/ 取得需要的長度,即通過將WSCEnumProtocols函數(shù)的dwSize參數(shù)置0進行第一次調(diào)用,后/以獲得枚舉服務(wù)提供者所需的緩沖區(qū)大小,置于dwSize變量中;if(:WSCEnumProtocols(NULL, pProtoInfo, &dwSize, &nError) = SOCKET_ERROR)if(nError != WSAENOBUFS)return NULL;/根據(jù)dwSize中的值來申請內(nèi)存空間;pProtoInfo = (LPWSAPROTOCOL_INFOW):GlobalAlloc(GPTR, dwSize);/第二次通過WSCEnumProtocols()正式枚舉到各服務(wù)提供者并存放于pProtoInfo(數(shù)組)中,/并將服務(wù)提供者的個數(shù)存到lpnTotalProtocols中;*lpnTotalProtocols = :WSCEnumProtocols(NULL, pProtoInfo, &dwSize, &nError);/將pProtoInfo返回給函數(shù)調(diào)用者;return pProtoInfo;void FreeProvider(LPWSAPROTOCOL_INFOW pProtoInfo)/釋放用于存放服務(wù)提供者數(shù)組的內(nèi)存空間,pProtoInfo;:GlobalFree(pProtoInfo);/枚舉現(xiàn)有的各服務(wù)提供者;void query()LPWSAPROTOCOL_INFOW pProtoInfo;int nProtocols;pProtoInfo = GetProvider(&nProtocols);for(int i=0; inProtocols; i+)printf( Protocol: %ws n, pProtoInfoi.szProtocol);printf( CatalogEntryId: %dChainLen: %d nn, pProtoInfoi.dwCatalogEntryId, pProtoInfoi.ProtocolChain.ChainLen);/安裝LSPint InstallProvider(WCHAR *pwszPathName)/標識我們自定義安裝的LSP的名字;WCHAR wszLSPName=L_LSP;LPWSAPROTOCOL_INFOW pProtoInfo;int nProtocols;WSAPROTOCOL_INFOW OriginalProtocolInfo3;DWORD dwOrigCatalogId3;int nArrayCount=0;DWORD dwLayeredCatalogId;int nError;/枚舉所有的服務(wù)提供者;pProtoInfo=GetProvider(&nProtocols);/通過以下三個布爾變量,來判斷是否找到對應服務(wù)提供者;BOOL bFindTcp=FALSE;BOOL bFindUdp=FALSE;BOOL bFindRaw=FALSE;/遍歷pProtoInfo數(shù)據(jù)里的每個服務(wù)提供者,并將TCP、UDP、RAW對應的服務(wù)提供者結(jié)構(gòu)保存;for(int i=0;inProtocols;i+)if(pProtoInfoi.iAddressFamily=AF_INET)if(!bFindTcp&pProtoInfoi.iProtocol=IPPROTO_TCP)memcpy(&OriginalProtocolInfonArrayCount,&pProtoInfoi,sizeof(WSAPROTOCOL_INFOW);OriginalProtocolInfonArrayCount.dwServiceFlags1=OriginalProtocolInfonArrayCount.dwServiceFlags1&(XP1_IFS_HANDLES);dwOrigCatalogIdnArrayCount+=pProtoInfoi.dwCatalogEntryId;bFindTcp=TRUE; /表示已找到對應服務(wù)提供者;if(!bFindUdp&pProtoInfoi.iProtocol=IPPROTO_UDP)memcpy(&OriginalProtocolInfonArrayCount,&pProtoInfoi,sizeof(WSAPROTOCOL_INFOW);OriginalProtocolInfonArrayCount.dwServiceFlags1=OriginalProtocolInfonArrayCount.dwServiceFlags1&(XP1_IFS_HANDLES);dwOrigCatalogIdnArrayCount+=pProtoInfoi.dwCatalogEntryId;bFindUdp=TRUE; if(!bFindRaw&pProtoInfoi.iProtocol=IPPROTO_IP)memcpy(&OriginalProtocolInfonArrayCount,&pProtoInfoi,sizeof(WSAPROTOCOL_INFOW);OriginalProtocolInfonArrayCount.dwServiceFlags1=OriginalProtocolInfonArrayCount.dwServiceFlags1&(XP1_IFS_HANDLES);dwOrigCatalogIdnArrayCount+=pProtoInfoi.dwCatalogEntryId;bFindRaw=TRUE; ;/安裝我們自定義的分層協(xié)議,獲取一個dwLayeredCatalogID,即LSP入口ID;/任意將一個下層服務(wù)提供者的結(jié)構(gòu)復制到LayeredProtocolInfo中,進行LSP/服務(wù)提供者結(jié)構(gòu)的自定義;WSAPROTOCOL_INFOW LayeredProtocolInfo;memcpy(&LayeredProtocolInfo,&OriginalProtocolInfo0,sizeof(WSAPROTOCOL_INFOW);/構(gòu)造我們自定義的LSP結(jié)構(gòu);wcscpy(LayeredProtocolInfo.szProtocol,wszLSPName);LayeredProtocolInfo.ProtocolChain.ChainLen=LAYERED_PROTOCOL;LayeredProtocolInfo.dwProviderFlags|=PFL_HIDDEN;/通過WSCInstallProvider()開始安裝我們自定義的LSP;if(:WSCInstallProvider(&ProviderGuid,pwszPathName,&LayeredProtocolInfo,1,&nError)=SOCKET_ERROR)return nError;/重新枚舉各服務(wù)提供者,獲取剛才我們安裝好的自定義的LSP的入口ID;FreeProvider(pProtoInfo);pProtoInfo=GetProvider(&nProtocols);for(i=0;inProtocols;i+)if(memcmp(&pProtoInfoi.ProviderId,&ProviderGuid,sizeof(ProviderGuid)=0)dwLayeredCatalogId=pProtoInfoi.dwCatalogEntryId;break;/安裝協(xié)議鏈前,先構(gòu)造好協(xié)議鏈的順序;WCHAR wszChainNameWSAPROTOCOL_LEN+1;for(i=0;i0;j-)OriginalProtocolInfoi.ProtocolChain.ChainEntriesj=OriginalProtocolInfoi.ProtocolChain.ChainEntriesj-1;OriginalProtocolInfoi.ProtocolChain.ChainLen+;OriginalProtocolInfoi.ProtocolChain.ChainEntries0=dwLayeredCatalogId;/為協(xié)議鏈獲取一個GUID,并通過OriginalProtocol數(shù)組來安裝三個協(xié)議鏈;GUID ProviderChainGuid;if(:UuidCreate(&ProviderChainGuid)=RPC_S_OK)if(:WSCInstallProvider(&ProviderChainGuid,pwszPathName,OriginalProtocolInfo,nArrayCount,&nError)=SOCKET_ERROR)return nError;elsereturn GetLastError();/協(xié)議鏈安裝完畢后,需要重新排序,將我們的協(xié)議鏈提到最前面;FreeProvider(pProtoInfo);pProtoInfo=GetProvider(&nProtocols);DWORD dwIds20;int nIndex=0;for(i=0;i1)&(pProtoInfoi.ProtocolChain.ChainEntries0=dwLayeredCatalogId)dwIdsnIndex+=pProtoInfoi.dwCatalogEntryId;/添加其他的服務(wù)提供者入口ID;for(i=0;inProtocols;i+)if(pProtoInfoi.ProtocolChain.ChainLen=1)|(pProtoInfoi.ProtocolChain.ChainEntries0!=dwLayeredCatalogId)dwIdsnIndex+=pProtoInfoi.dwCatalogEntryId;/通過WSCWriteProviderOrder()重新按照dwIds的順序排序;if(nError=:WSCWrit
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學校點對點管理制度
- 學校英語組管理制度
- 學生資助政管理制度
- 安全督察與管理制度
- 完善倉儲及管理制度
- 實訓室雙人管理制度
- 審批服務(wù)局管理制度
- 客用品收發(fā)管理制度
- 家具廠生產(chǎn)管理制度
- 家庭服務(wù)與管理制度
- GB/T 10810.2-2025眼鏡鏡片第2部分:漸變焦
- 《長QT綜合征》課件
- DBJ04T 439-2023 房屋建筑和市政基礎(chǔ)設(shè)施工程造價指標指數(shù)編制標準
- 眩暈綜合癥的護理查房
- 海洋法知到智慧樹章節(jié)測試課后答案2024年秋中國海洋大學
- 2025魯教版高中地理必修一知識點歸納總結(jié)(復習必背)
- 2025年上半年廣東汕尾市城區(qū)招聘政府聘員69人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025版MCN公司藝人合作簽約合同范本3篇
- 《玻璃體腔注射治療》課件
- GB/T 45098-2024營運純電動汽車換電服務(wù)技術(shù)要求
- 2025年中考英語話題作文范文20篇
評論
0/150
提交評論