MFC(Microsoft Foundation Classes)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数

MFC的事件和消息

事件

举一个例子:猎⼈在⼭中布置了⼀个陷阱,⼀头野猪掉进陷阱中了。这⾥的“野猪掉进陷阱”就是⼀个事件,但是这个事件发⽣时,猎⼈并不⼀定知道(猎⼈不可能⼀直盯着某个陷阱);如果猎⼈想要在猎物掉⼊陷阱中时⻢上知道,该这么做呢?在陷阱上布置⼀个铃铛,当猎物掉⼊陷阱时,铃铛响。猎⼈知道后就可以做出相应的处理了这⾥的“铃铛响”就是⼀个消息

事件会触发消息

事件发送了,不一定有消息

有消息传来,一般肯定有事件发送

消息:是被动的!你要自己安排时间去取出来看或检测

控件事件是主动的!当发生时会执行其对应的函数

关于MFC下的控件的事件和属性

CButton

事件:

1
2
BCN_HOTITEMCHANGE 
当⿏标进⼊或离开此按钮空间区域时发⽣该事件

CListCtrl

事件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
NM_CLICK ⽤户单击列表时发送此消息
NM_DBLCLK ⽤户双击列表时发送此消息
NM_RCLICK ⽤户右键单击列表时发送此消息
NM_RDBLCLK ⽤户右键双击列表时发送此消息
NM_KILLFOCUS 列表失去焦点时发送此消息
NM_OUTOFMEMORY 当内存溢出时产⽣
NM_SETFOCUS 当列表视图控件获得焦点时产⽣
LVN_BEGINDRAG ⿏标左键正在被触发以便进⾏拖放操作(当⿏标左键开始拖拽列表视图控件
中的项⽬时产⽣)
LVN_BEGINRDRAG ⿏标右键正在被触发以便进⾏拖放操作(当⿏标右键开始拖拽列表视图控
件中的项⽬时产⽣)
LVN_BEGINLABELEDIT 开始编辑项的⽂本
LVN_COLUMNCLICK ⽤户单击列表的列时发送此消息
LVN_DETELEITEM 当删除列表项时发送此消息
LVN_DELETEALLITEMS 删除所有项
LVN_ENDLABELEDIT 结束对项⽂本的编辑
LVN_GETDISPINFO 请求需要显示的信息
LVN_GETINFOTIP 请求显示在⼯具提示窗⼝内的附加的⽂本信息
LVN_HOTTRACK ⿏标滑过某个项
LVN_INSERTITEM 当向列表视图控件插⼊项⽬时产⽣
LVN_ITEMACTIVATE 激活某个项
LVN_ITEMCHANGED 某个项已经发⽣变化
LVN_ITEMCHANGING 某个项⽬正在发⽣变化
LVN_ITEMCHANGED 列表中的当前选择项将要改变时发送此消息
LVN_KEYDOWN 某个键被按下
LVN_MARQUEEBEGIN 开始某个边框选择
LVN_ODCACHEHINT 虚拟列表控件的显示区域的内容发⽣了变化 LVN_ODSTATECHANGED
虚拟列表的控件的某个项或某个范围内的项已经发⽣变化 LVN_ODFINDITEM 需要拥有者查找
⼀个特定的回调项
LVN_SETFOCUS 列表框获得焦点时发送此消息

属性:

1
2
3
4
5
6
7
8
9
View 列表视图的显示⻛格:图标(Icon)、⼩图标(Small Icon)、列表(list)、报表(Report)
Align 列表中的⽂本对⻬⽅式:顶端对⻬(top)、左对⻬(left)
Sort 列表中的记录排序:不排序(None)、升序(Ascending),降序(Descending)按照列表的第⼀列字⺟顺序排序
Border 选中时,使列表含有边框 Single selection 选中时,只能选择⼀条记录,否则,可以多⾏选择
Auto arrange 选中时, ⾃动对⻬⽹格上的项
No Label wrap 选中时,⽂本不折叠 Edit lables 选中时, 可以编辑标签
No scroll 选中时,列表不能滚动 No column header 选中时,列表没有列表头
No sort header 选中时,没有排序的表头
Show selection always 总是显示选择项

CComboBox

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CBN_CLOSEUP: 组合框的列表框组件被关闭,简易组合框不会发送该通知消息
CBN_DBLCLK: ⽤户在某列表项上双击⿏标,只有简易组合框才会发送该通知消息
CBN_DROPDOWN: 组合框的列表框组件下拉,简易式组合框不会发送该通知消息
CBN_EDITUPDATE: 在编辑框准备显示改变了的正⽂时发送该消息,下拉列表式组合框不会
发送该消息
CBN_EDITCHANGE: 编辑框的内容被⽤户改变了,与CBN_EDITUPDATE不同,该消息是在
编辑框显示的正⽂被刷新后才发出的,下拉列表式组合框不会发送该消息
CBN_ERRSPACE: 组合框⽆法申请⾜够的内存来容纳列表项
CBN_SELENDCANCEL: 表明⽤户的选择应该取消,当⽤户在列表框中选择了⼀项,然后⼜在
组合框控件外单击⿏标时就会导致该消息的发送
CBN_SELENDOK: ⽤户选择了⼀项,然后按了回⻋键或单击了下滚箭头,该消息表明⽤户确
认了⾃⼰所作的选择
CBN_KILLFOCUS: 组合框失去了输⼊焦点
CBN_SELCHANGE: ⽤户通过单击或移动箭头键改变了列表的选择
CBN_SETFOCUS: 组合框获得了输⼊焦点

