①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