首页
社区
课程
招聘
[原创]DOTA小地图全图绘制(可过平台)
发表于: 2014-5-11 11:09 25645

[原创]DOTA小地图全图绘制(可过平台)

2014-5-11 11:09
25645
不得不说是DOTA外挂开始让我我学习编程的。

以前的VS HF从互通图, 到全图,到自动补刀,到自动躲技能,主机T人,外挂无处不在。
以前早上六点跑到网吧只为了进VS的高级房间(苦逼屌丝买不起VS的VIP)。现在VS HF空空如也的房间怕是早就没人了吧。

现在DOTA平台应该也就只有11还能看得下去吧,下面直接开撸,最后的是压轴的
下面说的绘图都是基于你已经知道如何获取英雄的坐标了,(最后可能会有如何取得英雄单位的代码)。

1 GDI
readprocessmemory读取魔兽的内存,GDI画到游戏上
由于魔兽独占模式。GDI画上去会闪烁。效果非常差。当然可以采取窗口化魔兽,然后去掉边框,绘图像歌词软件那样做。总之效果不好,但是被平台发现的可能性几乎为0,总之不推荐。

2 D3D 绘图
HOOK D3d的present或者endscene?大概是这几个函数绘图,应该是我绘图技术不好,总觉得画起来挺难看的。 平台对这里可能会有检测。而且坐标的转换有些麻烦。

前面说的都是放屁,完全啥都没教。

下面的说的魔兽版本1.24E,game.dll基址默认6f000000。

3  在魔兽内部绘制。
魔兽的小地图其实是一个255*255的DWORD二维数组
有两块内存区域。一块是原始的地图信息数据pOrg保存着原始的信息,用于恢复,一块是绘图用于显示给用户看的pPaint
过程是从porg复制到ppaint中,根据当前的游戏信息在ppaint上修改数据,然后显示给用户。完成后再复制porg到ppaint中,如此循环。
复制porg到ppaint的函数地址开头
6F362CD0    55                       PUSH EBP
开始复制
6F362D5D    0F6F06                   MOVQ MM0,QWORD PTR DS:[ESI]
6F362D60    0F6F4E 08                MOVQ MM1,QWORD PTR DS:[ESI+8]
6F362D64    0F6F56 10                MOVQ MM2,QWORD PTR DS:[ESI+10]
6F362D68    0F6F5E 18                MOVQ MM3,QWORD PTR DS:[ESI+18]
6F362D6C    0F6F66 20                MOVQ MM4,QWORD PTR DS:[ESI+20]
6F362D70    0F6F6E 28                MOVQ MM5,QWORD PTR DS:[ESI+28]
6F362D74    0F6F76 30                MOVQ MM6,QWORD PTR DS:[ESI+30]
6F362D78    0F6F7E 38                MOVQ MM7,QWORD PTR DS:[ESI+38]
6F362D7C    0F7F07                   MOVQ QWORD PTR DS:[EDI],MM0
6F362D7F    0F7F4F 08                MOVQ QWORD PTR DS:[EDI+8],MM1
6F362D83    0F7F57 10                MOVQ QWORD PTR DS:[EDI+10],MM2
6F362D87    0F7F5F 18                MOVQ QWORD PTR DS:[EDI+18],MM3
6F362D8B    0F7F67 20                MOVQ QWORD PTR DS:[EDI+20],MM4
6F362D8F    0F7F6F 28                MOVQ QWORD PTR DS:[EDI+28],MM5
6F362D93    0F7F77 30                MOVQ QWORD PTR DS:[EDI+30],MM6
6F362D97    0F7F7F 38                MOVQ QWORD PTR DS:[EDI+38],MM7

255*255的DWORD数组。每一个DWORD数据就是一个颜色。比如0XFFAABBCC 表示alpha通道值为0XFF R=0XAA G=0XBB B=0XCC 也就是通道值+RGB (有可能是BGR,应该是BGR,如果我没记错的话)

地址如下
TEMPV=[Game.dll+0xACD06C];
[TEMPV+0X1D8]  为小地图像素的起始点 ppaint
[ [TEMPV+0X17C] ]  为小地图像素的复制点 porg

当我们取得单位的坐标后。选择一个合适的地方HOOK 就可以修改像素点画图了。
比如我要在小地图的第一个像素点画一个红色,那么就是ppaint[0][0]=0xffff0000;(BGR 就是0xff0000ff);

