芋头,游戏外挂开发之C/C++内联汇编代码和DLL,西平天气预报

频道:科研发现 日期: 浏览:124

上一节我解说了CE的运用,这一节我解说一下windows下C/C++的在今后外挂编程中会用到的常识,内联汇编和C++MFC的DLL编写。这两个根本常识都是今后外挂中都会用到的,但是纷歧定是现在的高档言语编芋头,游戏外挂开发之C/C++内联汇编代码和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++中嵌入汇编代码的办法,首要上就芋头,游戏外挂开发之C/C++内联汇编代码和DLL,西平天气预报是放在_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 mg08式马克沁重机枪
00143A5A push 芋头,游戏外挂开发之C/C++内联汇编代码和DLL,西平天气预报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 [r芋头,游戏外挂开发之C/C++内联汇编代码和DLL,西平天气预报e]
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 pu秦沛sh eax
0欧元兑美元0143A88 push 1458A8h
00143A8D call dword ptr ds:[1492B8h]
00143A93 a黄子韬被告上法庭dd esp,8
00143A96 cmp esi,esp
00143A98 call __RTC_CheckEsp (01411E0h)
return 0;
00143A9D xor eax,eax
}

这是main函数反汇编过来的。下面咱们看看a中韩翻译dd函数的反汇编代码:

int add(int a,int b){
001417A0 push eb沃金汇p
0014role17A1 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函数,再往cal芋头,游戏外挂开发之C/C++内联汇编代码和DLL,西平天气预报l 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芋头,游戏外挂开发之C/C++内联汇编代码和DLL,西平天气预报,int b){
return a+b;
}

然后一步非芋头,游戏外挂开发之C/C++内联汇编代码和DLL,西平天气预报常重要需求露出出来。在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

热门
最新
推荐
标签