博客最近都没有时间更新了,一直都比较忙,开学了,不少事情啊,不过我一直没有停下学习的脚步.记得前面说过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下编译通过,如有错误还请纠正.