- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 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.12.2019 17:43 # +1
guest8 28.12.2019 20:36 # −999
Fike 29.12.2019 01:02 # 0
gost 30.12.2019 23:46 # 0
guest8 30.12.2019 23:49 # −999
guestinxo 05.01.2020 13:28 # 0
Stallman 28.12.2019 20:32 # 0
guest8 28.12.2019 20:36 # −999
HoBorogHuu_nemyx 28.12.2019 20:46 # 0
guest8 28.12.2019 20:54 # −999
HoBorogHuu_nemyx 28.12.2019 21:02 # 0
Разве это не прекрасно?
HoBorogHuu_nemyx 28.12.2019 21:03 # +1