不是系统级的高手别进来!(200分)

  • 主题发起人 人在昆明
  • 开始时间

人在昆明

Unregistered / Unconfirmed
GUEST, unregistred user!
这几天比较空,突然对win2000的星号感兴趣,于是写了一个unit 用来取*,然后想在<br>hook中调用,结果鼠标钩子没问题,键盘钩子冲突,想问一下有没有那位高手封装过<br>getwindowtext 可以得到星号,或者有什么其他的方法,直接用 sendmessage(..),<br>俺愿意用俺的unit 交换(远程注入)。
 
23. 如何获得密码窗口的内容 揭开Hook的面纱 <br>现在的不少程序都有取得密码窗口的内容的功能,你有没有想过是如何做到这一切的呢?我有一个同学就问过我这样一个问题,当时我也回答不出来,现在我研究了视窗的Hook函数之后总算有了一定的了解。下面就有我来揭开Hook函数的神秘面纱。 <br>先来介绍Hook的含义: <br>Hook是指在程序正常运行中接受信息之前预先启动的函数,用来检查和修改传给该程序的信息。举例来说,当你在一个窗口上点击鼠标以后,首先接收信息的是相应的Hook函数,然后才传到相应的应用程序。 <br>如何定义Hook函数: <br>SetWindowsHookEx: <br>  用来装入新的Hook函数,其参数列表为下: <br>int idHook:装入Hook类型,有WH_MOUSE 等。 <br>HOOKPROC lpfn:要装入的Hook函数地址。 <br>HINSTANCE hMod:函数所在的进程,如果为全局Hook函数该函数必须在Dll中。 <br>DWORD dwThreadId:装入哪个进程,如果为全局,则为0。 <br>  返回相应Hook标识。 <br>HookProc: <br>  您自定义的Hook函数,应具有的参数如下: <br>int nCode:传入的信息类型。 <br>WPARAM wParam:短整型参数。 <br>LPARAM lParam:长整型参数。 <br>  要在函数中调用CallNextHookEx把信息传给下一个Hook函数。 <br><br>CallNextHookEx: <br>  用于将信息传给下一个Hook函数,需要将得到的Hook标识和相应参数传入。 <br><br>UnhookWindowsHookEx: <br>  用于将装入的Hook函数从Hook链表中剔除,应传入得到的Hook标识。 <br><br>下面我们来看一个例子: <br>  例子原码的下载:HookTest.zip 本程序在Window98和Delphi5下通过。 <br><br>一、调用LoadLibrary和GetProcAddress取得函数地址。 <br>  hinstDLL := LoadLibrary(LPCTSTR( 'hooktest.dll')); <br>  @hkprcSysMsg:=GetProcAddress(hinstDLL, 'MouseProc'); <br><br>二、用SetWindowsHookEx将得到的函数装入。 <br>  hhk:= SetWindowsHookEx(WH_MOUSE,@hkprcSysMsg,hinstDLL, 0); <br><br>三、Windows会将函数装入到每一个进程中。 <br><br>四、每当鼠标点击,自定义的Hook函数会将点击的窗口标题传给程序的标题。 <br>if (nCode=HC_ACTION)and(WPARAM=WM_LBUTTONDOWN) <br> then <br>  begin <br>   MyMouse:=CPointer(lPARAM); <br>   MyHandle2:=MyMouse^.hwnd; <br>   GetMem(MyString,GetWindowTextlength(myhandle2)+1); <br>   GetWindowText(MyHandle2,MyString,GetWindowTextlength(myhandle2)+1); <br>   TempHandle:=myhandle2; <br>   while (TempHandle&lt;&gt;0) do <br>   begin <br>    myHandle2:=TempHandle; <br>    TempHandle:=GetParent(TempHandle); <br>   end; <br>   if (myhandle2&lt;&gt;0) <br>   then <br>    SetWindowText(myhandle2,MyString); <br>   FreeMem(MyString); <br>  end <br>就这样完成了得到密码窗口内容的功能。 <br>  我想现在你能够基本了解Hook了吧,还有任何问题请给我来信。<br>
 
完全不用什麼HOOK那麼麻煩!<br>隻要做一個系統熱鍵就可以了!如CTRL+X+Z 激活後就調用你的unit 文件!<br><br>
 
