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,一经查实,立即删除!

相关文章

基于UDP的网络编程

UDP服务端 #ifdef _WIN32 #define _WINSOCK_DEPRECATED_NO_WARNINGS #define close closesocket #include <winsock2.h> #else #include <arpa/inet.h> #include <netdb.h> #include <netinet/in.h> #in…

leetcode中sql题目分类与总结

基础50题 聚合函数 项目员工&#xff0c;连接 avg group by各项函数用户的注册率&#xff1a;直接单表操作&#xff0c;count函数的使用&#xff0c;结合round进行保留小数。1211. 查询结果的质量和占比&#xff1a;简单的avg, sum(if(,,))的使用1193. 每月交易 I&#xff…

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

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

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

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

FTP的基本介绍

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

Android Studio实现课表

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

C语言中的递归函数的简单应用

C语言中的递归函数的简单应用 递归函数简介注意 使用示例求n的阶乘分析问题&#xff1a;代码示例&#xff1a; 求Fibonacci数列分析问题&#xff1a;代码示例 求最大公约数分析问题&#xff1a;代码一&#xff1a;辗转相减法&#xff1a;代码二&#xff1a;辗转相除法&#xff…

第十一章 创建Callout Library - 使用 J 链接类型传递标准计数字符串

文章目录 第十一章 创建Callout Library - 使用 J 链接类型传递标准计数字符串使用 J 链接类型传递标准计数字符串使用 J 连接传递字符串 第十一章 创建Callout Library - 使用 J 链接类型传递标准计数字符串 使用 J 链接类型传递标准计数字符串 iris-callin.h 头文件定义了计…

SSM框架(Spring + SpringMVC + Mybatis)

MVC即model view controller。&#xff08;模型&#xff0c;视图&#xff0c;控制器&#xff09; entity层(model层&#xff0c;domain层) 用于存放我们的实体类&#xff0c;类中定义了多个类属性&#xff0c;并与数据库表的字段保持一致&#xff0c;一张表对应一个类。主要用…

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

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

用Qt开发的十大理由

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

[verilog] 免费开源的 verilog 仿真工具:icarus verilog

主页: 元存储博客 文章目录 前言1. 下载2. 安装3. 安装成功?4. 使用总结前言 知名的Verilog仿真工具主要为三大主流的产品:mentor的modelsim/questasim,candence的NC-verilog,synopsys的VCS。但都不是免费的,所以我一个都不讲。 作为verilog入门学习的仿真工具,有时候…

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

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

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

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

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

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

数据通信网络基础的网络参考模型华为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学习-时间和窗口

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

WPF 基础(Binding 二)

续接上文&#xff0c;本章继续讲解WPF Binding相关知识&#xff0c;主要内容是绑定的模式和绑定源&#xff08;Source&#xff09; 5绑定模式 在使用Binding类的时候有4中绑定模式可以选择 BindingMode TwoWay导致对源属性或目标属性的更改可自动更新对方。此绑定类型适用于…

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

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

【更新】cyのMemo(20231231~)

序言 最终&#xff0c;无事发生&#xff0c;我的跨年是在图书馆&#xff08;因为我忘带卡打不开实验室门&#xff09;&#xff0c;和去年一样。其实我并不想去图书馆&#xff0c;但是觉得在床上跨年太颓废&#xff0c;找个好点的处所&#xff0c;至少说得过去些。人嘛&#xf…