转贴:让网页密码编辑框中的“星星”现身(附EXE)
(http://www.ccw.com.cn/htm/app/aprog/01_12_20_2.asp)
通常情况下,在密码编辑框中输入的字符都用**(这里呼之为“星星”)来代替,以达到保
护密码的目的。但看“星星”的工具并不比“星星”的个数少,由于其原理比较简单,初学
者很容易制作一个。然而,有时天公不作美,它会给晴朗的星空抹上一道乌云,这时你就无
法寻觅那颗明亮的星。网页中的“星星”就是一颗被掩盖的星。
透过密码编辑框看“星星”,主要是通过向密码编辑框发送WM_GETTEXT,获得密码编辑框的
窗口文本,这种方法在Windows 9x/NT4/ME环境下屡试不爽,星星既属于你,又属于我,大
家都可以看到。到了Windows 2K/XP环境,这招有些失灵,星星变聪明了,它只属于它中意
的人,别的进程别想打它的主意。对于没有权限获得密码的进程,它会简单地返回一个
ERROR_ACCESS_DENIED,来打发那些动机不纯或者别有用心的人们。但是还是有高手能够通
过钩子函数,来笼络星星的心,钩子函数能够实现把一个动态连接库注入到另外一个进程,
获取窗口文本,再返回给另外一个进程,面对这个吃里扒外的东西,不明真相的星星姑娘,
居然听之任之,全抛一片心。
网页中的星星是一颗特别的星,铁石心肠,然而它却是豆腐作的。你很难获得它的窗口句
柄,通过Visual Studio提供的SPY++也很难获得它的窗口句柄和它收到的窗口消息。获
得网页中的密码必须通过必须通过HTML中的MSHTML文档对象模型。你首先必须通过各种方
法获得Internet Explorer浏览器(Mr Navigate,Sorry)窗口句柄,判断它的类名是否
是"Internet Explorer_Server",然后通过下述代码获得其文档对象模型指针,即
IHTMLDocument2接口。
HWND hw;
MSHTML::IHTMLDocument2Ptr doc;
MSHTML::IHTMLElementCollectionPtr col;
MSHTML::IHTMLElementPtr EL;
DWORD lRes;
HRESULT hres;
UINT MSG = RegisterWindowMessage("WM_HTML_GETOBJECT"
;
SendMessageTimeout(hw, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, &lRes);
hres=ObjectFromLresult(lRes, __uuidof(MSHTML::IHTMLDocument2), 0, (void**)&doc);
然后你必须获得鼠标屏幕坐标,把它转换成相对于客户区的坐标,然后根据坐标位置获得网
页对对应的元素,查询IID_IHTMLInputTextElement接口指针,判断元素类型是否是一个密
码编辑框,并获得对应密码。
CString GetPassword(IHTMLDocument2 *pDoc2,POINT pt)
{
if(pDoc2==NULL)return "";
CComPtr<IHTMLElement> pElement;
HRESULT hr=pDoc2->elementFromPoint(pt.x,pt.y,&pElement);
if(SUCCEEDED(hr)){
CComPtr<IHTMLInputTextElement> pPwdElement;
hr=pElement->QueryInterface(IID_IHTMLInputTextElement,
(void**)&pPwdElement);
if(SUCCEEDED(hr)){
CComBSTR type;
hr=pPwdElement->get_type(&type);
if(SUCCEEDED(hr)){
if(type==_T("password"
){
CComBSTR pwd;
hr=pPwdElement->get_value(&pwd);
if(SUCCEEDED(hr)){
if(pwd.Length()!=0){
CComBSTR msg;
msg=pwd;
CString str(msg);
return str;
}
else{
return "";
}
}
}
}
}
}
pDoc2->Release();
return "";
}
如果你想尝试一下如何在后台记录网页密码,你可以实现一个IE扩展的COM组件,由IE负责
自动加载,在组件中你必须实现IOleObjectSite接口,在SetSite方法中得到一个指向IE
COM对象的Iunknown的指针,再通过它获得其它接口的指针。在程序中还需要创建一个线
程负责对当前的网页所有元素实现轮询解析,判断元素的属性是否是一个编辑框(密码编
辑框),然后把用户名和密码记录到一个文件中。
本程序在Windows XP(IE6)环境下利用Visual Studio.net Beta 2调试通过