密码查看器<br>awin.y365.com   Delphi梦工场 <br><br><br><br>源程序在下面,里面还演示了怎样使用自定义光标,不过这个东西对win2000好像没有什么作用,如果有人知道怎么解决这个问题,一定要告诉我一声!<br><br>工程文件如下:<br>program viewpass;<br><br>uses<br>Forms,<br>pass in 'pass.pas' {Form1};<br><br>{$R *.RES}<br><br>begin<br>Application.Initialize;<br>Application.Title := 'passview';<br>Application.CreateForm(TForm1, Form1);<br>Application.Run;<br>end.<br><br>单元文件如下:<br>unit pass;<br><br>interface<br><br>uses<br>Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,<br>StdCtrls, ExtCtrls,shellapi;<br><br>const<br>crmycursor=2;//自定义光标的ID,必须大于0<br><br>type<br>TForm1 = class(TForm)<br>Edit1: TEdit;<br>Edit2: TEdit;<br>Panel1: TPanel;<br>Image1: TImage;<br>Button1: TButton;<br>Label1: TLabel;<br>Label2: TLabel;<br>Edit3: TEdit;<br>Label4: TLabel;<br>Panel2: TPanel;<br>Image2: TImage;<br>Image3: TImage;<br>Label5: TLabel;<br>CheckBox1: TCheckBox;<br>procedure Button1Click(Sender: TObject);<br>procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;<br>Shift: TShiftState; X, Y: Integer);<br>procedure FormCreate(Sender: TObject);<br>procedure FormMouseUp(Sender: TObject; Button: TMouseButton;<br>Shift: TShiftState; X, Y: Integer);<br>procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,<br>Y: Integer);<br>procedure CheckBox1Click(Sender: TObject);<br>procedure Label5Click(Sender: TObject);<br>private<br>{ Private declarations }<br>isdragging:boolean;<br>public<br>{ Public declarations }<br>end;<br><br>var<br>Form1: TForm1;<br><br>{$R mycursor.res}//包含自定义光标的资源文件,必须加上<br><br>implementation<br><br>{$R *.DFM}<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>close;<br>end;<br><br>procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;<br>Shift: TShiftState; X, Y: Integer);<br>begin<br>if isdragging=false then<br>begin<br>isdragging:=true;<br>image1.visible:=false;<br>screen.cursor:=crmycursor;//设置光标为自定义光标<br>setcapture(handle);//设置鼠标捕捉,重要<br>end;<br>end;<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>isdragging:=false;<br>screen.cursors[crmycursor]:=loadcursor(HINSTANCE,'pass');//从资源文件中装载自定义光标,pass为自定义资源文件中光标的文件名<br>try<br>case strtoint(copy(timetostr(time),5,1)) of<br>0..2:color:=clpurple;<br>3..5:color:=clblack;<br>6..7:color:=clinfobk;<br>8..9:color:=clbackground;<br>end;<br>except<br>color:=clbackground;<br>end;<br>end;<br><br>procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;<br>Shift: TShiftState; X, Y: Integer);<br>begin<br>if isdragging=true then<br>begin<br>isdragging:=false;<br>image1.visible:=true;<br>screen.Cursor:=crdefault;//恢复缺省的光标<br>releasecapture;//释放鼠标捕捉,重要<br>end;<br>end;<br><br>procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,<br>Y: Integer);<br>var<br>mousepoint:tpoint;<br>myhwnd:hwnd;<br>pass,classname:array [0..254] of char;<br>lens:integer;<br>begin<br>if isdragging=true then<br>begin<br>getcursorpos(mousepoint);//获得当前光标位置<br>myhwnd:=windowfrompoint(mousepoint);//获得光标处的窗口句柄<br>getclassname(myhwnd,classname,sizeof(classname));//获得窗口的类名<br>lens:=sendmessage(myhwnd,wm_gettextlength,0,0)+1;//取得密码长度<br>sendmessage(myhwnd,wm_gettext,lens,longint(@pass));//取得密码<br>if (defwindowproc(handle,wm_nchittest,0,getmessagepos)=htcaption) or (defwindowproc(handle,wm_nchittest,0,getmessagepos)=htclient) then<br>begin<br>edit1.Text:='本窜口中';<br>edit3.text:=';<br>edit2.Text:=';<br>end<br>else<br>begin<br>edit1.Text:=format('X:%d,Y:%d',[mousepoint.x,mousepoint.y]);<br>edit2.text:=string(pass);<br>edit3.text:=string(classname);<br>end;<br>end;<br>end;<br><br>procedure TForm1.CheckBox1Click(Sender: TObject);<br>begin<br>if checkbox1.checked then setwindowpos(handle,hwnd_topmost,left,top,width,height,0);//总在最前<br>end;<br><br>procedure TForm1.Label5Click(Sender: TObject);<br>begin<br>shellexecute(handle,'open',pchar('mailto:mhsxaw@163.com?subject=我的建议*_*'),nil,nil,9);<br>end;<br><br>end.<br><br><br><br><br>作者:不详<br>来源:不详<br><br>
 
呵呵,我也进来了……[:D][:D][:D]
 
我本来是想写一个木马钩oicq 的 密码,当然我不干坏事,我的oicq 号码一大筐<br>我仅仅是做技术性探索,楼上的两位兄弟,不用hook 你怎么搞定密码,不用<br>远程注入,你怎么取??
 
