发布时间:2023-11-27 22:43:34 浏览量:147次

上一节我讲解了CE的使用,这一节我讲解一下windows下C/C++的在以后外挂编程中会用到的知识,内联汇编和C++MFC的DLL编写。这两个基本知识都是以后外挂中都会用到的,但是不一定是现在的高级语言编写者都会的知识。我虽然第一个语言是C但是我还是以C#发家的(毕业后一直主打的还是.NET平台的C#开发)。
1.C/C++中内联汇编代码:新建一个windows 控制台项目代码如下
#include "stdafx.h"
extern int add(int a,int b);//方法声明
int main(int argc, _TCHAR* argv[])
{
int re;
re=add(1,3);//调用add方法
printf("%d",re);
scanf_s("%d",&re);//纯粹为了停顿查看控制台输出的结果
return 0;
}
int add(int a,int b){
_asm{//汇编代码块
mov eax,a
add eax,b
mov b,eax
}
return b;
}
很容易看到在被调用的add方法中嵌入了汇编代码。不难看出运行结果为4。以下是图和真相
通过这个简单的内联汇编我相信大家都熟悉了C/C++中嵌入汇编代码的方式,主要上就是放在_asm{}中。当然这其中的代码和真正的汇编还是有点区别的。让我们来看一下反汇编后的代码:
extern int add(int a,int b);//方法声明
int main(int argc, _TCHAR* argv[])
{
00143A30 push ebp
00143A31 mov ebp,esp
00143A33 sub esp,0D0h
00143A39 push ebx
00143A3A push esi
00143A3B push edi
00143A3C lea edi,[ebp-0D0h]
00143A42 mov ecx,34h
00143A47 mov eax,0CCCCCCCCh
00143A4C rep stos dword ptr es:[edi]
00143A4E mov eax,dword ptr ds:[0014800Ch]
00143A53 xor eax,ebp
00143A55 mov dword ptr [ebp-4],eax
int re;
re=add(1,3);//调用add方法
00143A58 push 3
00143A5A push 1
00143A5C call add (01411D6h)
00143A61 add esp,8
00143A64 mov dword ptr [re],eax
printf("%d",re);
00143A67 mov esi,esp
00143A69 mov eax,dword ptr [re]
00143A6C push eax
00143A6D push 1458A8h
00143A72 call dword ptr ds:[1492BCh]
00143A78 add esp,8
00143A7B cmp esi,esp
00143A7D call __RTC_CheckEsp (01411E0h)
scanf_s("%d",&re);//纯粹为了停顿查看控制台输出的结果
00143A82 mov esi,esp
00143A84 lea eax,[re]
00143A87 push eax
00143A88 push 1458A8h
00143A8D call dword ptr ds:[1492B8h]
00143A93 add esp,8
00143A96 cmp esi,esp
00143A98 call __RTC_CheckEsp (01411E0h)
return 0;
00143A9D xor eax,eax
}
这是main函数反汇编过来的。下面我们看看add函数的反汇编代码:
int add(int a,int b){
001417A0 push ebp
001417A1 mov ebp,esp
001417A3 sub esp,0C0h
001417A9 push ebx
001417AA push esi
001417AB push edi
001417AC lea edi,[ebp-0C0h]
001417B2 mov ecx,30h
001417B7 mov eax,0CCCCCCCCh
001417BC rep stos dword ptr es:[edi]
_asm{//汇编代码块
mov eax,a
001417BE mov eax,dword ptr [a]
add eax,b
001417C1 add eax,dword ptr [b]
mov b,eax
001417C4 mov dword ptr [b],eax
}
return b;
001417C7 mov eax,dword ptr [b]
}
从中可以看出C中内联汇编和汇编指令还是有点区别的。在main主函数中call add这个就是调用add函数,再往call add前面看,大家可以看到被调用的add参数被从右到左的放到堆栈中去了(汇编基础知识)。至于add函数的返回值就放到通用寄存器eax中。汇编中函数放回值都是放到eax中,add函数中有这样一行汇编mov eax,dword ptr [b]。其中 call add后面有add esp,8这个是为了保持堆栈平衡。这是高级语言中我们不需要关注的东西,其它的就不多说了。更多的还是自己去掌握汇编吧,毕竟汇编知识还是比较丰富的,三言两语讲不清。这里我只是让大家能看懂大致的脉络。在外挂编程中我们很多时候是通过内联汇编去call游戏线程中的某个方法,例如我们call补金疮药或者魔药的过程,可以实现自动喝药。这是基本的外挂过程。
2.C++MFC DLL的编写:从其他语言过来可能不知道C++写DLL。C++DLL有很多种方式去写。这里我就介绍MFC DLL。它最容易上手。DLL的用处是什么呢??其它用处我就不说了,只说在外挂中什么作用。在外挂中我们需要进程注入。前面讲过,每个程序都有一个自己私有的4G进程空间(32位系统,0x00000000~0x7FFFFFFF空间属于应用程序的空间,高地址空间是属于操作系统的),起到保护进程的作用。那么我们怎么控制另个一程序呢??这时候我们就要想到将我们的代码放到被控制的进程空间中去,可是正常情况下,在一个程序中正常情况下是访问不到另一个程序进程空间的。这时候我们可以用进程注入的方式将我们的DLL注入到游戏进程空间中去。我比较常用的两种方式其一是通过WriteProcessMemory的方式直接写进去,另一种方式是通过钩子的形式注入。这两种注入方式在后面的章节中再做介绍。开始去写一个DLL在项目解决方案上面添加项目(我用的是vs2012).然后选择C++,在选择MFC,选择MFC DLL.在源文件后面添加一个add方法;
int add(int a,int b){
return a+b;
}
然后一步非常重要需要暴露出来。在def文件中放入这个函数名称
def中的代码是:

