吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 30666|回复: 49
收起左侧

[原创] 【Minecraft】作弊端编写

  [复制链接]
czm233 发表于 2019-2-7 14:05
本帖最后由 czm233 于 2019-2-19 23:01 编辑

前言:
之前我看到很多dalao在自己写端用或者卖给别人,所以对这个也来了兴趣。最近放假有点时间,又看到身边很多人也开始写端,我就决定尝试一下。
这个帖子并非什么专业的帖子,也可以说只是我在尝试路上的一些笔记。看论坛上没有这样的帖子,所以我分享出来想让大家也了解一下。
如果您是对这个很熟悉的dalao,这只是个萌新的帖子,写得不好请不要喷我。
如果您发现了这个帖子中的错误,欢迎指出交流。
谢谢!(不知道这个帖子能不能发在这区,不能的话请通知我删除)

一、反编译、反混淆 MC
在下文中,我将把 反编译和反混淆 简称为 处理
在这一部分中,我将用到MCP(全称Minecraft Coder Pack)来处理Minecraft1.8.8进行挂端编写
  1.下载要用到的工具
   处理Minecraft1.8.8使用的是MCP918版本
   官方下载地址:http://www.modcoderpack.com/files/mcp918.zip
   2.开始处理
   下载完成后,将这个zip中的内容解压到一个文件夹下
   在其中的jars文件夹中,新建一个versions文件夹,再将你的Minecraft1.8.8复制到其中
   如果你操作得正确,那么现在的目录应该是这样
         

操作完成后目录的情况

操作完成后目录的情况

         然后编辑根目录下的decompile.bat,将以下内容覆盖到其中
[Asm] 纯文本查看 复制代码
@echo off
runtime\bin\python\python_mcp runtime\decompile.py --client --nocopy --norecompile %*
pause

         现在,运行decompile.bat,静静等待操作完成

二、将MC代码导入IDE
   第一步完成后,你肯定可以发现MCP的src文件夹里多了很多东西,这就是MCP处理完毕后得到的源码了
   不过先别急着用它新建项目,打开这个文件夹,你可以看到里面还有一个minecraft文件夹,这个才是src的根目录
   将它复制出来(这样可以保留一份原来的代码备用),再用它在你的IDE里新建一个项目,等IDE扫描完成,你会发现里面有很多错误,这是因为我们没有导入类库
   打开里面的1.8.8.json,找到里面的“libraries”数组,这里面写了1.8.8这个版本需要的所有类库,从你MC的.minecraft/libraries目录中按名字一个一个找到他们,或者从里面提供的url处下载,并导入你的项目中,再让IDE扫描项目,如果一切顺利,代码此时应该没有任何错误了(当然你有时间的话也可以去修那一堆警告)

三、开始写各种功能(这个部分很大!)
1、Hud
一个挂端,首先总得有控制各部分开关的地方,可以是命令,可以是Hud,可以是ClickGUI。
    命令实现最简单,但是使用麻烦;Hud更难,但是使用更方便;ClickGUI最难,但是使用比较方便而且可以进行很多配置
               我们就先从Hud开始吧

               在net.minecraft.client.gui包下有一个GuiIngame类,这个类参与游戏内游玩时的屏幕渲染,我们可以编辑它的renderGameOverlay方法来在游戏屏幕上渲染我们需要的内容,比如:
[Java] 纯文本查看 复制代码
FontRenderer fr = this.getFontRenderer();
fr.drawString("Test", 10, 10, ColorHelper.argb(0, 194, 194, 194));

           这段代码渲染了一个颜色RGB均为194,透明度为0的Test字符串在屏幕上10,10处,这里面的ColorHelper是我自己写的,用来生成argb颜色int,这里就不贴代码了
           这个包下还有一个Gui类,里面有一个静态方法drawRect,有5个参数,这里就有一个坑了
                  注意!注意!注意!这个方法的最后一个颜色参数是ARGB格式,但是里面的A在这里并不代表透明度,而是不透明度!
使用MC提供的这几个方法,我们就可以设计一个简单的Hud了
2、Reach
做完了Hud,接下来做具体功能吧

                  Reach,就是让你手更长,可以打到更远距离处的玩家,这个功能如何实现呢,首先我们看一下Minecraft这个类,里面响应了攻击键按下时的操作。分析响应部分,可以看到它调用了clickMouse方法,再转到这个方法,它使用了objectMouseOver这个变量来判断攻击的对象。使用IDE查找用例,发现net.minecraft.client.renderer包下的EntityRenderer类在getMouseOver对这个变量进行了赋值。
                 分析这个方法,其大致逻辑如下(随便画了个图):
                 

流程图

流程图

          可以看到,Reach的关键在后面的判断,具体代码是这一块:
[Java] 纯文本查看 复制代码
if (this.pointedEntity != null && flag && vec3.distanceTo(vec33) > 3.0D) // Reach(距离小于4.5格时只需要改这里)
{
    this.pointedEntity = null;
    this.mc.objectMouseOver = new MovingObjectPosition(MovingObjectPosition.MovingObjectType.MISS, vec33, (EnumFacing)null, new BlockPos(vec33));
}

          只要修改那个3.0D,就可以达到Reach的效果了,当然如果你修改到大于4.5D,就还是4.5D的效果,因为如果距离大于4.5格还有两个地方要改,但是4.5格一般已经足够,所以这里我们就不赘述了
