首页
社区
课程
招聘
[旧帖] [分享]c++编写dnf外挂部分代码 0.00雪花
发表于: 2012-11-10 14:25 8611

[旧帖] [分享]c++编写dnf外挂部分代码 0.00雪花

2012-11-10 14:25
8611
前两天共享了TP驱动和CE编写DNF外挂脚本,那些都是“利其器”,今天继续“善其事”。
当今外挂界主流首推E语言,纯中文编程,不过小白本人没接触过,听说各种模块化的东西,用起来特容易,又名“易语言”。大一的课程只教过C++,那就凑合着用c++编写吧。还是先说下,小白c++功底不高,很多代码只知道怎么写但不知道为什么,这里推荐游戏辅助编程爱好者看《郁金香C++外挂教程》,如果c++的基础实在薄弱就看完孙鑫老师的《孙鑫c++20课》,那个教程虽然是讲C++基础的,但整个20课俨然就是一个外挂编写基础,从用户界面MFC的设计到多线程的注入技术,发包的基础,动态链接库,简单钩子,都学会再看别人代码至少不会一点头绪没有。
这里还是以DNF为例,为啥?因为我目前只研究过DNF,前一阵是研究单机魔兽改图的,和外挂技术一比那就弱爆了。
动态链接库我现在使用还不是很熟练,所以这里先介绍一下不用动态链接库的远程注入代码。
这一贴我还是先扔个砖头,不介绍远程call调用,只说说基础的远程代码注入。
DNF驱动就好比美女的衣服,被脱去后DNF赤裸裸站在你面前,我们可以对其代码为所欲为。
OD找call不是本文的重点,只简单提一下:以人物血量为例。目前来说当前血量基址有两个:01E16E20,01E1805C,对其中任意一个下内存写入断点,堆栈找返回地址,四五层之后,会发现如下一段代码:
push 0
push edi
push ebx
mov ecx,esi
call edx

call edx调用之前栈顶值就是目标当前血量(这里已经不再只限于人物血量,怪物血量更新也掉用此函数),当怪物打我们时,目前(2012年11月10日)来说这个函数地址(edx值)是0060C6A0。
外挂的原理无非就是修改内存,这里就是修改栈顶值,OD手动把她改为0,运行后就实现秒怪了。
下面我们用C++代码来实现这一功能:
当怪物打我们时,我们在call edx调用时(即当DNF执行到0060C6A0地址时)把保存我们血量的那一堆栈值改为9999,即伪无敌。

大体说下编写思路,最开始肯定获得修改dnf进程内存权限,打开DNF进程后,在其内部申请一段内存,写入我们修改过的代码,并把原DNF代码修改使之运行到0060C6A0时跳转到我们自己编写的代码里去,干完坏事再跳回去,神不知鬼不觉..
(清理现场我做的不是很好,不过这里内存的释放不一定那么重要,没影响)

HWND hwnd = ::FindWindow(NULL,"地下城与勇士");
	
	if (!hwnd)
	{
		MessageBox("请先运行游戏!");
		return;
	}

	DWORD processid;
	::GetWindowThreadProcessId(hwnd,&processid);
	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,false,processid);
//以上过程为套话,窗口名可以下载spy++获取,想知道每个具体函数自行MSDN或百度

	LPCVOID base = (LPCVOID)0x0060C6A0;
//base是要跳转的dnf原程序代码,我们在这里修改代码,使之跳到我们自己的函数中
	::ReadProcessMemory(handle,(LPCVOID)0x0060C6A0,    (LPVOID)&m_char,6,NULL);
//设一个char[1000]型类成员变量,保存游戏程序在0060C6A0处原代码,以便不想用外挂时将代码还原
	LPVOID newaddr=VirtualAllocEx(handle,NULL,0x256,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
//在DNF进程中申请内存以便存放我们自己编写的代码
	m_newmem=newaddr;
//保存新申请的内存地址在LPVOID型类成员变量m_newmem中,以便释放
	char ch1={0xe9};
	::WriteProcessMemory(handle,(LPVOID)0x0060C6A0,(LPVOID)&ch1,1,NULL);
//改写0060C6A0地址中DNF源代码,使他“跳”到我们自己的代码中,我们的代码在申请的newaddr内存中,汇编指令跳jmp机器码0xe9
	int Jmp1=(int)newaddr-0x0060C6A0-5;
//汇编中jmp某地址,转成机器码需要用公式转换:
//机器码中地址=目标地址-e9(jmp)字节所在地址-5
	::WriteProcessMemory(handle,(LPVOID)0x0060C6A1,(LPVOID)&Jmp1,4,NULL);
//将跳转地址即申请的内存地址转成机器码写入内存
	char ch2={0x90};
	::WriteProcessMemory(handle,(LPVOID)0x0060C6A5,(LPVOID)&ch2,1,NULL);
//我们改写了源代码的6个字节,而jmp newaddr只用了5个字节,这一字节没有用,用0x90(nop)空代码代替,不改也可以,因为程序不再会执行这里
//随着DNF的更新,0060C6A0这一地址值将会发生变化,但特征码一般不会变,以后若果发现程序不可用,可以特征码搜出新的地址替换0060C6A0
	
	char ch[15]={0xc7,0x44,0x24,0x04,0x99,0x99,0x00,0x00,0x55,0x8b,0xec,0x8b,0x45,0x10,0xe9};
/*我们自己的代码,汇编代码的机器码,最好你手头有汇编和机器码转换的东东,比如CE里随便写一段就能看见对应的机器码,我这里的汇编是这样的:
mov [esp+04],00009999     
 因为0060C6A0是call edx跳过来的,所以堆栈中被压入了call edx下一句地址,那我们的当前血值就是栈顶指针+4,即[esp,+4]里的值,把0x9999传入就是设定当前血量0x9999
push ebp         //0060C6A0源代码 不变
mov ebp,esp    //0060C6A0源代码 不变
mov eax,[ebp+10]    //0060C6A0源代码 不变*/
	::WriteProcessMemory(handle,newaddr,(LPVOID)&ch,15,NULL);
//代码写入到e9(jmp),跳转地址仍需要用公式转换
	int Jmp2=0x60c6a6-(int)newaddr-14-5;
/*我们改写了源代码从0060C6A0开始的6个字节,所以我们应跳回到0060C6A0+6的位置,而当前e9(jmp)所在地址是newaddr+14*/
	::WriteProcessMemory(handle,(LPVOID)((int)newaddr+15),(LPVOID)&Jmp2,4,NULL);
//写入跳回地址jmp 0060C6A6
        CloseHandle(handle);
[CODE]
若果不想用此功能,可将源代码写回0060C6A0
[CODE]
	HWND hwnd = ::FindWindow(NULL,"地下城与勇士");
	
	if (!hwnd)
	{
		MessageBox("请先运行游戏!");
		return;
	}
	
	DWORD processid;
	::GetWindowThreadProcessId(hwnd,&processid);
	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,false,processid);
        ::WriteProcessMemory(handle,(LPVOID)0x0060C6A0,(LPVOID)&m_char,6,NULL);