; MFCLibrary1.def : 声明 DLL 的模块参数。 LIBRARY EXPORTS ; 此处可以是显式导出 add
这样就将add函数暴露到了DLL外面。这样在exe中就可以调用了;
exe程序中的调用代码如下:
// ASMTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#pragma comment(lib,"MFCLibrary1.lib")
extern int add(int a,int b);
int main(int argc, _TCHAR* argv[])
{
int re=3;
re=add(1,3);//调用add方法
printf("%d",re);
scanf_s("%d",&re);//纯粹为了停顿查看控制台输出的结果
return 0;
}
//int add(int a,int b){
//
// _asm{//汇编代码块
// mov eax,a
// add eax,b
// mov b,eax
//
// }
// return b;
//}
#pragma comment(lib,"MFCLibrary1.lib")这是其中一种调用方式。别忘了声明extern int add(int a,int b);否则找不到add方法。 这样,实现了一个DLL和对DLL的调用。为后面注入DLL做好铺垫。
作者:egojit
原文
:https://www.cnblogs.com/egojit/archive/2013/06/15/3135607.html

热门资讯
探讨游戏引擎的文章,介绍了10款游戏引擎及其代表作品,涵盖了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戏设计领域和数字艺术教育的重要性,欢迎点击咨询报名。
2. 手机游戏如何开发(如何制作传奇手游,都需要准备些什么?)
如何制作传奇手游,都需要准备些什么?提到传奇手游相信大家都不陌生,他是许多80、90后的回忆;从起初的端游到现在的手游,说明时代在进步游戏在更新,更趋于方便化移动化。而如果我们想要制作一款传奇手游的
3. B站视频剪辑软件「必剪」:免费、炫酷特效,小白必备工具
B站视频剪辑软件「必剪」,完全免费、一键制作炫酷特效,适合新手小白。快来试试!
游戏中玩家将面临武侠人生的挣扎抉择,战或降?杀或放?每个抉定都将触发更多爱恨纠葛的精彩奇遇。《天命奇御》具有多线剧情多结局,不限主线发展,高自由...
三昧动漫对于著名ARPG游戏《巫师》系列,最近CD Projekt 的高层回应并不会推出《巫师4》。因为《巫师》系列在策划的时候一直定位在“三部曲”的故事框架,所以在游戏的出品上不可能出现《巫师4》
6. 3D动画软件你知道几个?3ds Max、Blender、Maya、Houdini大比拼
当提到3D动画软件或动画工具时,指的是数字内容创建工具。它是用于造型、建模以及绘制3D美术动画的软件程序。但是,在3D动画软件中还包含了其他类型的...
7. Bigtime加密游戏经济体系揭秘,不同玩家角色的经济活动
Bigtime加密游戏经济模型分析,探讨游戏经济特点,帮助玩家更全面了解这款GameFi产品。
想让你的3D打印模型更坚固?不妨尝试一下Cura参数设置和设计技巧,让你轻松掌握!
众所周知,虚幻引擎5(下面简称UE5)特别占用存储空间,仅一个版本安装好的文件就有60G,这还不包括我们在使用时保存的工程文件和随之产生的缓存文件。而...
10. 3D动漫建模全过程,不是一般人能学的会的,会的多不是人?
步骤01:面部,颈部,身体在一起这次我不准备设计图片,我从雕刻进入。这一次,它将是一种纯粹关注建模而非整体绘画的形式。像往常一样,我从Sphere创建它...
最新文章
同学您好!