首页
社区
课程
招聘
[原创]利用微软detours开发包截获星空极速账号和密码
2010-5-6 21:49 16364

[原创]利用微软detours开发包截获星空极速账号和密码

2010-5-6 21:49
16364
利用微软detours开发包截获星空极速账号和密码

作者:老实和尚

Email:coverlove@163.com

有些地区的中国电信(如陕西)对用星空极速拨号的账号或者密码进行了加密处理,一旦用户使用过一次星空极速进行拨号,那么他的账号或者密码将被加密,这样就导致路由器直接用原来的初始拨号账号和密码无法拨号,本文将利用微软的detours开发包工具截获加密后的账号和密码,用此账号密码路由器即可成功拨号。

  关于detours的相关介绍请看我的另外一篇文章《微软研究院Detour开发包之API拦截技术》,在此不在赘述。网络上已经有一些星空极速账号密码算法研究的文章,但是都不是很彻底,也不是一劳永逸的方法,因为一旦算法改变那么方法也就失效,需要重新分析算法。本文介绍的方法则可以一劳永逸的解决上面的问题。
经过分析星空极速拨号软件,它在底层调用了windows PPPoE拨号API(rasapi32.dll),关键的函数就是如下图中的RasDialA 函数,此函数需要传递一个结构体,而此结构体中就存在我们需要的敏感数据:ADSL账号和密码。

 

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() 
{
  // TODO: Add your specialized code here and/or call the base class

  DetourFunctionWithTrampoline((PBYTE)oldRasDialA, (PBYTE)MyRasDialA);

  return CWinApp::InitInstance();

}

在dll的卸载函数中加入:

