Board logo

标题: [没人看][盗版皮肤相关]或许1.8.9(和1.8.8)的皮肤还能再抢救一下 [打印本页]

作者: DoraJDJ    时间: 2016-1-30 23:23     标题: [没人看][盗版皮肤相关]或许1.8.9(和1.8.8)的皮肤还能再抢救一下

本帖最后由 DoraJDJ 于 2016-1-30 23:24 编辑

诸君,这里是DoraJDJ

最近自己想玩下1.8.9单机,顺便想办法解决盗版皮肤问题,于是有了这个post

实际上这个post应该得发到MCBBS的,然而编程开发版发帖要审核到现在都还没过,于是发到这里先做个任务,反正技术向文章没人看(:3JZ


众所周知,从Minecraft 1.7.10开始,盗版用户的皮肤成了一个大问题,曾经通过AbstractClientPlayer类里面的部分方法获取皮肤的方法已经失效,改用Mojang自带的验证API获取皮肤,不过这些问题都得到了解决——UniSkinModCustomSkinLoader提供了解决方案。不过好景不长,由于国外某些技术系玩家找到了通过自定义NBT获取自定义头颅的方法,Mojang于1.8.4时期添加了皮肤域名白名单系统,只能接受来自mojang.com和minecraft.net的皮肤,于是大家懂得。

最终,即使MinecraftForge升级到1.8.8甚至是1.8.9版还是没有兼容这些版本的皮肤Mod(或许是本人太心急的原因?)。

实际上,1.8.9的皮肤或许还能再抢救一下。

发现祸根

由于个人原因,想玩玩1.8.9,于是开始找各种Mod,顺便解决一下皮肤问题。

就在准备解决皮肤问题的时候,突然想到1.8.4开始不能使用外站皮肤的“BUG”,于是开始寻找该功能的来源。

很快,本人在验证API的YggdrasilMinecraftSessionService类里找到了这些东西:
  1. private static final String[] WHITELISTED_DOMAINS = new String[]{".minecraft.net", ".mojang.com"}; // 定义白名单域名
复制代码
  1. private static boolean isWhitelistedDomain(String url) {
  2.         URI uri = null;

  3.         try {
  4.             uri = new URI(url); // 定义该皮肤的URL地址
  5.         } catch (URISyntaxException var4) {
  6.             throw new IllegalArgumentException("Invalid URL \'" + url + "\'");
  7.         }

  8.         String domain = uri.getHost(); // 获取地址的主机名

  9.         for(int i = 0; i < WHITELISTED_DOMAINS.length; ++i) { // 遍历白名单里的域名
  10.             if(domain.endsWith(WHITELISTED_DOMAINS[i])) { // 检查主机名是否为白名单所设
  11.                 return true; // 如果在白名单里,就算通过
  12.             }
  13.         }

  14.         return false; // 如果不在白名单里,对不起,丢掉丢掉
  15.     }
复制代码
(别问我怎么弄来的源代码,IDEA大法好,如果违规请通知我删除)

找到万恶之源就很简单了,接下来便是使用Forge的Coremod技术把这个方法给黑掉。

大修大补

在这里使用的模组源代码是UniSkinMod,使用GPL v2协议,特别感谢模组原作者RecursiveG  。

首先在Transformers添加修改这些方法的代码,于是有样学样地弄了一下:
  1. 在构造方法里添加:
  2. // Removes skin domain whitelist system to support custom skin
  3. hookMethod("com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService","isWhitelistedDomain","isWhitelistedDomain",
  4.                 "(Ljava/lang/String;)Z",
  5.                 new isWhitelistedDomainTransformer());

  6. 然后弄一个类:
  7.     /** Removes skin domain whitelist system to support custom skin @author DoraJDJ */
  8.     private class isWhitelistedDomainTransformer implements IMethodTransformer{
  9.         @Override
  10.         public void transform(MethodNode mn, String srgName, boolean devEnv, String classObfName) {
  11.             mn.instructions.clear();
  12.             mn.instructions.add(new InsnNode(Opcodes.ICONST_1));
  13.             mn.instructions.add(new InsnNode(Opcodes.IRETURN));
  14.             mn.maxLocals=0;mn.maxStack=0;
  15.         }
  16.     }
复制代码
通常情况下,这样做就算可以了,但是后来发现在运行的时候出现了错误
  1. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]: java.lang.reflect.InvocationTargetException
  2. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  3. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  4. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  5. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:         at java.lang.reflect.Method.invoke(Method.java:497)
  6. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:         at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97)
  7. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:         at GradleStart.main(GradleStart.java:26)
  8. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  9. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  10. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  11. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:         at java.lang.reflect.Method.invoke(Method.java:497)
  12. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:         at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
  13. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1061]: Caused by: net.minecraftforge.fml.relauncher.FMLSecurityManager$ExitTrappedException
  14. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1061]:         at net.minecraftforge.fml.relauncher.FMLSecurityManager.checkPermission(FMLSecurityManager.java:30)
  15. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1061]:         at java.lang.SecurityManager.checkExit(SecurityManager.java:761)
  16. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1061]:         at java.lang.Runtime.exit(Runtime.java:107)
  17. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1061]:         at java.lang.System.exit(System.java:971)
  18. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1061]:         at net.minecraft.launchwrapper.Launch.launch(Launch.java:138)
  19. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1061]:         at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
  20. [19:14:55] [Client thread/INFO]: [java.lang.ThreadGroup:uncaughtException:1061]:         ... 11 more
复制代码
经过各种自学,发现疑似是try-catch block和exceptions的问题,在mn.instructions.clear();后面再添加两行代码,问题解决:
  1.             mn.exceptions.clear();
  2.             mn.tryCatchBlocks.clear();
复制代码
(若有错误欢迎指出)

至此,1.8.9的皮肤问题完美解决。

最后,好奇的孩子可以看下源码了解下:https://github.com/DoraJDJ/UniSkinMod

初投稿,若有任何意见欢迎指出(:3JZ


顺便MCBBS的at功能好敏感,代码块里面有个Javadoc标签((at)author)都能at到...

DoraJDJ
2015年1月30日


作者: nmzfrank    时间: 2016-2-1 13:12

听说没人看
作者: ZD-fine    时间: 2016-2-1 15:00

完全看不懂。。。
作者: HiMeko233    时间: 2016-2-2 00:15

看不懂x
作者: 琰子    时间: 2016-2-2 13:17

看不懂
作者: azl999    时间: 2016-2-2 14:09

所以写了那么多还是没人看得懂( ´_ゝ`)
作者: ⑨    时间: 2016-2-8 13:33

我都不会用Transformers




欢迎光临 完美算数教室 (http://g.cirno.biz/) Powered by Discuz! 7.2