MFC消息机制详细剖析

易语言程序的破解99%的时候都需要用到FF55FC5F5E这个特征码 

新建一个MFC应用程序:

  

去编辑MFC的.rc资源文件来DIY窗体 

静态编译的,把很多静态库的代码都添加进去了 ,所以速度很慢

消息机制针对的是GUI程序(比如窗口程序),你点击关闭按钮,会产生一个消息,首先OS捕获这个消息,然后通过user32.dll里面的函数来处理,给你挂到对应进程的消息队列当中(在内核区),然后用户程序的WinMain循环取出消息, 

把程序在od当中暂停下来,查看他的调用堆栈,在最上面的函数是最先被调用的

模态对话框的本质就是UI线程阻塞,主线程卡住while(1)等待弹出的对话框返回消息,不然就一直执行弹出的对话框当中的逻辑,直到你点击确定或者关闭,才会break掉这个while(1),主线程才能根据这个返回的结果进行后续的相关处理,如果你觉得这样空跑CPU的话也可以使用PV原语把主线程阻塞:

编写GUI程序的时候,窗体创建出来之后,他里面是有一个死循环的,接收所有和他有关的消息,里面的空间当然也可以给外界发消息

从AFX开始的函数是MFC接收系统消息的函数:

在VS当中如何打开调用堆栈?

先把程序断在自己想要的位置 》调试》窗口》调用堆栈:

从OS的消息派发,一直传递到MFC消息队列,最后传到OnClickBtn

其中最重要的函数就是_AfxDispatchMsg了:

这里强调一下:和Win32程序不同,MFC的消息回调函数是由MFC的其他代码自己调用,而win32的是操作系统的user32模块帮我们调用的

MFC当中所有的按钮事件的函数都会先走到这里,即使在按钮事件当中什么代码都没写:

其中最重要的参数就是pfn!我的好兄弟,这里面直接把函数地址扔给你了!!还不感谢大自然的馈赠!!!😂😂😂:

我们在od当中,直接ctrl+g转到afxdispatchMsg函数 

在函数的头部push ebp下断,断下来之后我们直接看他的堆栈,第一个就是返回地址,对于stdcall是从右往左压栈的,然后从堆栈的视角,是从下往上生长的,所以应该从返回地址正着往下数第四个参数就是pfn,实际上od已经帮你标注好了,但是为了防止别人做手脚,我们就用最基本的方法来找pfn

我们可以回到上级调用查看一下,在反汇编窗口中,距离call最近的是第一个参数: 

在数据窗口中跟随:

然后我们ctrl+g转到011b8e这个地址,发现果然是按钮事件处理函数:

在C语言代码中,执行以下语句,代表进入按钮事件处理函数了:

特征码提取原则:

1、有call不行,如果有,一律用??替换掉call后面的绝对地址

2、常量不行,如果有,一律用??代替4位绝对地址

注意:

游戏辅助99%需要提取特征码,主要是为了防止游戏更新你可以快速定位到关键位置!这样就不用每次都重新找基址了!!!

特征码的本质就是从茫茫的4GB当中如何快速进入我想要的函数体里面!!!

教你个小技巧:白色划线的就是常量的地址 

加上调试信息之后就有了,这从侧面向我们证实了调试符号的重要性!!!

  

快速查找小技巧:二进制复制》win+r》输入notepad》粘贴

常量:[0x12345678],不行

push 0x123 》立即数,可以

大多情况下别人发布的软件是肯定没有调试信息的,就需要我们把关键函数(按钮点击)/MFC走到按钮事件的afxdispatchmessage函数

在内存m窗口,从头开始搜索,一定能够搜到:

注:内存是程序的所有身家,进程所有的秘密都在这里,只是有可能被加密罢了

然后在反汇编窗口转到这个地址,下断点:

然后找到他的第四个参数,把里面的地址复制出来:

在反汇编窗口转到这个地址:

搜特征码一定从内存窗口里面搜!!!

注意!!!afxdispatchmsg函数只分发按钮事件!!! 

重要博弈!!!

①当人们都知道要防按钮事件的时候,我们就需要提取afxdispatch的特征码了,如果人们又都知道afxdispatch了,我们就需要提取pumpmessage的特征码了,进一步推理,我们可以一直跟到afxwinmain甚至要在user32那里开始博弈!!!

②由于所有MFC程序的afxdispatch都一样,所有你提取出来的特征码可以适用于所有的MFC程序,当然release版本是经过优化了,所以还要再单独提取一份