如果你是修改ppaint,记得要在porg复制到ppaint以后,但是还没有展现给用户之前修改。如果是直接修改porg那就随意了,但是记得要保存一份porg的副本,否则你自己也没法恢复。
关键是找到一个合适的HOOK点,这部分常常要和dx的DLL打交道。多跟踪很容易找到合适的HOOK点,但是还是画不出原来的感觉。

4压轴的,也是我推荐的。直接使用调用魔兽的某些东西,让他自己画。
由于代码过去很久了,现在要我拿起OD找到具体位置我也懒得找了,直接上代码,照着记忆来说
//位置结构。x,y不多说,unknown是3F800000。浮点数1.0??
struct Pos
{
	DWORD x,y,unknow;
};


//由于但是是写成shellcode的,所以封装了函数

//storm.dll的地址
DWORD _declspec(noinline) GetStromAddr()
{
	return 0x15000000;
}
//game.dll的地址
DWORD _declspec(noinline)GetGameAddr()
{
	return 0x6f000000;
}

//只要在某些地方HOOK,调用这个函数就可以小地图上画出英雄单位
void AllDraw()
{
	DWORD HeroPoint,HeroNext;
	HeroPoint=GetHeroAddrPFunc();//获取英雄单位链表。(我称他为链表~~)
	if (HeroPoint==0)
	{
		return ;
	}
	HeroNext=*(DWORD*)HeroPoint;//取出第一个单位的地址
	while (HeroNext!=0)
	{

		BYTE Dead=0;
		Dead=*(BYTE*)(HeroNext+0x20);//死了自然不用画
		if(Dead==0x46)
		{
                        //没死就画
			MainDraw(HeroNext);
		}

		HeroPoint+=0x18;//链表自增
		HeroNext=*(DWORD*)HeroPoint;//取出下一个单位地址。直到为0表示没有了
	}
}




//大地图坐标转小地图坐标的call 本来是有参数的。这里naked就不写了
void  _declspec(naked) FloatCall()
{
	_asm
	{
		push ebp
		mov ebp,esp
		pushad
	    pushfd
	    mov edx,[ebp+0xc]
		mov ecx,[ebp+0x10]
		push DWORD PTR SS:[ebp+8]
		push eax
		PUSH ESI
		MOV ESI,DWORD PTR SS:[ESP+0x8]
		FLD DWORD PTR DS:[ESI+0xC]
		MOV EAX,ECX
		FMUL DWORD PTR DS:[EDX+4]
		FLD DWORD PTR DS:[EDX]
		FMUL DWORD PTR DS:[ESI]
		FADDP ST(1),ST
		FLD DWORD PTR DS:[ESI+0x18]
		FMUL DWORD PTR DS:[EDX+0x8]
		FADDP ST(1),ST
		FSTP DWORD PTR DS:[EAX]
		FLD DWORD PTR DS:[ESI+0x4]
		FMUL DWORD PTR DS:[EDX]
		FLD DWORD PTR DS:[ESI+0x10]
		FMUL DWORD PTR DS:[EDX+4]
		FADDP ST(1),ST
		FLD DWORD PTR DS:[ESI+0x1C]
		FMUL DWORD PTR DS:[EDX+8]
		FADDP ST(1),ST
		FSTP DWORD PTR DS:[EAX+4]
		FLD DWORD PTR DS:[ESI+8]
		FMUL DWORD PTR DS:[EDX]
		FLD DWORD PTR DS:[ESI+0x14]
		FMUL DWORD PTR DS:[EDX+4]
		FADDP ST(1),ST
		FLD DWORD PTR DS:[ESI+0x20]
		POP ESI
		FMUL DWORD PTR DS:[EDX+8]
		FADDP ST(1),ST
		FSTP DWORD PTR DS:[EAX+8]
		pop eax
		add esp,4
		popfd
		popad
		mov esp,ebp
		pop ebp
		retn
	}
};


//这个确实不记得了
DWORD  GetHeroLC(DWORD HeroAddr)
{
	return *(DWORD*)(HeroAddr+0x58);
}

