1. Java / Говнокод #26284

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    private static void createHook(MethodNode mn,
                                   String targetClassName,
                                   String hookMethodClass,
                                   String hookMethodName,
                                   Boolean printMessages)
    {
        InsnList il = new InsnList();
        LabelNode originalLabelNode = new LabelNode();
        // Object caller, param1, param2, ...
        String hookMethodDesc = "(Ljava/lang/Object;" + mn.desc.substring(1);
    
        il.add(new VarInsnNode(Opcodes.ALOAD, 0));  // this
        il.add(new MethodInsnNode(Opcodes.INVOKESTATIC,
                                  isOriginalCallClassName,
                                  isOriginalCallMethodName,
                                  isOriginalCallMethodDesc,
                                  false));
        il.add(new JumpInsnNode(Opcodes.IFNE, originalLabelNode));
    
        if (printMessages) {
            il.add(BytecodeHelper.getPrintlnSequence("patched " + mn.name + mn.desc + " called"));
        }
    
        il.add(new VarInsnNode(Opcodes.ALOAD, 0));  // this
        il.add(getParamsLoadSequence(mn.desc, 1));  // other params
        il.add(new MethodInsnNode(Opcodes.INVOKESTATIC, hookMethodClass, hookMethodName, hookMethodDesc, false));
        il.add(new InsnNode(parseReturnOpcode(hookMethodDesc)));
    
        il.add(originalLabelNode);
    
        if (printMessages) {
            il.add(BytecodeHelper.getPrintlnSequence("original " + mn.name + mn.desc + " called"));
        }
        mn.instructions.insert(il);
    }

    Бытует мнение, что «Java» — это высокозащищённый язык, в котором невозможны всяческие си-подобные грязные хаки. На самом деле, конечно, это не так: просто чтобы прострелить себе ногу в «Жабе» — надо чуть больше постараться.

    Фрагмент небольшой самописной либы, позволяющей хукать произвольные методы, прямо как в «Microsoft Detours».

    Запостил: gost, 28 Декабря 2019

    Комментарии (12) RSS

    • А запускалось это говно через инструментарий «Java Agents»:
      private static void initialize(String agentArgs, Instrumentation inst)
      {
          try {
              String agentPath = null;
              if (Agent.class.getProtectionDomain() != null &&
                      Agent.class.getProtectionDomain().getCodeSource() != null &&
                      Agent.class.getProtectionDomain().getCodeSource().getLocation() != null) {
                  agentPath = Agent.class.getProtectionDomain().getCodeSource().getLocation().getPath();
              }
      
              if ((agentPath == null) || !agentPath.endsWith(".jar")) {
                  System.err.println("[AGENT]: Agent must be loaded from a .jar file. Detected path: " + agentPath);
                  System.err.println("[AGENT]: Loading cancelled.");
                  return;
              }
      
              System.out.println("[AGENT]: Initializing agent.");
      
              JarFile agentFile = new JarFile(new File(agentPath));
              inst.appendToBootstrapClassLoaderSearch(agentFile);
      
              HookEntries hookEntries = new HookEntries(new HookEntry[]{
                      new HookEntry("ru/gost/sandbox/IntGetter",
                                    "getSomeInt",
                                    "(I[Ljava/lang/String;)I",
                                    "ru/gost/agent/Hooks",
                                    "getSomeInt_hook"),
                      new HookEntry("java/net/URL",
                                    "getPath",
                                    "()Ljava/lang/String;",
                                    "ru/gost/agent/Hooks",
                                    "URL_getPath_hook")  // etc...
              });
      
              Class<?> agentInit = ClassLoader.getSystemClassLoader().loadClass("ru.gost.agent.AgentInit");
              Method initMethod = agentInit.getMethod("initialize", String.class, Instrumentation.class, HookEntries.class);
              initMethod.invoke(null, agentArgs, inst, hookEntries);
          } catch (Exception ex) {
              throw new RuntimeException(ex);
          }
      }
      Ответить
      • через него же запускается ёркит, емнип
        Ответить
      • так агенты и нужны для инструментации, привет
        Ответить
        • Именно поэтому я за «агенты».
          Ответить
          • Ну напиши нормальный профилировщик тогда

            йоркит говно же

            этот кал смешал в кучу wall clock time и cpu time.
            В итоге у меня thread.sleep занимает 80% времени
            Ответить
          • Мейлру?
            Ответить
    • Как типа сложно и многобуквенно. Типичный жабапонос.
      Ответить
      • Да, в жабе счтается что чем больше тупого бойлерплейта ты написал -- тем лучше.

        Если твой класс занимает менее 980-ти строк, то он скорее всего вообще ничего не делает
        Ответить
        • Именно поэтому я за «PHP».
          Ответить
          • ПХП искуссно импортировал из джавы все говно (new, extends, implements, ublic), и стал точно таким же вербозным)

            причем где говна было мало -- там он взял его из сей (-> вместо .)
            Ответить

    Добавить комментарий