热血V60000自动打怪

1.怪ID:

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

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

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

03E64D50 03E7C46C 03E78920

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

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

2.显示血条:

选中怪时肯定会去读取指向怪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

代码注入器测试,成功。

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

#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 } }


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值