//写回我们改写的6个字节,之前已经保存在了类成员变量中
        VirtualFreeEx(handle,m_newmem,NULL,0x256);
//释放内存,可有可无


如果你对此感兴趣,还可以设置一个编辑框,关联类成员变量后动态输入数字来修改当前血量,还可以编写动态链接库创建全局钩子实现在仓库按Home键呼出外挂界面并且按F2实现功能的开启与关闭,对DC使用熟练还可以美化用户界面,一个简单的C++DNF外挂就编写好了。
友情提醒:
如果你一直开着此功能刷图,掉线率达90%以上,如果要投入使用,请不要一直开启,而且可以将MOV [ESP +4],9999改成add [esp+4],XXX等等实现比较稳定的功能,这里不再赘述。

曾经怀疑出小三是因为有dnf代码校验,后来测试了一下一直手动修改堆栈值还是掉线,看来DNF不是检测的代码来判定小三的。

文中代码新建MFC添加按钮后直接复制可用,我不提供EXE文件下载了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (26)
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
占位了!!!
2012-11-10 21:52
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
饿  有待吸收知识 慢慢看
2012-11-11 00:19
0
雪    币: 23
活跃值: (1376)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
很显然是有代码校验检测的
2012-11-11 05:54
0
雪    币: 64
活跃值: (60)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
你这个“显然”是瞎猜的还是找到校验代码段了?
我的经历是:
1.开着外挂不打怪跑1年都没事
2.不修改代码手动修改数据依然出小三
3.主动断网后,开着外挂随便秒不会出小三
4.并非每次都出,偶尔可以刷完1次副本

看您回答的这么牛逼,您能不能解释一下,小弟不胜感激!
2012-11-11 07:42
0
雪    币: 102
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好帖!!!顶了!!!!还是第一次看到C++写地下城的辅助,以前看到的都是易的
顺便问一下,这贴的代码是在过TP的基础上实现的吧?不然OpenProcess似乎不能用吧?
2012-11-11 09:52
0
雪    币: 38
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
LZ交个朋友吧……一起研究,一起进步
2012-11-11 10:09
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢楼主分享!!!!!!!!!!
2012-11-11 10:33
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
请教5楼的,什么是小三?
2012-11-11 11:19
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
呼呼呼,我是来学习的
2012-11-11 11:42
0
雪    币: 64
活跃值: (60)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
可以参考我另外一篇帖子哈
2012-11-11 11:50
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
注入dll追封厉害啊
2012-11-11 11:53
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
LZ交个朋友吧,一起研究
2012-11-15 17:02
0
雪    币: 3
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主对此方面颇有研究啊  希望能再次看到楼主的技术佳作
2012-11-15 17:26
0
雪    币: 465
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
谢楼主分享!!!!!!!!!!
2012-11-18 22:15
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
我来简单一点回答你吧。。估计你很少玩游戏,要么就是安安分分的玩游戏,不用G的。
呵呵。玩游戏开G,被检测出来,游戏中断。就是第三方,俗称小三。再详细的我就不说了,再说就外行了
2012-11-19 06:41
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
建立了个逆向游戏分析q群: 160391675    欢迎高手们一起和我练剑,  一起交流。 一起共同进步。
2012-11-19 15:24
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
有得学习 我还待在基础层面
2012-11-19 21:33
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
请问一下,HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,false,processid);
你能这个handle你能获取到么?现有的代码,没有过驱动保护那块,能打开process么?
2012-11-28 01:01
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
发现是权限问题,现在OK了
2012-11-28 01:57
0
雪    币: 219
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
驱动如何去掉的?
2013-1-4 11:18
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
不错
2013-1-4 18:35
0
雪    币: 645
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
嗯 写的不错 过保护 不太好弄 其他的简单
2013-1-12 11:14
0
雪    币: 6
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
多谢楼主分享
2013-1-12 12:25
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
来个作者合作一下。DNF科技
2018-4-20 04:16
0
游客
登录 | 注册 方可回帖
返回
//