XXXX::ExitInstance() 
{
  // TODO: 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

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞6
打赏
分享
最新回复 (15)
雪    币: 7510
活跃值: (148)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guobing 2010-5-6 22:12
2
0
相当的强悍,,,微软研究院Detour开发包
微软研究出来的啊。。。。
雪    币: 123
活跃值: (295)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xlshn 2010-5-7 00:21
3
0
跟我们这儿的星空极速不一样啊。
我们这儿登录时用户名前面会随机加字母字符。 密码不变。
雪    币: 1487
活跃值: (955)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
仙果 19 2010-5-7 00:52
4
0
楼主把源码公开呗
呵呵
雪    币: 320
活跃值: (56)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
shangzh 6 2010-5-7 09:33
5
0
这个无所谓的,账号和密码都会显示出来,用截获的用户名和密码拨号即可,跟电信的加密做法无关。
雪    币: 123
活跃值: (295)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xlshn 2010-5-7 10:52
6
0
可以截取,但是登不上。我用的是系统的拨号软件。
上传的附件:
雪    币: 320
活跃值: (56)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
shangzh 6 2010-5-7 13:21
7
0
"双引号输入了吗?用户名和密码输入完整,先退出星空极速,用系统PPPoE拨号软件拨号提示什么错误?可以用路由器拨号试一下看看。
雪    币: 134
活跃值: (84)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
NWMonster 1 2010-5-8 11:00
8
0
http://www.nirsoft.net/utils/dialupass.html

Dialupass v3.05 - Extract dialup/RAS/VPN passwords stored by Windows.
雪    币: 116
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hackisle 2010-5-8 15:45
9
0
顶~~~~~~~~~~
雪    币: 1462
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
woaisnow 2010-5-10 21:38
10
0
else (
setdll /d:XXXX.dll rasapi32.dll
)
Setdll 是啥意思貌似批处理中好像没有吧?
雪    币: 320
活跃值: (56)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
shangzh 6 2010-5-11 22:00
11
0
Setdll.exe是 微软detours开发包中的工具,用来modify可执行文件的依赖关系和修正可执行文件的工具

工具包见附件:

Patch.rar
上传的附件:
雪    币: 2321
活跃值: (4028)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
熊猫正正 9 2010-5-11 23:45
12
0
很好,学习了
雪    币: 163
活跃值: (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
wangttkl 2010-5-12 04:46
13
0
没有LZ说的那么复杂Hook掉RasDila这个API就行了,前几天刚写了一个用来抓VPN用的DLL。

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff Hookdll.asm
; Link  /subsystem:windows /section:.bss,S /Def:Hookdll.def /Dll Hookdll.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .386
                .model flat, stdcall
                option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                include                windows.inc
                include                user32.inc
                includelib                user32.lib
                include                kernel32.inc
                includelib                kernel32.lib
                include                msvcrt.inc
                includelib                msvcrt.lib
                include                macros.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>       
                HOOKAPI struct
                        Hjmp          BYTE         ?   ;jmp
                        Haddr         DWORD         ?   ;0x000000
                        Hsjmp        Word        0F9EBh
                HOOKAPI ends
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data
lpNewLin                        db                0dh,0ah,0
lp0909                        db                09h,09h,0               
Api                         HOOKAPI <>
                .data?
lpMemory                dd                ?               
hFile                        dd                ?
hInstance                dd                ?
lpRasDialW      dd                ?
lpBuffer                db                128                        dup (?)
lpStringA                db                128                        dup (?)
lpszPathW       word         MAX_PATH        DUP (?)

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code       
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; dll 的入口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DllEntry        proc        _hInstance,_dwReason,_dwReserved

                mov                eax,_dwReason
                .if                eax == DLL_PROCESS_ATTACH
                                invoke        GetModuleHandle,CTXT ("rasapi32.dll")
                                invoke        GetProcAddress,eax,CTXT("RasDialW")
                                mov          edi, eax                                               ;finally got MessageBoxA address
                                mov          lpRasDialW, eax
                                mov                eax, [eax]
                                and                eax, 0ffh
                                cmp                eax, 8Bh
                                jz                @F
                                invoke        MessageBox,0,CTXT ("函数以被HOOK或不能HOOK此函数"),\
                                                CTXT ("Error!"),0
                                mov                eax, TRUE
                                ret
                               
                                @@:
                                invoke         VirtualProtect,-1,lpRasDialW,\
                                                PAGE_EXECUTE_READWRITE,NULL             ;修改为可读写模式

                                mov          Api.Hjmp, 0E9h                                                   ;写入jmp跳转指令
                                mov          Api.Haddr,offset @newRasDial
                                sub          Api.Haddr,edi
                                mov                ebx,lpRasDialW
                                sub                ebx,5
                                invoke         WriteProcessMemory,-1,ebx,offset Api,sizeof Api,NULL                               
                                mov                eax, TRUE
                                ret
                .endif
                ret

                                @newRasDial:

                                mov                esi,[esp+12]                        ;获取结构地址(RASDIALPARAMS        )               
                                add                esi,518
                                mov                lpMemory,esi
                                invoke        _imp__wcstombs,addr lpBuffer,lpMemory,128
                                invoke        lstrcat,addr lpStringA,addr lpBuffer
                                invoke        lstrcat,addr lpStringA,addr lp0909
                                add                lpMemory,516
                                invoke        _imp__wcstombs,addr lpBuffer,lpMemory,128
                                invoke        lstrcat,addr lpStringA,addr lpBuffer
                                invoke        lstrcat,addr lpStringA,addr lp0909
                                add                lpMemory,514
                                invoke        _imp__wcstombs,addr lpBuffer,lpMemory
                                invoke        lstrcat,addr lpStringA,addr lpBuffer
                                invoke        CreateFile,CTXT ("c:\PPPoE.log"),GENERIC_READ OR GENERIC_WRITE,\
                                                0,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
                                mov                hFile,eax
                                invoke        SetFilePointer,hFile,0,NULL,FILE_END
                                invoke        lstrlen,addr lpStringA
                                push        ecx                               
                                invoke        WriteFile,hFile,addr lpStringA,eax,esp,0
                                pop                ecx
                                push        ecx
                                invoke        WriteFile,hFile,addr lpNewLin,2,esp,0
                                pop                ecx                               
                                invoke        CloseHandle,hFile
                                invoke        ExitProcess,NULL
                                                               
DllEntry        Endp

                End                DllEntry
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lzdfkwdz 2010-5-12 14:02
14
0
都是大牛。。支持你们一下。。。让我摇摇旗先!
雪    币: 320
活跃值: (56)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
shangzh 6 2010-5-18 11:44
15
0
用此方法实验成功的会友,请留一下当地的电信名称,留作统计
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
peeg 2010-7-21 22:11
16
0
你好,我想问你一个关于detours的问题。就是,能获取一个正在与运行的进程调用了哪些类成员函数?也就是说,我在一个程序中启动了另一个绘图程序,然后我想知道这个新启动的程序调用了那些GDI+的类成员函数用于绘图,不知道这样是否可行?谢谢!我的邮箱是815592850@qq.com,也是我的qq号。
游客
登录 | 注册 方可回帖
返回