动态Java检测?

逆向工程 动态分析 爪哇 安卓
2021-06-26 03:13:34

这不是严格的“逆向工程”,它主要与动态仪器有关。

那么,以与strace允许您查看进程进行的系统调用或ftrace查看函数调用相同的方式,Java 是否有类似的东西?

我感兴趣的是有一个.jar在 javaVM 中运行文件。

有什么方法可以检测或跟踪应用程序代码进行的所有 Java API 调用?

也就是说,无需对内容进行任何静态分析.jar或无需对内容进行任何编辑.jar(例如添加钩子)。理想情况下,等效于strace或例如操纵的 javaVM的解决方案

这同样适用于 Android - 有没有办法跟踪应用程序进行的所有 Android 框架 API 调用(或其他本质上是 DalvikVM 的函数),而无需对 APK 文件进行任何编辑?环境/系统的所有其他编辑都很好。

在我的理想世界中,分析师在运行未编辑的应用程序(.jar.apk时会得到以下输出

timestamp1: java.security.SecureRandom.getSeed() called. Arguments: (Number) 
timestamp2: javax.security.cert.X509Certificate.checkValidity() called. Arguments: (null)
...
timestamp3: java.sql.Connection.prepareStatement() called. Arguments: ("SELECT * FROM X WHERE Y = W")
3个回答

Oracle Java 虚拟机

可以通过Java 平台调试器体系结构(JPDA)来跟踪 Java 程序的执行该框架允许您完全控制 JVM 中的执行(无需修改原始代码)。有关此框架的更深入视图,请参阅本教程

如果你想自己实现它,你应该使用MethodEntryRequest接口并拦截任何方法调用。

但是,如果您很懒惰(就像我一样),最好使用现有的项目,例如InTrace(另请参阅InTrace 项目相关项目页面)。

Android Java Dalvik 虚拟机

可以通过Dalvik Debug Monitor Server (DDMS) 和完整的Android 调试框架来跟踪 Android Java 程序

已经存在一些工具来跟踪程序的执行,例如Traceview 和 dmtracedump工具。最后,关于Dalvik JVM的一些提示

您可以使用agent来检测 Java,该代理将操作加载文件的字节码(推荐使用Asm进行字节码操作)。

您可能希望使用 Eclipse 的Bytecode Outline插件来调试执行。

这是关于该主题的一个很好的教程

通过加载时编织,AspectJ可用于在 JVM 上执行此操作。它建立在 Asm 上,但有更多的抽象(没有字节码)。跟踪方法调用相当简单:首先定义一个过滤器来匹配您感兴趣的“切入点”,然后指定您想要执行的操作(“建议”)。

不过语法有点尴尬:

package aspects;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.aspectj.lang.Signature;

aspect Trace{
    pointcut traceMethods() : (execution(* *(..))&& !cflow(within(Trace)));

    before(): traceMethods(){
        Signature sig = thisJoinPointStaticPart.getSignature();
        String line =""+ thisJoinPointStaticPart.getSourceLocation().getLine();
        String sourceName = thisJoinPointStaticPart.getSourceLocation().getWithinType().getCanonicalName();
        Logger.getLogger("Tracing").log(
                Level.INFO, 
                "Call from "
                    +  sourceName
                    +" line " +
                    line
                    +" to " +sig.getDeclaringTypeName() + "." + sig.getName()
        );
    }

}

编译:ajc -outxml -outjar aspects.jar Trace.java

要使用织布机运行 FooClass,请运行:

java -javaagent:aspectjweaver.jar -cp aspects.jar:${target_jar_name} FooClass