热血V60000自动打怪

1.怪ID:

搜索十六进制FFFF(怪未选中时),切掉怪,搜变动的值(一般是小与FFFF),最后找到一个地址,查找访问

0071d59b - mov edx,[eax+00001a5c]  EAX=1FDBDDB8

搜EAX的值,找到好多,选三个绿色的

03E64D50  03E7C46C  03E78920

小退一下回到选择人物窗口,再进去后用CE添加地址,看看这三个哪个是,结果发现除了中间的一个都可以,好吧,用第一个吧

[03E64D50]+1a5c就是选中怪对象ID

2.显示血条:

选中怪时肯定会去读取指向怪ID的地址内容,我们在这个地方下内存写入(下访问断点会一直断下来)断点,在游戏中选一个怪后断下

  1. 0047528E  |> \8B17          mov edx,dword ptr ds:[edi]  
  2. 00475290  |.  6A 00         push 0  
  3. 00475292  |.  6A 01         push 1  
  4. 00475294  |.  68 4D040000   push 44D  
  5. 00475299  |.  8BCF          mov ecx,edi  
  6. 0047529B  |.  FF52 04       call dword ptr ds:[edx+4]  
  7. 0047529E  |.  A1 FCA9DF00   mov eax,dword ptr ds:[DFA9FC]  
  8. 004752A3  |.  85C0          test eax,eax  
  9. 004752A5  |.  74 47         je short Client.004752EE  
  10. 004752A7  |.  8B80 AC020000 mov eax,dword ptr ds:[eax+2AC]  
  11. 004752AD  |.  85C0          test eax,eax  
  12. 004752AF  |.  74 3D         je short Client.004752EE  
  13. 004752B1  |.  8B80 5C020000 mov eax,dword ptr ds:[eax+25C]  
  14. 004752B7  |.  85C0          test eax,eax  
  15. 004752B9  |.  74 33         je short Client.004752EE  
  16. 004752BB  |.  813D C0C9E000>cmp dword ptr ds:[E0C9C0],321  
  17. 004752C5  |.  75 27         jnz short Client.004752EE  
  18. 004752C7  |>  8B4F 14       mov ecx,dword ptr ds:[edi+14]  
  19. 004752CA  |.  51            push ecx                               ; /Arg1  
  20. 004752CB  |.  8BC8          mov ecx,eax                            ; |  
  21. 004752CD  |.  E8 5E69FDFF   call Client.0044BC30                   ; \Client.0044BC30  
  22. 004752D2  |.  A1 FCA9DF00   mov eax,dword ptr ds:[DFA9FC]  
  23. 004752D7  |.  8B57 14       mov edx,dword ptr ds:[edi+14]  
  24. 004752DA  |.  52            push edx                               ; /Arg2  
  25. 004752DB  |.  6A 05         push 5                                 ; |Arg1 = 00000005  
  26. 004752DD  |.  8B88 AC020000 mov ecx,dword ptr ds:[eax+2AC]         ; |  
  27. 004752E3  |.  8B89 5C020000 mov ecx,dword ptr ds:[ecx+25C]         ; |  
  28. 004752E9  |.  E8 E25AFDFF   call Client.0044ADD0                   ; \Client.0044ADD0  
  29. 004752EE  |>  A1 2089E703   mov eax,dword ptr ds:[3E78920]         ;  这是我们上面找到的第三个地址  
  30. 004752F3  |.  8B57 0C       mov edx,dword ptr ds:[edi+C]           ;  edi应该指向怪物对象基址,+c是ID地址  
  31. 004752F6  |.  8990 5C1A0000 mov dword ptr ds:[eax+1A5C],edx        ;  edx怪ID  
