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,今天就先到这里来,我们下期再见吧!!!💕💕🤞

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高颜值的第三方网易云播放器

嗨喽!GitHub科技的各位小伙伴们,为了能够第一时间及时送达到大家手上,大家记得给博主点点关注每天会送上各种好评技术干货推文 ! 本期推荐开源项目目录: YesPlayMusic eDEX-UI:超炫酷终端工具 Calculato…

微软开源,全平台通用:Shell 自动补全工具 | 开源日报 No.132

microsoft/inshellisense Stars: 7.6k License: MIT inshellisense 是一个为 Shell 提供 IDE 风格自动补全的工具。它是一个终端本地运行时自动完成,支持 600 多个命令行工具,并且可以在 Windows、Linux 和 macOS 上使用。主要功能包括安装后可通过运行…

FTP的基本介绍

FTP ftp的介绍: ftp是一个可以提供共享文件的服务器,他可以通过iis.msc也就是windows 的服务器管理器来打开,或者通过cmd命令行打开 如何使用iis.msc打开ftp,如何使用cmd打开ftp ,如何匿名登录ftp,ftp和…

Android Studio实现课表

本文章主要展示课表的实现,里面包含很多控件的用法,比如吐司Toast、通知Notification、ListView,数值选择器NumberPicker,SeekBar同editText的关联。抽屉导航栏 还有一些其他的功能,比如InputFilter自定义的字符过滤器…

排序整形数组--------每日一题

大家好这是今年最后的一篇了,感谢大家的支持,新的一年我会更加努力地。 文章目录 目录 文章目录 题⽬描述: 输⼊10个整数,然后使⽤冒泡排序对数组内容进⾏升序排序,然后打印数组的内容 一、题目解读 冒泡排序是⼀种基础…

用Qt开发的十大理由

#1 完美的用户体验 “就最终体验、性能和特性而言,Qt 绝对是开发Radeon SoftwareCrimson Edition的正确选择。”“MBUS 是梅赛德斯-奔驰汽车内的全新用户体验。我们用 Qt 开发了绝大部分的UI体验和软件,包括屏幕动画,屏幕间的过渡和小组件。Qt 使我们能够快速开发出原型系统…

Linux进行模型微调前的环境准备

在Linux机器上对模型进行微调前,首先需要准备环境,即安装相关的软件。因为linux是一个无界面操作系统,软件安装完成后,还需要有便捷的交互方式编写脚本,调试脚本。此篇博客将专门介绍如何快速安装所需依赖软件&#xf…

2023-12-25 LeetCode每日一题(不浪费原料的汉堡制作方案)

2023-12-25每日一题 一、题目编号 1276. 不浪费原料的汉堡制作方案二、题目链接 点击跳转到题目位置 三、题目描述 圣诞活动预热开始啦,汉堡店推出了全新的汉堡套餐。为了避免浪费原料,请你帮他们制定合适的制作计划。 给你两个整数 tomatoSlices …

全志R128 DSP开发工具安装教程

资料准备 要编译和仿真DSP,需要以下资料: DSP 核 SDK,SDK 需要包含DSP 编译源码。Cadence Xtensa 的 Windows IDE 工具 (Xplorer‑8.0.13 版本), Windows 版本 DSP 的 package 包。Cadence Xtensa 的 License,用于服…

数据通信网络基础的网络参考模型华为ICT网络赛道

网络参考模型 目录 网络参考模型 2.1.应用与数据 2.2.网络参考模型与标准协议 2.2.1.OSI参考模型 2.2.2.TCP/IP参考模型 2.2.3.应用层 2.2.4.传输层 2.2.5.TCP和UDP 2.2.6.网络层 2.2.7.数据链路层 2.2.8.物理层 2.3.数据通信过程 2.1.应用与数据 应用的存在&#…

Flink学习-时间和窗口

在流数据处理应用中,一个很重要、也很常见的操作就是窗口计算。所谓的“窗口”,一 般就是划定的一段时间范围,也就是“时间窗”;对在这范围内的数据进行处理,就是所谓的 窗口计算。所以窗口和时间往往是分不开的。 时…

面试手撕算法高频专题:数组的双指针思想及应用(算法村第三关白银挑战)

所谓的双指针其实就是两个变量,不一定真的是指针。 快慢指针:一起向前走对撞指针、相向指针:从两头向中间走背向指针:从中间向两头走 移除值为val的元素 题目描述 27. 移除元素 - 力扣(LeetCode) 给你…

12.31_黑马数据结构与算法笔记Java

目录 345 设计跳表 Leetcode 1206 346 设计最小栈 Leetcode 155 347 设计端网址 Leetcode 355 348 设计推特 Leetcode 355 349 股票系列问题 Leetcode 121 350 股票系列问题 Leetcode 122 351 股票系列问题 Leetcode 714 352 股票系列问题 Leetcode 309 353 股票系列问…

【CISSP学习笔记】6. 安全开发

该知识领域涉及如下考点,具体内容分布于如下各个子章节: 理解安全并将其融入软件开发生命周期 (SDLC) 中在软件开发环境中识别和应用安全控制评估软件安全的有效性评估获得软件对安全的影响定义并应用安全编码准则和标准 6.1. 系统开发控制 6.1.1. 软…

以太网转RS485通讯类库封装

最近选用有人科技的以太网转RS485模块做项目,设备真漂亮,国货之光。调通了通讯的代码,发到网上供大家参考,多多交流。 以下分别是配套的头文件与源文件: /*******************************************************…

EOS开发Ubuntu安装EOSIO.CDT(Install the EOSIO.CDT)

EOS开发Ubuntu安装EOSIO.CDT(Install the EOSIO.CDT) EOSIO.CDT介绍:EOSIO合约开发工具包,简称CDT,是与合约编译相关的工具集合。而且后续教程主要使用 CDT 来编译合约和生成 ABI,不要忽略。 刚才我们安装好…

Octave处理高斯光束

文章目录 读取图像截取感兴趣区域强度图拟合 Octave是一种开源的数值计算软件,主要用于科学计算、数据分析和数值模拟等领域。既提供了一个用户友好的命令行界面,使用户能够通过输入简单的命令来进行各种数学运算和数据操作。也提供了功能完备的GUI窗口&…

关于LayUI表格重载数据问题

目的 搜索框搜索内容重载数据只显示搜索到的结果 遇到的问题 在layui官方文档里介绍的table属性有data项,但使用下列代码 table.reload(test, {data:data //data为json数据}); 时发现,会会重新调用table.render的url拿到原来的数据,并不会显示出来传…

看懂基本的电路原理图(入门)

文章目录 前言一、二极管二、电容三、接地一般符号四、晶体振荡器五、各种符号的含义六、查看原理图的顺序总结 前言 电子入门,怎么看原理图,各个图标都代表什么含义,今天好好来汇总一下。 就比如这个电路原理图来说,各个符号都…

文件监控-IT安全管理软件

文件监控和IT安全管理软件是用于保护企业数据和网络安全的工具。这些工具可以帮助企业监控文件的变化,防止未经授权的访问和修改,并确保数据的安全性和完整性。 一、具有哪些功能 文件监控软件可以实时监控文件系统的活动,包括文件的创建、修…