【MFC】工具栏
# 工具栏简述
Windows 下的工具栏通常是指放置工具的容器。
通常我们能在一些软件的菜单栏下见到,各类样式的图形按钮,被框在一栏中,这便是工具栏。
# 添加工具栏资源
右键 项目 , 添加 -> 资源
选择 Toolbar ,点击 新建 ,进入资源编辑界面。
自行折腾编辑界面,随便画几个图案,这就是你工具栏里面的工具按钮
设置资源 ID,这里我将工具栏 ID 设置为 IDR_TOOLBAR_1 ,工具按钮的 ID 依次为 ID_TOOLBAR_BUTTOR_1 、 ID_TOOLBAR_BUTTOR_2 、 ID_TOOLBAR_BUTTOR_3 。
资源编辑界面示范:
# 使用工具栏
工具栏的使用与菜单类似,只需要映射 WM_COMMAND 消息即可。
代码示例
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626 ...
【MFC】菜单
# 菜单简述
Windows 的菜单分为两类:
窗口菜单
弹出式菜单
窗口菜单是挂接到窗口上的;
弹出式菜单是根据程序设计者的需要在某处弹出的。
# 添加菜单资源
右键 项目 , 添加 -> 资源
选择 Menu ,点击 新建 ,进入资源编辑界面。
顶层菜单 (类型为窗口菜单) 添加一个项 新建 、顶层的子菜单 (类型为弹出式菜单) 添加一个项 文件
修改顶层菜单的资源为 IDR_MENU_TOP
修改顶层菜单的 新建 项的子菜单的 文件 项的资源为 ID_MENU_FILE_NEW 。
注:此处附注的菜单类型并不需要你在编辑时设置,是指明该菜单属于什么类型。
顶层菜单的类型就是 窗口菜单
顶层菜单的子菜单的类型就是 弹出式菜单
资源编辑界面示范:
# 使用窗口菜单
代码示例
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556#inclu ...
【C/C++逆向】数据类型的表现形式
db3f4eb17c2318c256622b6960219afda507dbc0f727563f20c8a378137edd144480af96f63ef9ac5ad29fe678f7a1b1
或许,需要什么魔法咒语?
【C/C++逆向】前言
当前分类所收录的文章主要是我个人学习 C/C++ 逆向时记录的读书笔记。
主要参考资料
《C++ 反汇编与逆向分析技术揭秘 (第 2 版)》. 钱林松、张延清
【逆向工具】常用工具推荐
工欲善其事,必先利其器。
这里收录了一些我个人常用并推荐的工具。
# 动态分析
# 软件调试
# x64dbg
面向未来的 Windows R3 调试器,开源,支持 x86/x64。
官方网站
https://x64dbg.com/
推荐插件
ret-sync
SharpOD
# WinDbg
微软家的东西,不仅能够调试应用,还能调试内核,学习内核必备的工具。
推荐辅助工具
VirtualKD-Redux
# 内存搜索
# Cheat Engine
大名鼎鼎的 CE,开源的内存修改工具,但不仅仅只能用于修改内存,其中依赖于调试机制的 "找出是什么访问 / 修改了这个地址" 等功能也非常好用。
官方网站
https://www.cheatengine.org/
# 进程监控
# Process Monitor
用于 Windows 的高级监控工具,能够实时监控进程的行为,如文件、注册表、网络等动作,对分析工作有很大的帮助。
下载地址
https://learn.microsoft.com/en-us/sysinter ...
【MFC】探索消息映射机制的实现原理
# 消息机制简述
我们知道,Windows 的窗口是由消息驱动的;
Windows 通过捕获鼠标、键盘等输入设备产生的动作,再生成对应的消息,并传递给相应的窗口所属的线程。
直接基于 Win32API 开发时,我们需要在注册窗口类时指定窗口过程函数,以告知 Windows 回调 (传递消息) 的入口。
# MFC 的消息映射
而 MFC 为我们提供了一种更为方便的机制,直接为一个消息与一个函数建立映射关系,在消息产生时,回调此函数,而不再需要我们去自行分发。
消息映射示例
123456789101112131415161718192021222324252627282930313233343536#include <afxwin.h>class CMyFrameWnd : public CFrameWnd { DECLARE_MESSAGE_MAP()public: LRESULT OnCreate(WPARAM wParam, LPARAM lParam) { AfxMessageB ...
【MFC】探索窗口创建机制的实现原理
# 何时创建窗口?
我们在直接使用 Win32API 开发窗口程序的时候,一般都是在消息循环之前调用相关的函数创建窗口,那么 MFC 的窗口是在何时被创建的呢?
实际上,我们重写了 CWinThread::InitInstance 成员虚函数,并在函数中编写了创建了窗口的代码;
根据我们之前分析的程序流程, CWinThread::InitInstance 的调用时机在 CWubApp::Run 之前,这自然也合情合理。
# 窗口的基本创建流程
还是之前的示例代码:
示例
1234567891011121314151617181920212223#include <afxwin.h>class CMyFrameWnd :public CFrameWnd {};class CMyWinApp :public CWinApp {public: CMyWinApp() { } virtual BOOL InitInstance() { ...
【MFC】探索程序启动机制的实现原理
# 全局对象的构造
C++ 的对象在创建时,会调用构造函数。
而全局对象的构造时机,自然应当在入口函数`main/WinMain`被调用之前,否则我们也就无法在入口函数中使用全局对象了。
这里以上节编写的示例代码为例,我们在代码中实例化了一个全局对象 g_theApp ,基于 VS 强大的源码调试能力,我们来对 MFC 程序的启动机制一探究竟。
示例
1234567891011121314151617181920212223#include <afxwin.h>class CMyFrameWnd :public CFrameWnd {};class CMyWinApp :public CWinApp {public: CMyWinApp() { } virtual BOOL InitInstance() { CMyFrameWnd* frame = new CMyFrameWnd; frame->Cre ...
【MFC】初识MFC
# MFC 简述
MFC (Microsoft Foundation Classes),微软基础类库;
是微软使用 C++ 的特性,在 Win32API 基础上再次进行的封装。
# MFC 基本使用
MFC 只是一个 C++ 类库,我们只需要对 C++ 有一定了解,就能够理解 MFC 的工作机制。
而微软的宇宙第一 IDE Visual Studio 本身也替我们做好了许多工作,这里以 vs2022 为例,对 MFC 的安装与使用进行简单的说明。
# 安装
运行 Visual Studio Installer
点击 修改
选择 单个组件 选项卡
搜索 MFC ,勾选需要的组件
点击 修改 ,等待完成即可
我这里已经装过了,就不重新做演示了
# 新建项目
运行 Visual Studio 2022
点击 创建新项目
选择 空项目
项目名称随意,我这里写 MFCTestProject
# 配置项目
由于是空项目,什么都没有,我们需要自行做一些必要的设置。
右键 MFCTestProject 项目,选择 属性
属性页 中选择 高级 选项卡
M ...