發(fā)布時(shí)間:2023-11-27 22:43:34 瀏覽量:160次

上一節(jié)我講解了CE的使用,這一節(jié)我講解一下windows下C/C++的在以后外掛編程中會用到的知識,內(nèi)聯(lián)匯編和C++MFC的DLL編寫。這兩個基本知識都是以后外掛中都會用到的,但是不一定是現(xiàn)在的高級語言編寫者都會的知識。我雖然第一個語言是C但是我還是以C#發(fā)家的(畢業(yè)后一直主打的還是.NET平臺的C#開發(fā))。
1.C/C++中內(nèi)聯(lián)匯編代碼:新建一個windows 控制臺項(xiàng)目代碼如下
#include "stdafx.h"
extern int add(int a,int b);//方法聲明
int main(int argc, _TCHAR* argv[])
{
int re;
re=add(1,3);//調(diào)用add方法
printf("%d",re);
scanf_s("%d",&re);//純粹為了停頓查看控制臺輸出的結(jié)果
return 0;
}
int add(int a,int b){
_asm{//匯編代碼塊
mov eax,a
add eax,b
mov b,eax
}
return b;
}
很容易看到在被調(diào)用的add方法中嵌入了匯編代碼。不難看出運(yùn)行結(jié)果為4。以下是圖和真相
通過這個簡單的內(nèi)聯(lián)匯編我相信大家都熟悉了C/C++中嵌入?yún)R編代碼的方式,主要上就是放在_asm{}中。當(dāng)然這其中的代碼和真正的匯編還是有點(diǎn)區(qū)別的。讓我們來看一下反匯編后的代碼:
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);//調(diào)用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);//純粹為了停頓查看控制臺輸出的結(jié)果
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函數(shù)反匯編過來的。下面我們看看add函數(shù)的反匯編代碼:
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中內(nèi)聯(lián)匯編和匯編指令還是有點(diǎn)區(qū)別的。在main主函數(shù)中call add這個就是調(diào)用add函數(shù),再往call add前面看,大家可以看到被調(diào)用的add參數(shù)被從右到左的放到堆棧中去了(匯編基礎(chǔ)知識)。至于add函數(shù)的返回值就放到通用寄存器eax中。匯編中函數(shù)放回值都是放到eax中,add函數(shù)中有這樣一行匯編mov eax,dword ptr [b]。其中 call add后面有add esp,8這個是為了保持堆棧平衡。這是高級語言中我們不需要關(guān)注的東西,其它的就不多說了。更多的還是自己去掌握匯編吧,畢竟匯編知識還是比較豐富的,三言兩語講不清。這里我只是讓大家能看懂大致的脈絡(luò)。在外掛編程中我們很多時(shí)候是通過內(nèi)聯(lián)匯編去call游戲線程中的某個方法,例如我們call補(bǔ)金瘡藥或者魔藥的過程,可以實(shí)現(xiàn)自動喝藥。這是基本的外掛過程。
2.C++MFC DLL的編寫:從其他語言過來可能不知道C++寫DLL。C++DLL有很多種方式去寫。這里我就介紹MFC DLL。它最容易上手。DLL的用處是什么呢??其它用處我就不說了,只說在外掛中什么作用。在外掛中我們需要進(jìn)程注入。前面講過,每個程序都有一個自己私有的4G進(jìn)程空間(32位系統(tǒng),0x00000000~0x7FFFFFFF空間屬于應(yīng)用程序的空間,高地址空間是屬于操作系統(tǒng)的),起到保護(hù)進(jìn)程的作用。那么我們怎么控制另個一程序呢??這時(shí)候我們就要想到將我們的代碼放到被控制的進(jìn)程空間中去,可是正常情況下,在一個程序中正常情況下是訪問不到另一個程序進(jìn)程空間的。這時(shí)候我們可以用進(jìn)程注入的方式將我們的DLL注入到游戲進(jìn)程空間中去。我比較常用的兩種方式其一是通過WriteProcessMemory的方式直接寫進(jìn)去,另一種方式是通過鉤子的形式注入。這兩種注入方式在后面的章節(jié)中再做介紹。開始去寫一個DLL在項(xiàng)目解決方案上面添加項(xiàng)目(我用的是vs2012).然后選擇C++,在選擇MFC,選擇MFC DLL.在源文件后面添加一個add方法;
int add(int a,int b){
return a+b;
}
然后一步非常重要需要暴露出來。在def文件中放入這個函數(shù)名稱
def中的代碼是:

