马大哈 发表于 2005-4-22 12:21:55

[原创]子类应用---保护你的密码框

<P>
VB的密码框是很脆弱的,如果操作系统是WIN98时更是如此,一行代码就可以得到星号下的密码.


怎么办?


还好,我们有子类技术!


以下是我写的一个简单例子,使用子类过程把取得密码的消息给过滤了.

其中也包含一个用ASM编写的星号查看器,很好用的哦!!(均有源码)</P>
<P>

</P>

小吧 发表于 2005-4-22 13:25:26

<P>好东西就别让它沉了 </P><P>支持!</P>

马大哈 发表于 2005-4-24 18:20:50

建议学习一下子类技术,相当有用的

马大哈 发表于 2005-4-24 18:21:51

建议学习一下子类技术,相当有用的

小吧 发表于 2005-4-24 18:50:20

<P>但我还是不怎么懂这个字类的含义</P><P>马哥多说点以后让我好好学学</P>

马大哈 发表于 2005-4-25 21:53:20

<P>每个控件,窗体等,其实都有一个背后的程序负责处理一些标准的事件,如最大化,最小化,关闭等.</P><P>而在VB里,这这个过程被封装了,我们看不到的.</P><P>使用自己定义的过程去代替这个VB默认的过程,就称为子类处理.</P><P>比如,你可以用子类过程代替你的窗体原处理过程,把最大化按钮变成关闭,把最小化按钮变最大化,哈哈.</P>

小吧 发表于 2005-4-25 21:58:41

<P>理解拉 哈哈</P>

伊儿 发表于 2005-5-3 21:13:58

加油加油,支持in

马大哈 发表于 2005-5-5 23:49:00

...........大家多多学习类与子类哦~~~

小吧 发表于 2005-5-6 02:15:28

呵呵 学习中 ................

马大哈 发表于 2005-5-10 23:49:28

好啊,先做做这个"EXE捆绑机"吧,呵呵.

小吧 发表于 2005-5-13 01:32:40

<P>看了马哥关于这个和滚轮的例子,有点明白了!</P><P>其实呢,字类的处理就是通过对windows的消息进行一些处理,而实现我们想达到的效果!! </P><P>其实任何的程序都是这样,系统有n多消息,只要把我们想要的进行个性处理,就会得到想要的效果拉!!</P><P>所以理解了系统的消息机制才是关键··</P><P>呵呵不知道自己理解的对不对 ,大家再帮俺这个小菜菜解释解释哈!!!</P>

马大哈 发表于 2005-5-23 17:40:11

<P>差不多是这样.</P><P>因为VB对我们的封装太严了,所以搞得VB程序员很多都不知道还有WndProc这个过程.</P><P>其实在窗体,按钮,以及任何的控件里,都有这样一个过程,负责处理控件的各种消息,比如,窗体的最大化,最小化,创建与关闭等.</P><P>而子类方式,就是用我们自己的过程来处理这些消息中的一部分.</P>

哈妹妹--猫 发表于 2005-6-10 20:16:57

<P>猫````看不懂~!</P><P></P>

小吧 发表于 2005-6-13 02:53:33

<P>我想到了钩子 !!</P>

马大哈 发表于 2005-8-19 16:50:51

<P>那个功能就需要HOOKAPI了,VB很难做到,效果也不尽人意.</P><P>一般这种程序是用C一类语言写的</P>

foshan 发表于 2005-11-4 17:00:54

马兄:您好!看了您的大作后,有两个疑问:
1、您的这个精品,是否是用来实现屏蔽、不屏蔽"取得文本(WM_GETTEXT)"这个消息的?即:当处于“子类处理状态”时,在 Text1 中输入的字符,不可以在 Text2 中将 Text1 中输入字符显示出来?而处于“正常状态”时,在 Text1 中输入字符时,在 Text2 中将 Text1 中输入字符显示出来?
如果是这样的话,为什么当处于“正常状态”或“子类处理状态”时,在 Text1 中输入的字符,均在 Text2 中将 Text1 中输入字符显示出来?我的环境是win-xp + office 2003