//获取坐标地址。填充需要的结构
void  GetHeroLocData(DWORD HeroAddr,Pos * p)
{

	p->x=*(DWORD*)(HeroAddr+0x284);
	p->y=*(DWORD*)(HeroAddr+0x288);
	p->unknow=0x3f800000;//浮点1.0
}

void  MainDraw(DWORD HeroAddr)
{
	Pos pReal;
	Pos pChange;
	DWORD lc=GetHeroLC(HeroAddr);

      //获取大地图坐标
	GetHeroLocData(HeroAddr,&pReal);

    DWORD Gaddr=GetGameAddr();


//把大地图 转到 小地图结构
	DWORD MiniVal=*(DWORD*)(Gaddr+0xACD06C);
	LPVOID p1=&pChange;
	LPVOID p2=&pReal;
	DWORD p3=MiniVal+0x750;
	_asm mov esp,esp
	_asm
	{
		pushad
		push p1
		push p2
		push p3
		call FloatCall
		add esp,0xc
		popad
	}


/*这里记得了,上面的GetHeroLC是用于计算玩家楼层。有一个标记。
所有的英雄单位还有一个数组,1表示要画图,0表示不要画图。*/



//想起来了,LC=楼层。

	//FloatCall(MiniVal+0x750,&pReal,&pChange);
	DWORD StartAddr=*(DWORD*)(MiniVal+0x2e4);

//StartAddr就是这个数组的地址

	DWORD TempCount=*(DWORD*)(StartAddr+lc*4);
	if (TempCount!=0)//如果数组里面显示要画了,那我们没必要多此一举
	{
		return ;
	}

	DWORD Judge=*(DWORD*)(MiniVal+0x2f0);
	Judge=*(DWORD*)(lc*4+Judge);
	if (Judge==0)//这里还有个判断,不记得是干嘛的了。
	{
		return ;
	}

//把数组里面的值标记为1,表示要画出来
	*(DWORD*)(StartAddr+lc*4)=TempCount+1;

//把这个结构放到一个位置,让魔兽画出来。
	lc=lc<<4;
	DWORD CopyAddr=*(DWORD*)(lc+MiniVal+0x2fc);
	DWORD Offset=TempCount*3;
	CopyAddr+=Offset*4;
	((Pos*)CopyAddr)->x=pChange.x;
	((Pos*)CopyAddr)->y=pChange.y;
	((Pos*)CopyAddr)->unknow=pChange.unknow;
}



//获取英雄表头
DWORD  GetHeroAddrPFunc()
{
	DWORD HeroAddrPoint=0;
	DWORD Addr=0x55514+GetStromAddr();
	memcpy(&HeroAddrPoint,(LPCVOID)(Addr),4);

	if(*(DWORD*)(HeroAddrPoint+0x88)!=0x18)
		return 0;

	HeroAddrPoint=HeroAddrPoint+0x98;
	//特别注意,这里返回值可能为0;
	return HeroAddrPoint;
}


总之就是只要在合适的地方填写好game.dll storm.dll的基址,调用
alldraw就可以了。

这个过过11还是没有任何压力的。。。难者不会。会者不难。说到这里,做一个自己用的小地图应该还是没啥压力的。
只是为某些想做小地图的人省去了OD调试找偏移的麻烦

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

收藏
免费 4
支持
分享
最新回复 (20)
雪    币: 341
活跃值: (133)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
咦楼主头像是动态的
2014-5-11 11:13
0
雪    币: 459
活跃值: (344)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
进入膜拜模式,求收留
2014-5-11 11:27
0
雪    币: 1392
活跃值: (4862)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
4
说一下我选取的HOOK点

6F52E42E    FFD0            CALL EAX           ; d3d8.55ED7420   跟进

55ED7420    8BFF            MOV EDI,EDI