CEdit:

事件:

1
2
3
4
5
6
7
8
EN_CHANGE 当编辑控件中的⽂本已被修改,在新的⽂本显示之后发送此消息
EN_ERRSPACE 编辑框控件⽆法申请⾜够的动态内存来满⾜需要
EN_HSCROLL 当编辑控件的⽔平滚动条被使⽤,在更新显示之前发送此消息
EN_KILLFOCUS 编辑控件失去键盘输⼊焦点时发送此消息
EN_MAXTEXT ⽂本数⽬到达了限定值时发送此消息
EN_SETFOCUS 编辑控件得到键盘输⼊焦点时发送此消息
EN_UPDATE 当编辑控件中的⽂本已被修改,在新的⽂本显示之前发送此消息
EN_VSCROLL 当编辑控件的垂直滚动条被使⽤,在更新显示之前发送此消息

属性:

1
2
3
4
5
6
7
8
9
10
11
12
Align text 各⾏⽂本对⻬⽅式:Left、Center、Right,缺省时为Left Multiline 选中时为多⾏编辑控件,否则为单⾏编辑控件
Number 选中时控件只能输⼊数字 Horizontal scroll ⽔平滚动,仅对多⾏编辑控件有效Auto
Hscroll 当⽤户在⾏尾键⼊⼀个字符时,⽂本⾃动向右滚动 Vertical scroll 垂直滚动,仅对多⾏编辑控件有效 Auto Vscroll 当⽤户在最后⼀⾏按ENTER键时,⽂本⾃动向上滚动⼀⻚,仅对多⾏编辑控件有效
Password 选中时,键⼊编辑控件的字符都将显示为“*”,仅对单⾏编辑控件有效。 No hide
selection 通常情况下,当编辑控件失去键盘焦点时,被选择的⽂本仍然反⾊显示。选中该项
时,则不具备此功能。
OEM convert 选中时,实现对特定字符集的字符转换。 Want return 选中时,⽤户按下
ENTER键,编辑控件中会插⼊⼀个回⻋符。
Border 选中时,在控件的周围存在边框。
Uppercase 选中时,编辑框中的字符全部⼤写。
Lowercase 选中时,编辑框中的字符全部为⼩写。
Read_Only 选中时,防⽌⽤户键⼊或编辑⽂本。

CListBox:

事件:

1
2
3
4
5
6
7
8
9
10
11
12
LBN_DBLCLK : ⽤户⽤⿏标双击了⼀列表项,只有具有LBS_NOTIFY 的列表框才能发送该消

LBN_ERRSPACE : 列表框不能申请⾜够的动态内存来满⾜需要 LBN_KILLFOCUS : 列表框失
去输⼊焦点
LBN_SELCANCEL: 当前的选择被取消,只有具有LBS_NOTIFY 的列表框才能发送该消息
LBN_SELCHANGE: 单击⿏标选择了⼀列表项,只有具有LBS_NOTIFY 的列表框才能发送该
消息
LBN_SETFOCUS: 列表框获得输⼊焦点
WM_CHARTOITEM: 当列表框收到WM_CHAR 消息后, 向⽗窗⼝发送该消息, 只有具有
LBS_WANTKEYBOARDINPUT ⻛格的列表框才会发送该消息
WM_VKEYTOITEM: 当列表框收到WM_KEYDOWN 消息后,向⽗窗⼝发送该消息,只有具有
LBS_WANTKEYBOARDINPUT ⻛格的列表框才会发送该消息

以上的!!遇到了在查

MFC的程序编写和安全分析

image-20230511224949238 image-20230511225006076 image-20230511225015441

创建好后

image-20230511231710891

找到这个位置。利用工具箱。把东西写好

image-20230511231815667

用工具箱里面的 static text 和 button 和 edit control 创建好和上图一样后。编译运行。生成一个exe。

我们运⾏起来发现,随便输⼊⼀个字他会弹出失败了,再来⼀次吧的弹窗。那么我们尝试去破解他,使其我们输⼊啥,他都会提示我们破解成功!

首先把它放入od 里面

image-20230512132420909

通过全局搜索,找到我们破解的地方

image-20230512132441479

点进去

image-20230512132454309

看到这句话之前有一个je 的跳转,我们知道je的跳转就是说ZF标志位=1就会跳转

我们在前面的call【我觉得这里是调用对话框的一个cakl】设置一个断点,然后运行程序。在程序中随便输入一个值后,程序停下来了。

image-20230512132725671

这个时候,我们单步运行。在je之前。发现zf标志位是1.我们人为的把他改成0后继续运行

image-20230512132738474

ok 破解成功…..