手把手教你做游戏外挂


所属类别:vc

文章作者:liquidx

特别推荐:免费发布信息 承包关键词~~抢爆了!HOT!


作者:LiquidX

来源: http://rss.nease.net

示例图:

其实网上有很多的外挂内挂文章我也看了不少,从中得到了很多的帮助。前些时候看到shaker写出的一些传奇外挂的文章之后,再根据自己的研究对外挂知识也算是有了个初步的了解。

外挂分为2种,一种是脱机程序,也就是模拟客户端的程序称为外挂.另一种是利用游戏程序本身的函数对游戏进行一些相关动作的称之为内挂,因为是在游戏进程内部完成任务的。今天要说的是传奇2(虽然这游戏过时了但作为研究来说还是值得的:)内挂的一点点知识,其实我也不太懂,复杂的东西也弄不出来,所以我就把我所学到的一点点知识写了出来,希望更多的人能够了解这方面的知识。

本文没有什么技术可言,但相信对一些未入门的人很有用.

第一步: 首先我们得将传奇的mir.dat脱壳有些私服没有mir.dat那就看看mir.exe,我们查得他是用aspack加的壳,你可以去网上下载相关工具也可以手动脱掉. 这样传奇2现在就是赤裸裸的站在我们面前了:) 现在要做的就是给他开开刀,看他的心肝肠肺都在做些什么,在哪里长着.....

第二步:我们用OLLYDBG加载刚才已经脱壳的mir.dat,然后我们利用插件菜单里的中文字符插件来获得相关信息,如果你没有此插件可以去www.pediy.com找找.不一会儿od给我们呈现出了很多的字符串信息,我们现在就搜索他的“肺”-("攻城区域")我们找到如下图:

在此行双击鼠标左键我们来到:

经过调试确定这里就是个屏幕输出就是在我们攻城的时候屏幕左上角显示的那几个字.

0047A4B3 . 68 FFFFFF00push 0FFFFFF //字体颜色0047A4B8 . 6A 00push 0 //背景色0047A4BA . 68 94A54700 push unpacked.0047A5940047A4BF . 33C9xor ecx,ecx //x坐标0047A4C1 . 33D2xor edx,edx //y坐标0047A4C3 . 8B45 F8mov eax,dword ptr ss:[ebp-8] //设备场景句柄0047A4C6 . E8 D5640200 call unpacked.004A09A0 //内部屏幕输出函数

那么我们就写出这个函数

typedef struct{int len;char text[100];}DT;

void SText(DWORD eax1){ DT dstring; strcpy(dstring.text,(char*)string); dstring.len=strlen(string); txtaddress=(DWORD)&dstring.text[0];_asm{ mov eax, eax1 call setshowmode1 call setshowmode2 push TRANSPARENT push eax call setshowmode3 push txtcolor push bkcol push txtaddress mov ecx, y mov edx, x mov eax, eax1 call ShowTxtcall}}

然后定义一些全局变量和一个可以动态修改输出的字符串和颜色与位置的函数:

const DWORD conaddress=0x47A6CC;const DWORD ShowTxtcall=0x4a09a0;const DWORD setshowmode1=0x44D8B4,setshowmode2=0x41834C,setshowmode3=0x406434;DWORD x=0x0, y=0x0,txtcolor=0x0,bkcol=0x1e00ff;DWORD txtaddress=0x0;

char* string="传奇小外挂--By LiquidX Diy 2005.6.15";

void settxt(char* strings,

DWORD X,DWORD Y,

DWORD TXTCOLOR,DWORD BKCOL){ string=strings; x=X;

y=Y;

txtcolor=TXTCOLOR;

bkcol=BKCOL;}

现在我们的屏幕输出函数已经模拟出来了,下面要做的就是改掉游戏显示屏幕坐标函数(关于这个函数地址你可以用金山游侠等工具查找很方便的)内部执行的流程,使这个函数跳转到我们的函数中来这样就可以在屏幕上无闪动的输出想输出的字符串了..

定义一个naked函数 关于naked可以去网上查查..