55ED74AC    52              PUSH EDX
55ED74AD    E8 A041FCFF     CALL <JMP.&msvcrt.memset>
55ED74B2    8B47 14         MOV EAX,DWORD PTR DS:[EDI+14]
55ED74B5    8B88 08020000   MOV ECX,DWORD PTR DS:[EAX+208]
55ED74BB    8B45 14         MOV EAX,DWORD PTR SS:[EBP+14]
55ED74BE    894D A4         MOV DWORD PTR SS:[EBP-5C],ECX
55ED74C1    8B57 18         MOV EDX,DWORD PTR DS:[EDI+18]
55ED74C4    8955 A8         MOV DWORD PTR SS:[EBP-58],EDX
55ED74C7    8945 F4         MOV DWORD PTR SS:[EBP-C],EAX
55ED74CA    8B7F 14         MOV EDI,DWORD PTR DS:[EDI+14]
55ED74CD    8B97 50010000   MOV EDX,DWORD PTR DS:[EDI+150]
55ED74D3    83C4 0C         ADD ESP,0C
55ED74D6    8D4D A4         LEA ECX,DWORD PTR SS:[EBP-5C]
55ED74D9    51              PUSH ECX
55ED74DA    FFD2            CALL EDX   //跟进 d3d8.55E88690
55ED74DC    8BF8            MOV EDI,EAX

//这个往下面F8多一点,有点远
55E88690    8BFF            MOV EDI,EDI

55E887CA    E8 51DEFFFF     CALL d3d8.55E86620
55E887CF    83C4 04         ADD ESP,4
55E887D2    F683 8C000000 0>TEST BYTE PTR DS:[EBX+8C],2
55E887D9    75 38           JNZ SHORT d3d8.55E88813
55E887DB    8B8B 64030000   MOV ECX,DWORD PTR DS:[EBX+364]
55E887E1    8B93 F8030000   MOV EDX,DWORD PTR DS:[EBX+3F8]
55E887E7    8D45 A4         LEA EAX,DWORD PTR SS:[EBP-5C]
55E887EA    50              PUSH EAX
55E887EB    51              PUSH ECX
55E887EC    FFD2            CALL EDX    ; atiu9pag.718820F4就是这里了
55E887EE    8945 FC         MOV DWORD PTR SS:[EBP-4],EAX
55E887F1    85C0            TEST EAX,EAX

atiu9pag.718820F4 这个点已经很远离需要检测的了。
一看就知道我的渣渣显卡是ATI了。如果是英伟达的就是ndvxxxx 平台再怎么牛B也不会检测到这里来的。
偷笑

居然HOOK到这里来了,我真是觉得我太贱了。就这个方法四。一直过11平台,从来没有被抓过。
2014-5-11 11:28
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
发布后,直接扫你dll特征
2014-5-11 11:57
0
雪    币: 1392
活跃值: (4862)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
6
笑死。代码开头就说了是shellcode。这代码只是原理。
2014-5-11 12:48
0
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
关键还是hook那。   字符串加密变形,进程隐藏,这些好做。
2014-5-11 13:26
0
雪    币: 7130
活跃值: (3778)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我是直接修改[ [TEMPV+0X17C] ] 这里,当然事先复制了一份内存在别的地方用来恢复,没用SHELLCODE,写了一个DLL用定时器循环画点
2014-5-11 14:24
0
雪    币: 4873
活跃值: (3112)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
能用的方法全爆了,估计也用不了多久了。
2014-5-11 22:52
0
雪    币: 177
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
弱爆了,这都好意思说过平台?
2014-5-12 09:05
0
雪    币: 6124
活跃值: (4471)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
12
主要学习画图
2014-10-31 09:07
0
雪    币: 102
活跃值: (1845)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
mark
2014-11-21 16:50
0
雪    币: 69
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不错,学习了。
2014-11-24 10:32
0
雪    币: 293
活跃值: (239)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
好帖,必须学习一下!
2014-11-30 15:08
0
雪    币: 171
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
英雄单位列表怎么跟出来的啊?
2014-12-1 15:05
0
雪    币: 171
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
方便加我qq271051631,我还有其他方法实现小地图,以及躲避技能等实现
2014-12-1 15:25
0
雪    币: 13
活跃值: (26)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
18
[QUOTE=htpidk;1283232]我是直接修改[ [TEMPV+0X17C] ] 这里,当然事先复制了一份内存在别的地方用来恢复,没用SHELLCODE,写了一个DLL用定时器循环画点[/QUOTE]

大大我的方法跟你不一样,一起交流下?
2015-6-12 20:42
0
雪    币: 33
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
mark
2015-12-22 13:54
0
雪    币: 665
活跃值: (414)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
进入膜拜模式,求收留
2016-6-19 14:29
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
膜拜,求指点。
2016-7-27 15:15
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
请问大神,如何修改成war3 1.26版本。请赐教
2016-7-27 15:35
0
游客
登录 | 注册 方可回帖
返回
//