本文章使用了javassist
,javaagent
对方法字节码进行动态修改。
从凌晨23:50开始研究这个问题,现在4:00成功
朋友玩服务器,发现从6.8日9:00开始1.16.5客户端无法进入多人模式
搜索发现好像是当天8号才出现这个问题
对mc不太熟,觉得是微软搞了什么动作,抓包啥的,没抓到。
在语言资源里找到这串字符串
简单说就是玩的离dao线ban模式,没权限给你多人模式。那为啥以前离线模式可以玩呢?不懂,研究一下Minecraft源代码
一开始我是直接jadx打开主程序,发现没什么东西。通过上面字符串引用的签名,直接搜索,发现有个引用的地方调用了账号验证方法,然后抛出异常:
找到jar包:
发现有个传统验证方法,但是应该已经弃用了:
一开始找到了一个项目:yushijinhun/authlib-injector: Build your own Minecraft authentication system.
但是我试了,不行,可能是版本啥的问题。
于是尝试去找反混淆的项目,比如MCP啥的,看MC的源码。
这里用了forge的开发环境,反混淆映射表是mapped_official频道的,可以看authlib包的源代码:
找来找去找到了mc主类和主界面类:
感觉不远了,继续找:
检查是否多人模式。跟进去,调用了authlib。
socialInteractionsService
是一个接口,通过工厂方法创建一个com.mojang.authlib.yggdrasil.YggdrasilSocialInteractionsService
实例。发现这里就是判断是否允许多人登录的地方:
本来想用forge写一个mod修改,但是好像不行,或者我没找到文档。然后想着mod里写一个动态hook,尝试了一下没成功。最后想着用javaagent动态修改方法字节码。
找了一些教程,研究了一下,踩了很多坑,找了很多bug。
具体解决的问题:
步骤如下:
创建一个maven项目(java8),编辑配置:
创建一个org.example.PremainTest
类:
mvn package
编译,生成jar包。
回到forge项目(或者启动器),运行参数加上-javaagent
:
修改方法成功:
多人游戏也开放了:
启动器命令行参数里加上这行:
完美
<project xmlns
=
"506K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2S2N6X3g2F1i4K6u0W2j5i4m8S2j5$3S2W2i4K6u0W2L8%4u0Y4i4K6u0r3f1p5!0y4i4K6u0r3y4q4)9J5k6e0m8Q4x3X3f1H3"
xmlns:xsi
=
"acdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3U0l9H3x3g2)9J5c8W2S2y4e0q4y4U0K9r3g2E0j5g2)9J5k6r3W2F1M7%4c8S2L8X3y4W2"
xsi:schemaLocation
=
"f46K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2S2N6X3g2F1i4K6u0W2j5i4m8S2j5$3S2W2i4K6u0W2L8%4u0Y4i4K6u0r3f1p5!0y4i4K6u0r3y4q4)9J5k6e0m8Q4x3X3f1H3e4fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2S2N6X3g2F1i4K6u0W2j5i4m8S2j5$3S2W2i4K6u0W2L8%4u0Y4i4K6u0r3P5s2y4V1i4K6u0r3L8h3q4$3k6h3&6Q4x3X3b7@1i4K6u0W2x3q4)9J5k6e0m8Q4x3X3g2^5M7$3b7`."
>
<modelVersion>
4.0
.
0
<
/
modelVersion>
<groupId>org.example<
/
groupId>
<artifactId>agnet<
/
artifactId>
<version>
1.0
-
SNAPSHOT<
/
version>
<packaging>jar<
/
packaging>
<name>agnet<
/
name>
<url>http:
/
/
maven.apache.org<
/
url>
<properties>
<project.build.sourceEncoding>UTF
-
8
<
/
project.build.sourceEncoding>
<
/
properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins<
/
groupId>
<artifactId>maven
-
jar
-
plugin<
/
artifactId>
<version>
2.4
<
/
version>
<configuration>
<archive>
<!
-
-
打包时,设置MANIFEST.MF的信息
-
-
>
<manifestEntries>
<Premain
-
Class>org.example.PremainTest<
/
Premain
-
Class>
<Can
-
Redefine
-
Classes>true<
/
Can
-
Redefine
-
Classes>
<Can
-
Retransform
-
Classes>true<
/
Can
-
Retransform
-
Classes>
<
/
manifestEntries>
<
/
archive>
<
/
configuration>
<
/
plugin>
<plugin>
<groupId>org.apache.maven.plugins<
/
groupId>
<artifactId>maven
-
compiler
-
plugin<
/
artifactId>
<configuration>
<source>
8
<
/
source>
<target>
8
<
/
target>
<
/
configuration>
<
/
plugin>
<plugin>
<!
-
-
防止引用该jar的项目也使用javassist,与jar中javassist冲突
-
-
>
<artifactId>maven
-
shade
-
plugin<
/
artifactId>
<version>
3.1
.
0
<
/
version>
<executions>
<execution>
<phase>package<
/
phase>
<goals>
<goal>shade<
/
goal>
<
/
goals>
<configuration>
<createSourcesJar>true<
/
createSourcesJar>
<relocations>
<relocation>
<pattern>javassist<
/
pattern>
<shadedPattern>org.example.javassist<
/
shadedPattern>
<
/
relocation>
<
/
relocations>
<
/
configuration>
<
/
execution>
<
/
executions>
<
/
plugin>
<
/
plugins>
<
/
build>
<dependencies>
<dependency>
<groupId>junit<
/
groupId>
<artifactId>junit<
/
artifactId>
<version>
3.8
.
1
<
/
version>
<scope>test<
/
scope>
<
/
dependency><!
-
-
修改字节码时,使用javassist
-
-
>
<dependency>
<groupId>org.javassist<
/
groupId>
<artifactId>javassist<
/
artifactId>
<version>
3.27
.
0
-
GA<
/
version>
<
/
dependency>
<
/
dependencies>
<
/
project>
<project xmlns
=
"506K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2S2N6X3g2F1i4K6u0W2j5i4m8S2j5$3S2W2i4K6u0W2L8%4u0Y4i4K6u0r3f1p5!0y4i4K6u0r3y4q4)9J5k6e0m8Q4x3X3f1H3"
xmlns:xsi
=
"acdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3U0l9H3x3g2)9J5c8W2S2y4e0q4y4U0K9r3g2E0j5g2)9J5k6r3W2F1M7%4c8S2L8X3y4W2"
xsi:schemaLocation
=
"f46K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2S2N6X3g2F1i4K6u0W2j5i4m8S2j5$3S2W2i4K6u0W2L8%4u0Y4i4K6u0r3f1p5!0y4i4K6u0r3y4q4)9J5k6e0m8Q4x3X3f1H3e4fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2S2N6X3g2F1i4K6u0W2j5i4m8S2j5$3S2W2i4K6u0W2L8%4u0Y4i4K6u0r3P5s2y4V1i4K6u0r3L8h3q4$3k6h3&6Q4x3X3b7@1i4K6u0W2x3q4)9J5k6e0m8Q4x3X3g2^5M7$3b7`."
>
<modelVersion>
4.0
.
0
<
/
modelVersion>
<groupId>org.example<
/
groupId>
<artifactId>agnet<
/
artifactId>
<version>
1.0
-
SNAPSHOT<
/
version>
<packaging>jar<
/
packaging>
<name>agnet<
/
name>
<url>http:
/
/
maven.apache.org<
/
url>
<properties>
<project.build.sourceEncoding>UTF
-
8
<
/
project.build.sourceEncoding>
<
/
properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins<
/
groupId>
<artifactId>maven
-
jar
-
plugin<
/
artifactId>
<version>
2.4
<
/
version>
<configuration>
<archive>
<!
-
-
打包时,设置MANIFEST.MF的信息
-
-
>
<manifestEntries>
<Premain
-
Class>org.example.PremainTest<
/
Premain
-
Class>
<Can
-
Redefine
-
Classes>true<
/
Can
-
Redefine
-
Classes>
<Can
-
Retransform
-
Classes>true<
/
Can
-
Retransform
-
Classes>
<
/
manifestEntries>
<
/
archive>
<
/
configuration>
<
/
plugin>
<plugin>
<groupId>org.apache.maven.plugins<
/
groupId>
<artifactId>maven
-
compiler
-
plugin<
/
artifactId>
<configuration>
<source>
8
<
/
source>
<target>
8
<
/
target>
<
/
configuration>
<
/
plugin>
<plugin>
<!
-
-
防止引用该jar的项目也使用javassist,与jar中javassist冲突
-
-
>
<artifactId>maven
-
shade
-
plugin<
/
artifactId>
<version>
3.1
.
0
<
/
version>
<executions>
<execution>
<phase>package<
/
phase>
<goals>
<goal>shade<
/
goal>
<
/
goals>
<configuration>
<createSourcesJar>true<
/
createSourcesJar>
<relocations>
<relocation>
<pattern>javassist<
/
pattern>
<shadedPattern>org.example.javassist<
/
shadedPattern>
<
/
relocation>
<
/
relocations>
<
/
configuration>
<
/
execution>
<
/
executions>
<
/
plugin>
<
/
plugins>
<
/
build>
<dependencies>
<dependency>
<groupId>junit<
/
groupId>
<artifactId>junit<
/
artifactId>
<version>
3.8
.
1
<
/
version>
<scope>test<
/
scope>
<
/
dependency><!
-
-
修改字节码时,使用javassist
-
-
>
[注意]APP应用上架合规检测服务,协助应用顺利上架!