0047528E  |> \8B17          mov edx,dword ptr ds:[edi]
00475290  |.  6A 00         push 0
00475292  |.  6A 01         push 1
00475294  |.  68 4D040000   push 44D
00475299  |.  8BCF          mov ecx,edi
0047529B  |.  FF52 04       call dword ptr ds:[edx+4]
0047529E  |.  A1 FCA9DF00   mov eax,dword ptr ds:[DFA9FC]
004752A3  |.  85C0          test eax,eax
004752A5  |.  74 47         je short Client.004752EE
004752A7  |.  8B80 AC020000 mov eax,dword ptr ds:[eax+2AC]
004752AD  |.  85C0          test eax,eax
004752AF  |.  74 3D         je short Client.004752EE
004752B1  |.  8B80 5C020000 mov eax,dword ptr ds:[eax+25C]
004752B7  |.  85C0          test eax,eax
004752B9  |.  74 33         je short Client.004752EE
004752BB  |.  813D C0C9E000>cmp dword ptr ds:[E0C9C0],321
004752C5  |.  75 27         jnz short Client.004752EE
004752C7  |>  8B4F 14       mov ecx,dword ptr ds:[edi+14]
004752CA  |.  51            push ecx                               ; /Arg1
004752CB  |.  8BC8          mov ecx,eax                            ; |
004752CD  |.  E8 5E69FDFF   call Client.0044BC30                   ; \Client.0044BC30
004752D2  |.  A1 FCA9DF00   mov eax,dword ptr ds:[DFA9FC]
004752D7  |.  8B57 14       mov edx,dword ptr ds:[edi+14]
004752DA  |.  52            push edx                               ; /Arg2
004752DB  |.  6A 05         push 5                                 ; |Arg1 = 00000005
004752DD  |.  8B88 AC020000 mov ecx,dword ptr ds:[eax+2AC]         ; |
004752E3  |.  8B89 5C020000 mov ecx,dword ptr ds:[ecx+25C]         ; |
004752E9  |.  E8 E25AFDFF   call Client.0044ADD0                   ; \Client.0044ADD0
004752EE  |>  A1 2089E703   mov eax,dword ptr ds:[3E78920]         ;  这是我们上面找到的第三个地址
004752F3  |.  8B57 0C       mov edx,dword ptr ds:[edi+C]           ;  edi应该指向怪物对象基址,+c是ID地址
004752F6  |.  8990 5C1A0000 mov dword ptr ds:[eax+1A5C],edx        ;  edx怪ID


 

断在004752F6这一行,向上找有好几个CALL,但是我们分析,edi的值可能是怪物对象基址,所以call的时候肯定牵扯到edi,我们可以先dd edi看一下,最终选择了这个0047529B call,(我觉得显示血条应该有个标识,这个CALL压栈的时候参数有1,0,或许就是标识是否显示血条的)。等分析出了怪物列表基址再来测试,因为要用到edi的值。

3.怪物对象基址:

dd [03E64D50]+1a5c 下写入断点,记下edi的值,CE中搜索,最后剩下一个,查找访问,记下代码

0041ca4b - mov eax,[edx*4+fcexp+35e00e0]  EDX=00001253

Od中0041CA4B    8B0495 E0ECE603 MOV EAX,DWORD PTR DS:[EDX*4+3E6ECE0],这应该就是怪物对象数组了,dd [1250*4+3E6ECE0]看一下,应该没错,偏移就是各项属性。分析下偏移找出几个重要的

+8   对象分类

+c   对象ID

+31c 对象与人物间距离

+380 怪是否死亡 为1是死亡状态

 

4.攻击CALL:

同样攻击时会访问选中怪的ID值

分析还是用CE吧,因为发现在[03E64D50]+1a5c下访问断点,od会立马断下来,CE中先添加这个地址,查找访问

攻击时多出来的地址都记下来

0048806D  004880D3 

放到OD中看下,第一个找了没找到,第二个下断,攻击时断下,执行到返回,发现这个所在的函数没有参数,这条指令所在的CALL有可能就是我们的攻击CALL,返回到这个CALL

00662D0C    8B0D 2089E703   MOV ECX,DWORD PTR DS:[3E78920]

00662D12    E8 2953E2FF     CALL Client.00488040

代码注入器测试,成功。

 

 