; MFCLibrary1.def : 聲明 DLL 的模塊參數(shù)。 LIBRARY EXPORTS ; 此處可以是顯式導(dǎo)出 add
這樣就將add函數(shù)暴露到了DLL外面。這樣在exe中就可以調(diào)用了;
exe程序中的調(diào)用代碼如下:
// ASMTest.cpp : 定義控制臺應(yīng)用程序的入口點(diǎn)。
//
#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);//調(diào)用add方法
printf("%d",re);
scanf_s("%d",&re);//純粹為了停頓查看控制臺輸出的結(jié)果
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")這是其中一種調(diào)用方式。別忘了聲明extern int add(int a,int b);否則找不到add方法。 這樣,實(shí)現(xiàn)了一個DLL和對DLL的調(diào)用。為后面注入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等引擎。借此分析引出了游戲設(shè)計(jì)領(lǐng)域和數(shù)字藝術(shù)教育的重要性,歡迎點(diǎn)擊咨詢報(bào)名。
2. 手機(jī)游戲如何開發(fā)(如何制作傳奇手游,都需要準(zhǔn)備些什么?)
?如何制作傳奇手游,都需要準(zhǔn)備些什么?提到傳奇手游相信大家都不陌生,他是許多80、90后的回憶;從起初的端游到現(xiàn)在的手游,說明時(shí)代在進(jìn)步游戲在更新,更趨于方便化移動化。而如果我們想要制作一款傳奇手游的
3. B站視頻剪輯軟件「必剪」:免費(fèi)、炫酷特效,小白必備工具
B站視頻剪輯軟件「必剪」,完全免費(fèi)、一鍵制作炫酷特效,適合新手小白??靵碓囋嚕?/span>
4. Steam值得入手的武俠游戲盤點(diǎn),各具特色的快意江湖
游戲中玩家將面臨武俠人生的掙扎抉擇,戰(zhàn)或降?殺或放?每個抉定都將觸發(fā)更多愛恨糾葛的精彩奇遇?!短烀嬗肪哂卸嗑€劇情多結(jié)局,不限主線發(fā)展,高自由...
?三昧動漫對于著名ARPG游戲《巫師》系列,最近CD Projekt 的高層回應(yīng)并不會推出《巫師4》。因?yàn)椤段讕煛废盗性诓邉澋臅r(shí)候一直定位在“三部曲”的故事框架,所以在游戲的出品上不可能出現(xiàn)《巫師4》
6. 3D動畫軟件你知道幾個?3ds Max、Blender、Maya、Houdini大比拼
當(dāng)提到3D動畫軟件或動畫工具時(shí),指的是數(shù)字內(nèi)容創(chuàng)建工具。它是用于造型、建模以及繪制3D美術(shù)動畫的軟件程序。但是,在3D動畫軟件中還包含了其他類型的...
7. 3D打印技巧揭秘!Cura設(shè)置讓你的模型更堅(jiān)固
想讓你的3D打印模型更堅(jiān)固?不妨嘗試一下Cura參數(shù)設(shè)置和設(shè)計(jì)技巧,讓你輕松掌握!
8. 虛幻引擎5節(jié)省存儲空間用這招!緩存的清理與設(shè)置
眾所周知,虛幻引擎5(下面簡稱UE5)特別占用存儲空間,僅一個版本安裝好的文件就有60G,這還不包括我們在使用時(shí)保存的工程文件和隨之產(chǎn)生的緩存文件。而...
9. Bigtime加密游戲經(jīng)濟(jì)體系揭秘,不同玩家角色的經(jīng)濟(jì)活動
Bigtime加密游戲經(jīng)濟(jì)模型分析,探討游戲經(jīng)濟(jì)特點(diǎn),幫助玩家更全面了解這款GameFi產(chǎn)品。
10. 3D動漫建模全過程,不是一般人能學(xué)的會的,會的多不是人?
步驟01:面部,頸部,身體在一起這次我不準(zhǔn)備設(shè)計(jì)圖片,我從雕刻進(jìn)入。這一次,它將是一種純粹關(guān)注建模而非整體繪畫的形式。像往常一樣,我從Sphere創(chuàng)建它...
最新文章
同學(xué)您好!