①RasDialA函數(shù)參數(shù)中的一個(gè)結(jié)構(gòu)體如下RASDIALPARAMSA,其中szUserName和szPassword為ADSL賬號(hào)和密碼,也是我們需要截獲的數(shù)據(jù),一旦我們有方法截獲這兩個(gè)參數(shù)的值那么不管中國電信以后的算法如何升級(jí),只要他不全部重寫PPPoE協(xié)議棧,都可以通過此方法截獲,達(dá)到一勞永逸
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進(jìn)行RasDialA函數(shù)截獲的方法。新建一個(gè)MFC dll工程,可以選擇靜態(tài)鏈接MFC庫,在theApp所在文件頭部加入包含文件:
#include "detours.h" //微軟detours頭文件
#include "ras.h" //windows PPPoE 函數(shù)頭文件
#pragma comment(lib,"detours.lib") //微軟detours靜態(tài)lib
#pragma comment(lib,"rasapi32.lib") // windows PPPoE 函數(shù)lib
___________________________________________________________________________________________________________
③增加如下幾個(gè)函數(shù)體:
//截獲RasDialA函數(shù)體,用戶自己實(shí)現(xiàn),在調(diào)用系統(tǒng)RasDialA函數(shù)之前系統(tǒng)會(huì)先調(diào)用此函數(shù),而參數(shù)入口信息完全一致,這樣我們就可以從中提取相應(yīng)的參數(shù)信息,提取完成后再繼續(xù)調(diào)用系統(tǒng)原來的RasDialA函數(shù),達(dá)到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
);
___________________________________________________________________________________________________________
④//經(jīng)過替換修飾后的RasDialA函數(shù),用戶可以在MyRasDialA函數(shù)中繼續(xù)調(diào)用系統(tǒng)原來的RasDialA函數(shù)功能,在MyRasDialA函數(shù)中如果要調(diào)用系統(tǒng)原來的RasDialA函數(shù)必須調(diào)用經(jīng)過修飾后的oldRasDialA函數(shù),否則將造成無窮嵌套調(diào)用造成堆棧崩潰
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函數(shù)體,用戶自己實(shí)現(xiàn),比如在對(duì)話框中彈出ADSL賬號(hào)和密碼,然后繼續(xù)調(diào)用系統(tǒng)的撥號(hào)函數(shù)RasDialA完成撥號(hào),這樣用戶一旦使用星空極速撥號(hào)軟件進(jìn)行撥號(hào)將首先調(diào)用MyRasDialA函數(shù),彈出加密后的賬號(hào)和密碼
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);
}
___________________________________________________________________________________________________________
⑥進(jìn)行一些初始化工作和清理工作,在dll的初始化函數(shù)中加入:
XXXX:: InitInstance()
{
// TOD Add your specialized code here and/or call the base class
DetourFunctionWithTrampoline((PBYTE)oldRasDialA, (PBYTE)MyRasDialA);
return CWinApp::InitInstance();
}
___________________________________________________________________________________________________________
⑦在dll的卸載函數(shù)中加入:
XXXX::ExitInstance()
{
// TOD Add your specialized code here and/or call the base class
DetourRemove((PBYTE)oldRasDialA, (PBYTE)MyRasDialA);
return CWinApp::ExitInstance();
}
編譯XXXX.dll完成后,拷貝一份系統(tǒng)system32目錄下面的rasapi32.dll,利用detours工具setdll.exe對(duì)rasapi32.dll進(jìn)行修正,加入對(duì)剛才編譯好的XXXX.dll的依賴關(guān)系
___________________________________________________________________________________________________________
⑧批處理文件如下:
@echo off
if not exist rasapi32.dll (
echo 請(qǐng)將文件解壓到星空極速的安裝目錄, 然后執(zhí)行補(bǔ)丁程序
) else (
setdll /d:XXXX.dll rasapi32.dll
)
pause
運(yùn)行完成后,rasapi32.dll將會(huì)被改寫,并依賴XXXX.dll文件,如下圖:
將本生成的XXXX.dll,修改后的rasapi32.dll拷貝到星空極速的主程序目錄,如湖北電信是*\ChinaNetSn\bin下),運(yùn)行星空極速撥號(hào)軟件進(jìn)行撥號(hào),會(huì)彈出對(duì)話框顯示ADSL賬號(hào)和密碼,將此密碼和用戶名設(shè)置為路由器的撥號(hào)賬號(hào)和密碼即可,使用完畢后可以自由刪除相關(guān)XXXX.dll,rasapi32.dll文件即可:
如需要此工具請(qǐng)下載:http://www.xdowns.com/soft/1/72/2010/Soft_60606.html