下面可以写个简单的自动打怪了

  1. #define CurRoleBase 0x3E78920  //当前角色基址 或是0x3E734D0   
  2. #define CurListBase 0x3E6ECE0  //当前对象列表基址   
  3. #define BeatMonCall 0x00488040 //打怪CALL地址   
  4. VOID SelMon()  
  5. {  
  6.     int *b8,*bc,*b380;//定义偏移变量   
  7.     //对象类型 数组下标 是否死亡(为0是未死亡,1时死亡)   
  8.     float *b31c;//坐标变量,浮点型,到玩家的距离   
  9.     int* pb;//定义指针对象   
  10.     int* pSelMon;  
  11.     pSelMon=(int *)CurRoleBase;//[3E6E010]+1a5c   
  12.     pSelMon=(int *)(*pSelMon+0x1a5c);  
  13.     for (int i=CurListBase;i<(CurListBase+0xFFFF*4);i+=4)//每次增加4字节   
  14.     {   
  15.         pb=(int*)i;//遍历变量   
  16.         b8=(int*)(*pb+0x8);//偏移8,对象分类   
  17.         bc=(int*)(*pb+0xc);//偏移0C,数组下标   
  18.         b31c=(float*)(*pb+0x31c);//偏移31C,坐标距离   
  19.         b380=(int*)(*pb+0x380);//偏移380,死亡标识   
  20.         if ((*b8==0x2E)&&(*b31c<=100)&&(*b380==0))//查找符合条件的怪物   
  21.         {  
  22.             int selmonbase=*pb;  
  23.             if (*pSelMon==0xFFFF)//如果当前是未选中的状态,则显示血条   
  24.             {  
  25.                 __asm  
  26.                 {  
  27.                     mov edi,selmonbase  
  28.                         mov edx,[edi]  
  29.                     push 0  
  30.                         push 1  
  31.                         push  0x44D  
  32.                         mov ecx,edi  
  33.                         mov edx,[edx+4]  
  34.                     call edx  
  35.                 }  
  36.             }             
  37.             //选怪   
  38.             pb=(int*)CurRoleBase;  
  39.             pb=(int*)(*pb+0x1a5c);  
  40.             *pb=*bc;  
  41.             //memcpy(pb,bc,4);   
  42.             return ;  
  43.         }   
  44.     }  
  45. }  
  46.   
  47. VOID BeatMon()  
  48. {  
  49.     __asm  
  50.     {  
  51.         mov ecx,CurRoleBase  
  52.         mov ecx,[ecx]  
  53.         mov eax,BeatMonCall  
  54.         call eax  
  55.     }  
  56. }  
#define CurRoleBase 0x3E78920  //当前角色基址 或是0x3E734D0
#define CurListBase 0x3E6ECE0  //当前对象列表基址
#define BeatMonCall 0x00488040 //打怪CALL地址
VOID SelMon()
{
	int *b8,*bc,*b380;//定义偏移变量
	//对象类型 数组下标 是否死亡(为0是未死亡,1时死亡)
	float *b31c;//坐标变量,浮点型,到玩家的距离
	int* pb;//定义指针对象
	int* pSelMon;
	pSelMon=(int *)CurRoleBase;//[3E6E010]+1a5c
	pSelMon=(int *)(*pSelMon+0x1a5c);
	for (int i=CurListBase;i<(CurListBase+0xFFFF*4);i+=4)//每次增加4字节
	{ 
		pb=(int*)i;//遍历变量
		b8=(int*)(*pb+0x8);//偏移8,对象分类
		bc=(int*)(*pb+0xc);//偏移0C,数组下标
		b31c=(float*)(*pb+0x31c);//偏移31C,坐标距离
		b380=(int*)(*pb+0x380);//偏移380,死亡标识
		if ((*b8==0x2E)&&(*b31c<=100)&&(*b380==0))//查找符合条件的怪物
		{
			int selmonbase=*pb;
			if (*pSelMon==0xFFFF)//如果当前是未选中的状态,则显示血条
			{
				__asm
				{
					mov edi,selmonbase
						mov edx,[edi]
					push 0
						push 1
						push  0x44D
						mov ecx,edi
						mov edx,[edx+4]
					call edx
				}
			}			
			//选怪
			pb=(int*)CurRoleBase;
			pb=(int*)(*pb+0x1a5c);
			*pb=*bc;
			//memcpy(pb,bc,4);
			return ;
		} 
	}
}

VOID BeatMon()
{
	__asm
	{
		mov ecx,CurRoleBase
		mov ecx,[ecx]
		mov eax,BeatMonCall
	    call eax
	}
}


然后写个定时器或是创建个线程去执行选怪打怪函数就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值