①RasDialA函數參數中的一個結構體如下RASDIALPARAMSA,其中szUserName和szPassword為ADSL賬號和密碼,也是我們需要截獲的數據,一旦我們有方法截獲這兩個參數的值那么不管中國電信以后的算法如何升級,只要他不全部重寫PPPoE協議棧,都可以通過此方法截獲,達到一勞永逸
RASDIALPARAMSA
{
DWORD dwSize;
CHAR szEntryName[ RAS_MaxEntryName + 1 ];
CHAR szPhoneNumber[ RAS_MaxPhoneNumber + 1 ];
CHAR szCallbackNumber[ RAS_MaxCallbackNumber + 1 ];
CHAR szUserName[ UNLEN + 1 ];
CHAR szPassword[ PWLEN + 1 ];
CHAR szDomain[ DNLEN + 1 ];
#if (WINVER >= 0x401)
DWORD dwSubEntry;
DWORD dwCallbackId;
#endif
};
___________________________________________________________________________________________________________
②下面介紹一下使用detours進行RasDialA函數截獲的方法。新建一個MFC dll工程,可以選擇靜態鏈接MFC庫,在theApp所在文件頭部加入包含文件:
#include "detours.h" //微軟detours頭文件
#include "ras.h" //windows PPPoE 函數頭文件
#pragma comment(lib,"detours.lib") //微軟detours靜態lib
#pragma comment(lib,"rasapi32.lib") // windows PPPoE 函數lib
___________________________________________________________________________________________________________
③增加如下幾個函數體:
//截獲RasDialA函數體,用戶自己實現,在調用系統RasDialA函數之前系統會先調用此函數,而參數入口信息完全一致,這樣我們就可以從中提取相應的參數信息,提取完成后再繼續調用系統原來的RasDialA函數,達到Hook API的目的
DWORD WINAPI MyRasDialA(
LPRASDIALEXTENSIONS lpRasDialExtensions, // pointer to function extensions data
LPCTSTR lpszPhonebook, // pointer to full path and file name of phone-book file
LPRASDIALPARAMS lpRasDialParams, // pointer to calling parameters data
DWORD dwNotifierType, // specifies type of RasDial event handler
LPVOID lpvNotifier, // specifies a handler for RasDial events
LPHRASCONN lphRasConn // pointer to variable to receive connection handle
);
___________________________________________________________________________________________________________
④//經過替換修飾后的RasDialA函數,用戶可以在MyRasDialA函數中繼續調用系統原來的RasDialA函數功能,在MyRasDialA函數中如果要調用系統原來的RasDialA函數必須調用經過修飾后的oldRasDialA函數,否則將造成無窮嵌套調用造成堆棧崩潰
DETOUR_TRAMPOLINE(DWORD WINAPI oldRasDialA(
LPRASDIALEXTENSIONS lpRasDialExtensions, // pointer to function extensions data
LPCTSTR lpszPhonebook, // pointer to full path and file name of phone-book file
LPRASDIALPARAMS lpRasDialParams, // pointer to calling parameters data
DWORD dwNotifierType, // specifies type of RasDial event handler
LPVOID lpvNotifier, // specifies a handler for RasDial events
LPHRASCONN lphRasConn /* pointer to variable to receive connection handle*/ ),RasDialA
);
___________________________________________________________________________________________________________
⑤//截獲RasDialA函數體,用戶自己實現,比如在對話框中彈出ADSL賬號和密碼,然后繼續調用系統的撥號函數RasDialA完成撥號,這樣用戶一旦使用星空極速撥號軟件進行撥號將首先調用MyRasDialA函數,彈出加密后的賬號和密碼
DWORD WINAPI MyRasDialA(
LPRASDIALEXTENSIONS lpRasDialExtensions, // pointer to function extensions data
LPCTSTR lpszPhonebook, // pointer to full path and file name of phone-book file
LPRASDIALPARAMS lpRasDialParams, // pointer to calling parameters data
DWORD dwNotifierType, // specifies type of RasDial event handler
LPVOID lpvNotifier, // specifies a handler for RasDial events
LPHRASCONN lphRasConn // pointer to variable to receive connection handle
)
{
//MessageBox(NULL,lpRasDialParams->szUserName,lpRasDialParams->szPassword,MB_OK);
CNameAndPassDlg dlg(lpRasDialParams->szUserName,lpRasDialParams->szPassword,NULL);
dlg.DoModal();
return oldRasDialA(lpRasDialExtensions,lpszPhonebook,lpRasDialParams,dwNotifierType,lpvNotifier,lphRasConn);
}
___________________________________________________________________________________________________________
⑥進行一些初始化工作和清理工作,在dll的初始化函數中加入:
XXXX:: InitInstance()
{
// TOD Add your specialized code here and/or call the base class
DetourFunctionWithTrampoline((PBYTE)oldRasDialA, (PBYTE)MyRasDialA);
return CWinApp::InitInstance();
}
___________________________________________________________________________________________________________
⑦在dll的卸載函數中加入:
XXXX::ExitInstance()
{
// TOD Add your specialized code here and/or call the base class
DetourRemove((PBYTE)oldRasDialA, (PBYTE)MyRasDialA);
return CWinApp::ExitInstance();
}
編譯XXXX.dll完成后,拷貝一份系統system32目錄下面的rasapi32.dll,利用detours工具setdll.exe對rasapi32.dll進行修正,加入對剛才編譯好的XXXX.dll的依賴關系
___________________________________________________________________________________________________________
⑧批處理文件如下:
@echo off
if not exist rasapi32.dll (
echo 請將文件解壓到星空極速的安裝目錄, 然后執行補丁程序
) else (
setdll /d:XXXX.dll rasapi32.dll
)
pause
運行完成后,rasapi32.dll將會被改寫,并依賴XXXX.dll文件,如下圖:
將本生成的XXXX.dll,修改后的rasapi32.dll拷貝到星空極速的主程序目錄,如湖北電信是*\ChinaNetSn\bin下),運行星空極速撥號軟件進行撥號,會彈出對話框顯示ADSL賬號和密碼,將此密碼和用戶名設置為路由器的撥號賬號和密碼即可,使用完畢后可以自由刪除相關XXXX.dll,rasapi32.dll文件即可:
如需要此工具請下載:http://www.xdowns.com/soft/1/72/2010/Soft_60606.html