3、Hitbox
                 Hitbox,就是增大实体的攻击判定箱,使你更容易打到实体
                 Hitbox的实现重点也在EntityRenderer.getMouseOver中。看之前的流程图可以知道,重点在遍历数组时的expand方法,具体代码如下:
[Java] 纯文本查看 复制代码
float f1 = entity1.getCollisionBorderSize();
AxisAlignedBB axisalignedbb = entity1.getEntityBoundingBox().expand((double)f1, (double)f1, (double)f1);

          只要修改f1的值就可以达到Hitbox的效果
4、Sprint
Sprint,就是强制疾跑
                 Sprint的实现方式很多,比如去掉一些判断等等,我们这里使用最简单最暴力的方式
                 转到net.minecraft.entity包下EntityLivingBase类的setSprinting方法,在最开始将这个方法的唯一参数sprinting设置为true,就可以达到一直疾跑的效果了
5、NoFall
                  NoFall,顾名思义就是无摔落伤害,它的实现可以用很多种方式,这里我们讨论最原始的一种(因为这个帖子并非讨论怎么绕过反作弊的)
                  在游玩时,net.minecraft.network.play.client包下的C03PacketPlayer及其内部类负责与服务端的位置交互,其中就有与摔落计算密切相关的onGround参数,这个参数为true表示玩家在地上,反之亦然
                  那么,只要我们修改这里,让onGround一直为true,那不就不会计算摔落伤害了吗?
                  将C03PacketPlayer及其各个内部类的构造器修改,在最后面加上一句this.onGround = true;就大功告成了
6、BugUp
                   BugUp就是掉落弹回,这个方法的实现可以直接让自己tp回去
                   在EntityPlayerSP类中加入一个BlockPos类型的lastestOG变量,再在它的的onLivingUpdate里加入这段代码:
[Java] 纯文本查看 复制代码
if(onGround)
    lastestOG = getPosition();
else if((lastestOG.getY() - getPosition().getY()) >= 3)
    setPosition(lastestOG.getX(), lastestOG.getY(), lastestOG.getZ());

            现在你掉落三格就会自动回到方块上了!
未完待续...

免费评分

参与人数 17吾爱币 +18 热心值 +16 收起 理由
anikoSAMA + 1 + 1 谢谢@Thanks!
喝杯Java压压惊 + 1 + 1 谢谢@Thanks!
余音鮇鏾 + 1 + 1 用心讨论,共获提升!
Lil_Jes + 1 为何不写一个高端的反作弊!!
eversinklava233 + 1 + 1 热心回复!
szjzxm4321 + 1 + 1 很深奥,顶!!!
似曾相识燕归来 + 1 + 1 用心讨论,共获提升!
酷力萌 + 1 + 1 谢谢@Thanks!
VE5514 + 2 + 1 用心讨论,共获提升!
woailiar + 1 + 1 谢谢@Thanks!
皓哥阿 + 1 + 1 谢谢@Thanks!
wo713423 + 1 + 1 用心讨论,共获提升!
Bigfengfeng + 1 + 1 加油
焰阳Gomez + 1 + 1 我很赞同!
asdqp + 1 + 1 谢谢@Thanks!
打金者BT + 1 + 1 等更新中......
笙若 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2019-2-8 19:37
别加分页,影响阅读。
GSCSDSUN 发表于 2021-1-16 12:27
lu_ 发表于 2019-2-11 07:44
感觉楼主对MC的造诣颇深,知道怎么过检测不。是一个checkclient mod。在.minecraft文件夹下有两个隐藏的d ...

不是的 大部分checkclientmod 都是扫描modlist 或者 扫描jvm加载的包 返回服务器 在服务端进行对比
如果要过检测得话 只能获取白端的数据发送到服务器

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
lu_ + 3 + 1 我很赞同!

查看全部评分

laibinhong 发表于 2019-2-8 20:02
头像被屏蔽
Luffy_Plus 发表于 2019-2-8 20:15
提示: 作者被禁止或删除 内容自动屏蔽
Fxmles 发表于 2019-2-8 21:10
研究一下
PeratX 发表于 2019-2-8 23:30
很好的教程,谢谢
极地企鹅 发表于 2019-2-9 00:31
挂端能在无mod的服务器上运行,有mod的就不行了吧
咕咚陛下 发表于 2019-2-9 09:06
虽然看不懂,但是先收藏了
 楼主| czm233 发表于 2019-2-9 13:49
极地企鹅 发表于 2019-2-9 00:31
挂端能在无mod的服务器上运行,有mod的就不行了吧

如果是有mod的服务器,其实可以整合forge进端,使用javaagent把forge的类导出然后修改放进客户端,这样也可以加载mod

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
VE5514 + 2 + 1 我很赞同!

查看全部评分

狗带die 发表于 2019-2-9 14:28
学习一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-26 00:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表