2、WM_GETTEXT 这个消息,是在什么时候发出来的?我在您的代码中,加了一句代码 MsgBox "已截获到 WM_GETTEXT 消息,准备屏蔽这个消息!" ,无论是处于“正常状态”或“子类处理状态”时,在 Text1 中输入的字符,均不见出来这个消息对话框的?换然之,在运行您的精品过程,无论是处于“正常状态”或“子类处理状态”时,根本没有 WM_GETTEXT 这个消息 ,从而也从对这个消息进行屏蔽了。

Public Function SubWndProc(ByVal Hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case MSG    '在这里进行过滤.如果知道其他的消息,也可以在这里过滤.
    Case WM_GETTEXT    '因为"取得文本"都是发的这个消息,所以嘛.....
      MsgBox "已截获到 WM_GETTEXT 消息,准备屏蔽这个消息!"
      Exit Function    '一旦发现从程序外部发来的这个消息,就什么也不做,直接返回!!
    End Select
    '    MsgBox "没有截获到 WM_GETTEXT 消息!"
    SubWndProc = CallWindowProc(PrevWndProc, Hwnd, MSG, wParam, lParam)    '其它消息不管
End Function

以上两点疑惑,请马兄在百忙中抽空详细解答,谢谢!

[此贴子已经被作者于2005-11-4 17:10:37编辑过]

马大哈 发表于 2005-11-4 18:20:22

"精品"不敢当.......

其实WM_GETTEXT消息一般并不需要在本程序内使用,从字面上就可以看出,它的功能是"取得文本".

而自己的程序里可以直接用属性嘛~~~

此消息一般是用于得到非本身程序内控件的文本,比如别人密码框里的密码....:)

由于它有这样的功能,所以我就在指定文本框的默认消息处理过程(WndProc)之前,插入一段我自己的消息处理程序,用于处理这个WM_GETTEXT消息,并把它过滤掉.

这样,无论是谁发了这个消息给文本框,我的过程都在它到达默认消息处理过程前把这个消息吃了.....那么此消息就无法达到它的目的了.(默认的处理程序里,应该是一收到这个消息,就把文本内容返回到发消息者那里去.-------不过我也是猜的)

因此,当插入了我的消息处理过程后,看星星一类软件就无效了.

不知道你注意包里的另一个用ASM写成的星号查看器没?当文本框在普通状态时,用它就可以看到星号的内容,而在子类处理状态时,就无效了------------当然,你也可以试一下其它的星号查看器:)

如果你还不是很理解,建议你去了解一下WINDOWS系统里的消息机制,还有就是一个控件工作的过程.

foshan 发表于 2005-11-5 12:29:28

谢谢马兄的详细地解答!“WM_GETTEXT消息一般并不需要在本程序内使用,从字面上就可以看出,它的功能是"取得文本"。此消息一般是用于得到非本身程序内控件的文本,比如别人密码框里的密码”,经您这么一说,我就明白了。
我对这项技术很感兴趣!我如何才能找到详尽的WINDOWS系统里的消息机制有关资料呢?
另外,请马兄能将“用子类过程代替你的窗体原处理过程,把最大化按钮变成关闭,把最小化按钮变最大化”作个示例,以便我们这些菜鸟加深对这方面的理解,谢谢!
[此贴子已经被作者于2005-11-5 12:33:49编辑过]

马大哈 发表于 2006-1-18 05:09:04

如果只是想下载代码,请直接使用游客账号就行了~~~~

马大哈 发表于 2006-2-22 12:19:35

VC我不太懂,不过如果无法使用子类,在VB的里原因大约就是没有句柄,也就是说,它是一个轻量控件.

而VC中Static控件是否也是这样呢?你看看它有没有句柄吧.

马大哈 发表于 2006-2-22 19:58:19

这个我帮不了你了...我也不会那个编辑器

马大哈 发表于 2006-3-8 15:12:49

我想,你用这个方法来拦截关闭消息可能不行的吧?

我也没有试过,不太好说

不过我建议你去看看WINDOWS消息机制相关的资料,应该可以找到针对"关闭消息"的应对办法吧.

hd37 发表于 2006-12-19 23:00:46

马大哈 发表于 2006-12-29 21:25:38

跨进程子类化是很麻烦.......我也在想办法中
页: [1]
查看完整版本: [原创]子类应用---保护你的密码框