对于屏蔽wm_gettext消息的思考

来源:互联网 发布:js基础知识总结csdn 编辑:程序博客网 时间:2024/05/22 13:18

     博客最近都没有时间更新了,一直都比较忙,开学了,不少事情啊,不过我一直没有停下学习的脚步.记得前面说过qq消息框屏蔽了wm_gettext消息并且讲了突破办法,那么我们来看看该怎么屏蔽wm_gettext消息呢.

     其实也很简单就是对窗口进行子类化,但是我们想给wm_gettext返回一个错误错误的字符串,该怎么办呢,呵呵,先看看wm_gettext是怎么发送出去的.

msdn上的描述如下:

WM_GETTEXT wParam = (WPARAM) cchTextMax;   lParam = (LPARAM) lpszText;
     

 

也就是说wparam是接受字符串缓冲区的大小,lparam是指向缓冲区字符串的指针.我们再来看看callwindowproc这个api:

LRESULT CallWindowProc(   WNDPROC lpPrevWndFunc,   HWND hWnd,   UINT Msg,   WPARAM wParam,   LPARAM lParam ); 

这个api的关键是hwnd参数,指的是要接受处理的句柄,现在你是不是有什么思路了呢,呵呵,只要我们把hwnd指向一个我们事先建立好的一个伪造的edit,那么我们获得的数据便是这个伪造的edit的text了.下面看代码吧:

 

DWORD old;
 HWND h;

LRESULT CALLBACK a(HWND h,UINT m,WPARAM w,LPARAM l){
 if(m==WM_GETTEXT){
  char sx[100]={0};
 //return ::DefWindowProc(h,m,w,l);
 
  return ::CallWindowProcA((WNDPROC)old,::h,m,w,l);
  
 }
return ::CallWindowProcA((WNDPROC)old,h,m,w,l);


}

void CMfc1Dlg::OnButton1()
{
 
  h=::CreateWindow("EDIT","",WS_CHILDWINDOW,10,30,40,50,this->m_hWnd,0,::GetModuleHandle(0),0);
  ::SetWindowText(h,"sx");
   //this->GetDlgItem(IDC_EDIT2)->ShowWindow(0);
 old=::SetWindowLong(this->GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,long(a));
 // TODO: Add your control notification handler code here
 
}

核心的代码便是如此,其他的我就不列出了,这样我们运行程序,在edit里随便输入什么,再点击按钮进行子类化处理.这时再用一个密码探测工具对edit进行探测,是不是探测的结果就是sx啊,呵呵.

 

      不过我在编写中遇到两个问题,一:这个edit是屏蔽一切wm_gettext消息的,也就是说我程序本身想获取edit的text都不行,我暂时还没有想到解决办法.二:我在用wm_gettextlength消息进行测试时,发现无论如何子类处理函数都无法捕获这个消息.以上两个问题望各位解答,小弟在此不甚感激.

      以上代码在vc6.0 windows xp下编译通过,如有错误还请纠正.

原创粉丝点击