思考:如果对方每次编译生成不同的编码应该怎么办?如果对方重写MFC的接口走自己的消息处理机制应该怎么办?

易语言的调试符号在tools/link.ini位置 

取消掉注释+/DEBUG:FULL即可生成pdb文件了

如果有pdb文件的话:

直接秒了,函数名什么的都给你显示出来了

本来别人看不懂你这个call是干什么的,一旦有了函数名就直接秒了

注意:在Debug版本当中,编译的信息都是编译到PE文件当中的,pdb是辅助调试的,有了pdb文件就不用把所有调试信息都放到PE文件当中了,使得exe文件特别大,只要把一小部分调试信息放进去就彳亍了,这就是为什么没有pdb文件od仍然能解析出来一部分调试信息 

逆向的本质:研究各种语言底层是怎么实现的,因为那是我们博弈的平台 

jmp:增量链接

如何防止别人用ff55fc5f5e拿捏我们?

》加钟,添加时钟可以让ff55fc5f5e一直断下来

如何破解?

》条件断点:[ebp-4]!=0x12345678

一个小案例:

平时我们写寻路call的时候会碰到线程随机崩掉的现象,还找不到原因?

》因为游戏修改全局变量的代码只能在主线程实现

解决方法:

小白:写一堆时钟,不用线程了,把寻路call全部写到时钟里面,而时钟又是在主线程当中执行的,就解决了这个bug

正确解决方案:绑定主线程,使用线程之间通信,在主线程当中写一个循环,你需要用到全局变量就给主线程发消息,在主线程当中回调去执行修改全局变量的代码,不涉及到修改全局变量的代码就在自己的线程当中执行

手动实现窗体的push大法:

ff25这个位置是易语言体

可以使用od的EWND插件,我这边也有源码,如果有需要的同学可以联系我要一下

OKOK,今天就先到这里来,我们下期再见吧!!!💕💕🤞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/283139.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有道翻译web端 爬虫, js

以下内容写于2023-12-28, 原链接为:https://fanyi.youdao.com/index.html#/ 1 在输入框内输入hello world进行翻译,通过检查发出的网络请求可以看到翻译文字的http接口应该是: 2 复制下链接最后的路径,去js文件中搜索下: 可以看到这里是定义了一个函数B来做文字的翻译接口函数…

快速部署supervisord详解

Supervisor是一个用于监控和管理进程的工具。它可以在Unix-like系统中启动、停止、重启和管理后台进程,确保这些进程始终保持运行状态。 yum check-update 更新yum软件包索引 yum install epel-release -y 下载eprl源 yum install supervisor -y 直接yu…

