Jawa / Говнокод #26284 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 gost, (Updated )

Комментарии (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-ти строк, то он скорее всего вообще ничего не делает
      Ответить
        • ПХП искуссно импортировал из джавы все говно (new, extends, implements, ublic), и стал точно таким же вербозным)

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

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8