有没有读写CMOS的例子??我想要!! 请各位高手帮帮忙忙!!!!!!!!
 
或者那位有键盘钩子,要求实现共享内存的,给我看看
 
另外,补充说明,就是说 键盘hook &nbsp;我要在 dll 中截获的键盘信息,<br>可以在exe 中处理,要用到,内存共享,我写了但是效果不好。
 
这个完全符合你的要求:<br>http://service.lonetear.com/delphi/dispdoc.asp?id=1299
 
to zw84611:<br>&nbsp; &nbsp;我看过你的地址,也下过。我想那个例程不适合这个需求。<br>Hook!Hook!自己写多麻烦,我给你们提供一个Hook的控件包,老外写的还行。<br>http://service.lonetear.com/delphi/dispdoc.asp?id=1328<br>
 
&gt;&gt;“就是说 键盘hook &nbsp;我要在 dll 中截获的键盘信息,可以在exe 中处理,要用到,内存共享”<br>完全符合。[:)]
 
其实不用SendMessage,改用PostMessage就可以的。<br>如果那个星号真的是可以变回来的,比如QQ的密码,但是如果那个星号本来就是星号,如Windows2000的拨号连接,就不行啦。<br>不知道是否理解你的需求+满足你的需求?<br><br>{-------------------------------------------------------------------------------}<br>{系统的回调过程,在本过程内发送显示/隐藏密码的消息}<br>function EnumChildWindowsProc(hwnd: Integer; lparam: Longint): Boolean; stdcall;<br>var<br>&nbsp; buffer: array[0..255] of Char;<br>begin<br>&nbsp; GetClassName(hwnd, buffer, 256);<br>//if StrPas(Buffer) = 'TEdit' then &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//找TEdit控件<br>&nbsp; begin<br>&nbsp; &nbsp; if lparam = 0 then<br>&nbsp; &nbsp; &nbsp; PostMessage(hwnd, EM_SETPASSWORDCHAR, longint(0), 0)<br>&nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; PostMessage(hwnd, EM_SETPASSWORDCHAR, longint('*'), 0);<br><br>&nbsp; &nbsp; InvalidateRgn(hwnd, 0, True);<br>&nbsp; &nbsp; Result := True; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //终止循环<br>&nbsp; end;<br>end;<br><br>{-------------------------------------------------------------------------------}<br>{显示/隐藏所有窗体密码,本部分枚举所有窗体}<br>procedure ShowAll(lparam: Integer);<br>var<br>&nbsp; Window_Handle, Hand: Integer;<br>begin<br>&nbsp; Window_Handle := GetWindow(Application.Handle, GW_HWNDFIRST);<br>&nbsp; while Window_Handle &lt;&gt; 0 do<br>&nbsp; begin<br>&nbsp; &nbsp; if Window_Handle &lt;&gt; 0 then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; EnumChildWindows(Window_Handle, @EnumChildWindowsProc, lparam);<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; Window_Handle := GetWindow(Window_Handle, GW_HWNDNEXT);<br>&nbsp; end;<br>end;
 
D:/Borland/Delphi6/Demos/Ipcdemos/IPCThrd.pas<br>内存共享和文件映射的类,挺好用的
 
to zw84611:<br>&nbsp; &nbsp;确实是那样,但是那个例程只能捕获传向自己的按键,对捕获系统中其他程序中的按<br>键改动比较大,况且比较复杂,键值没有过滤。<br>使用控件的话这些事情可很好解决。:)
 
你的这种获取密码的方法太落后了,<br>对于我写的程序,你的方法就不行了,<br><br>我是响应按键事件,将字符写入内存,<br>编辑筐内,写入真实的*号<br>用你的方法只能得到一串*号而已
 
to YFeral:<br>&nbsp; 不,那个例程是个全局的鼠标钩子,系统的所有按键都能捕获到!!
 
zw84611的可以实现啦,<br>yzhshi &nbsp;你的代码在win2000 &nbsp;下可以 抓到星号并存储起来吗? no<br>其实本来没有这么麻烦,但是我的2000下看*的代码中有一个 waitfor <br>如果取密码 的过程 &nbsp;跟 &nbsp;键盘 hook 在一个 线程中就会 因为等不到消息而死掉。<br>所以要共享内存,把键盘消息映射到exe 即 不在 dll &nbsp;这个线程中处理。<br>继续讨论看看有没有更好的解决方法。<br>
 
to LiChaoHui:<br>&nbsp; &nbsp; &nbsp;呵呵,那肯定如果你可以的去处理的 * &nbsp;那当然不行啦,不过目前好多商业软件比如<br>qq 还是可以的。
 
顶部