给多行文本的每行添加指定的前缀textwrap.indent()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 给多行文本的每行添加指定的前缀 textwrap.indent() [太阳]选择题 请问以下代码输出的第一行结果是? import textwrap text welcome to China! print("【显示】text\n&quo…

WEB 3D技术 three.js通过 GLTFLoader 导入并应用 gltf/glb 3D资源

上文 WEB 3D技术 three.js 雾 基础使用讲解我们讲了雾的基本使用方法 但是 如果我们要做一个树林 一颗一颗树去加 那真的是要累死了 我们一定是在建模软件上 建模好这样的模型 然后将模型导入到场景中 官网中搜索 GLTFLoader 在我们日常WEB开发中 用的最多的3D格式 就是 GLTF…

Linux---进程控制

一、进程创建 fork函数 在Linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程,原进程为父进程 fork函数的功能: 分配新的内存和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统的进程列表中fork返…

B+树的插入删除

操作 插入 case2的原理,非叶子节点永远和最右边的最左边的节点的值相等。 case3:的基本原理 非叶子节点都是索引节点 底层的数据分裂之后 相当于向上方插入一个新的索引(你可以认为非叶子节点都是索引),反正第二层插入160 都要分裂,然后也需要再插入(因为索引部分不需要重…

x-cmd pkg | openssl - 密码学开源工具集

目录 简介首次用户技术特点竞品分析进一步阅读 简介 OpenSSL 是一个开源的密码库和 SSL/TLS 协议实现,它提供了一组密码学工具和加密功能,用于保护数据通信的安全性。项目发展历史可以追溯到 1998 年,源自 Eric A. Young 和 Tim J. Hudson 开…

【后端】Docker学习笔记

文章目录 Docker一、Docker安装(Linux)二、Docker概念三、Docker常用命令四、数据卷五、自定义镜像六、网络七、DockerCompose Docker Docker是一个开源平台,主要基于Go语言构建,它使开发者能够将应用程序及其依赖项打包到一个轻…

java零拷贝zero copy MappedByteBuffer

目录 调用操作系统的 mmap 未使用 mmap 的文件通过网络传输的过程 使用 mmap 的文件通过网络传输的过程 使用例子 调用操作系统的 sendfile() 在 java 中的具体实现 mmap的优劣 mmap 的不足 mmap 的优点 mmap 的使用场景 对于零拷贝(zero copy&#xff09…

LVGL 在framebuffer设备上的移植

LVGL 在framebuffer设备上的移植 ItemDescDate2023-12-31Authorhongxi.zhuplatformNXP I.MX6ULLLCDSPI TFTLCD NV3030B 文章目录 LVGL 在framebuffer设备上的移植一、LVGL源码获取二、源码修改适配三、编译&运行补充 一、LVGL源码获取 新建lvgl_imx6ull文件夹&#xff0c…

【基础】【Python网络爬虫】【10.验证码处理】OCR识别,Tesseract ,ddddocn识别,打码平台,滑块验证码(附大量案例代码)(建议收藏)

Python网络爬虫基础 验证码处理一. OCR识别1. Tesseract 引擎的安装windows引擎环境安装Mac系统引擎环境安装安装 tesseract查看 tesseract 版本安装过程遇到的报错解决方法下载中文包中文包存放目录查看全部语言库python 安装 pytesseract 和 pillow识别图片中文字体 Linux系统…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机本身的数据保存(CustomData)功能(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机本身的数据保存(CustomData)功能(C#) Baumer工业相机Baumer工业相机的数据保存(CustomData)功能的技术背景CameraExplorer如何使用图像剪切&#xff…

【42页动态规划学习笔记分享】动态规划核心原理详解及27道LeetCode相关经典题目汇总

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推荐--…

MIT线性代数笔记-第35讲-期末复习

目录 35.期末复习打赏 35.期末复习 已知一个矩阵 A A A满足 A x ⃗ [ 1 0 0 ] A \vec{x} \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} Ax ​100​ ​无解且 A x ⃗ [ 0 1 0 ] A \vec{x} \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} Ax ​010​ ​仅有一个解 (1)求 A A A的…

Linux驱动学习—pinctl和gpio子系统

1、pinctl和gpio子系统&#xff08;一&#xff09; 1.1pinctrl 子系统主要工作内容 <1>获取设备树中 pin 信息&#xff0c;管理系统中所有的可以控制的 pin&#xff0c; 在系统初始化的时候&#xff0c; 枚举所有可以控制的 pin&#xff0c; 并标识这些 pin。 <2>…

burpsuite模块介绍之compare

导语 Burp Comparer是Burp Suite中的一个工具&#xff0c;主要提供一个可视化的差异比对功能&#xff0c;可以用于分析比较两次数据之间的区别。它的应用场景包括但不限于&#xff1a; 枚举用户名过程中&#xff0c;对比分析登陆成功和失败时&#xff0c;服务器端反馈结果的区…

python脚本实现一次提取多个文件下的图片

problem formulation 有时候下载的数据集如下&#xff0c;就很烦&#xff0c;一个里面就一张图片 code import os import shutil# 定义源目录和目标目录 source_dir ./dataset/data/Detection destination_dir ./dataset/data/img# 确保目标目录存在&#xff0c;如果不存…

初识大数据,一文掌握大数据必备知识文集(7)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

pycharm python环境安装

目录 1.Python安装 2.PyQt5介绍 3.安装pyuic 4.启动designer.exe 5.pyinstaller(打包发布程序) 6.指定源安装 7.PyQt5-tools安装失败处理 8.控件介绍 9.错误记录 1.NameError: name reload is not defined 10.开发记录 重写报文输出和文件 ​编辑 1.Python安装 点…

BFS

目录 BFS 走迷宫 BFS 算法特点 优先考虑宽度&#xff0c;换句话说就是按层推进&#xff0c;直到最后一层。 空间复杂度&#xff1a;O&#xff08;2^h&#xff09; BFS是按宽度搜索&#xff0c;所以可以找到最短路&#xff0c;适用于解决像最短路&#xff0c;最少之类的问题…