gpt4 book ai didi

java - 如何使用检测打印 Java 运行时调用的所有方法?

转载 作者:行者123 更新时间:2023-12-01 20:52:21 25 4
gpt4 key购买 nike

我想打印出运行时调用的所有方法。它们应该按照调用的顺序打印出来,如果它们被多次调用,则应该打印多次。

这可用于逆向工程 - 查看当您按下按钮或执行特定操作时调用哪些函数。

我想为此使用 Java 代理和工具。

最佳答案

这可以使用 Java 代理和检测库来完成。

Java 代理 - 可以在代码主要部分之前运行单独的代码。

检测 - 在程序加载期间更改源代码。

使其工作的代码

(取自 appcrawler 并稍加修改):

agent.jar源代码:

SimpleTransformer.java:

package test;

import java.security.*;
import java.lang.instrument.*;
import java.util.*;
import javassist.*;

public class SimpleTransformer implements ClassFileTransformer {

public SimpleTransformer() {
super();
}

public byte[] transform(ClassLoader loader, String className, Class redefiningClass, ProtectionDomain domain, byte[] bytes) throws IllegalClassFormatException {
return transformClass(redefiningClass,bytes);
}

private byte[] transformClass(Class classToTransform, byte[] b) {
ClassPool pool = ClassPool.getDefault();
CtClass cl = null;
try {
cl = pool.makeClass(new java.io.ByteArrayInputStream(b));
CtBehavior[] methods = cl.getDeclaredBehaviors();
for (int i = 0; i < methods.length; i++) {
if (methods[i].isEmpty() == false) {
changeMethod(methods[i]);
}
}
b = cl.toBytecode();
}
catch (Exception e) {
e.printStackTrace();
}
catch (Throwable t) {
t.printStackTrace();
}
finally {
if (cl != null) {
cl.detach();
}
}
return b;
}

private void changeMethod(CtBehavior method) throws NotFoundException, CannotCompileException {
/*if (method.getName().equals("doIt")) {
method.insertBefore("System.out.println(\"started method at \" + new java.util.Date());");
method.insertAfter("System.out.println(\"ended method at \" + new java.util.Date());");
}*/



//MY CODE
//!Modifier.isAbstract(method.getModifiers()) -- abstract methods can't be modified. If you get exceptions, then add this to the if statement.
//native methods can't be modified.
if (!Modifier.isNative(method.getModifiers())) {
String insertString = "System.out.println(\"started method " + method.getName() + "\");";
method.insertBefore(insertString);
}
}

SimpleMain.java:

package test;

import java.lang.instrument.Instrumentation;

public class SimpleMain {
public static void premain(String agentArguments, Instrumentation instrumentation) {
instrumentation.addTransformer(new SimpleTransformer());
}
}

list .mf:

Manifest-Version: 1.0
Boot-Class-Path: javassist.jar
Premain-Class: test.SimpleMain

获取这些文件并将它们打包成 jar 文件。另请确保包含 javassist.jar(可从 www.javassist.org 下载)和tools.jar(位于 Program Files/Java/jdk/lib/中)中的文件。不确定第二个是否必要,但文章说这是出于某种原因。

现在您可以使用此 jar 文件作为 java 代理。

java -javaagent:agent.jar YourJavaProgram

瞧。 java代理将检测所有方法并打印出执行期间调用的每个方法。

关于java - 如何使用检测打印 Java 运行时调用的所有方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43027872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com