__declspec(naked) initST(){_asm{push eaxpush edxpush ecxpush ebp//保存参数mov eax,dword ptr[ebp-0x8] //获得我们当时eax中的值push eax //传入eax参数call disfunc //调用我们的函数pop ebp//恢复堆栈pop ecxpop edxpop eaxmov ecx,9jmp conaddress//返回游戏函数继续执行}}

void __stdcall disfunc(DWORD eax1){ SText(eax1);//调用我们的函数}

好了,现在基本上都完成得差不多了,现在只需要修改机器码了

上面代码中我们看到函数中一直都需要获得当时的eax中的值,经过跟踪分析我选择0x47a6cc(返回)(显示地图坐标函数的入口偏移几个字节在这里可以在本函数第一时间内拿到eax而处理机器码量较少)处地址...

代码如下:

LRESULT CALLBACK hookproc(int ncode ,WPARAM wparam,LPARAM lparam){if(KEYUP(lparam)&&ncode==HC_ACTION&&wparam==VK_HOME){settxt("ShowText Testing....终于成功啦!!!",0x120,0x80,0x0,0x00ffff);}if(KEYUP(lparam)&&ncode==HC_ACTION&&wparam==VK_F12){char buf[MAX_PATH];::GetClassName(GetActiveWindow(),buf,MAX_PATH);if (lstrcmpi(buf,"TFrmMain")==0){_asm //改写 地址 跳转到我们的函数{ lea eax,initST mov ebx,0x47a6cc //写入这个地址sub eax,ebx mov esi,0x47a6c7 mov dword ptr[esi],0xe9 //JMP mov dword ptr[esi+0x1],eax //合成跳转指令}}}return ::CallNextHookEx(hook,ncode,wparam,lparam);}

现在我们的一个屏幕输出的简单内挂就完成了,根据网上提供的一些内存地址你可以给它加上更多的功能。

最后一件事情就是外挂退出时恢复机器码,以免游戏跳转到一个不可用的地址造成崩溃..

代码如下:

void revert(){

_asm{ mov esi,0x47A6C7 mov eax,0xb9 mov dword ptr[esi],eaxmov eax,0x09 mov dword ptr[esi+0x1],eax}}

全文完! 本人能力有限,有任何错误之处希望告之.以免造成误导...

本文配套代码下载:

mir20057122103.rar

作者QQ:156789519 mailto:liquidx@163.com

等过些天把我收集的一些外挂源码整理一下提供给大家下载研究 :)

相关交流论坛:www.gameres.com,www.cnesoft.com

相关资料

全屏看血内存地址:47A0D375EB原版:00000075108B45EC新版:000000EB108B45EC}

{强行退出内存地址:004620E6(7)74900D90原版:2000740D8B45新版:200090908B45内存地址:00462162(3)74900A90原版:2000740A8B45新版:200090908B45内存地址:4914CA(B)内存地址:491576(7)74900E90原版:0080782000740EA1新版:00807820009090A1}{免助跑内存地址:00461BEB(C-F0)0F908E907990FD90FF90FF90原版:E8000F8E79FDFFFF新版:E800909090909090内存地址:461BB9(A-E)0F908C90DA90009000900090原版:00010F8CDA000000A1新版:0001909090909090A1}{跑步砍内存地址:004634E20001原版:4F00008D45F0新版:4F00018D45F0}{攻击速度内存地址:467016(7)78E20504原版:EB0BB87805新版:EB0BB84805说明:速度由二位数指定,二位数前后互换为真实数据,数字大为慢小为快}{穿人内存地址:472D17340C原版:00000034018845新版:0000000C018845}{免蜡内存地址:471BDE74EB原版:008038007454新版:00803800EB54}{物品闪光内存地址:471AA604原版:1300007625新版:0200007625}{自动放药0048C21FF968FDFF004623A2760700000048C21FDD50B001004623A27AEDB201}{超负重??Poke00499A40EB004975A8EB5C00499A40EB93{攻击方法修改一原版00463425741C0046344A7410004634637415半月00463425741C0046344A7410004634639090攻杀00463425741C0046344A9090004634637415烈火0046342590900046344A7410004634637415方法二半月Poke00463363D0烈火Poke00463363D1普通Poke00463363C6

C745E8C60B单手砍C745E8C70B双手砍C745E8C80B跳跃砍C745E8CA0B攻杀C745E8CB0B刺杀C745E8D00B半月C745E8D10B烈火}

{无限刺杀内存地址:463363C6CB原版:C745E8C60B新版:C745E8CB0B内存地址:463373C7CB原版:C745E8C70B新版:C745E8CB0B}无限攻杀内存地址:463363C6CA原版:C745E8C60B新版:C745E8CA0B内存地址:463373C7CA原版:C745E8C70B新版:C745E8CA0B

你经常忘记某个函数而反复的去查资料吗?--时间很宝贵。使用本软件只需一秒钟给你想要的答案,请看如下示例图:

下载:

http://rss.nease.net/downloadls.HTM

相关信息

· 数据库备份/恢复方案

·  摩卡流量分析管理(Mocha NTA)解决方案

· 小设置 让Vista系统既智能又安全

· 从.NET程序集提供图像(二)








....

73033 23073