这并不是严格意义上的“逆向工程”,它主要与动态检测有关。 Java有什么类似的东西吗?

我感兴趣的是拥有一个在JavaVM中运行的strace文件。

是否可以检测或跟踪应用程序代码引起的所有Java API调用?

,即,没有对ftrace的内容进行任何静态分析或没有任何方法编辑.jar的内容(例如,添加钩子)。理想情况下,解决方案相当于.jar或例如操纵的javaVM

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

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

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")


评论

在这种情况下-当.jar文件作为参数传递给它时,分析java.exe可执行文件的行为难道不是很容易吗?

我不确定如何做到这一点以及它将产生什么样的输出。分析Java可执行文件会显示它对内核的syscalls-这不是我想要的。我正在寻找跟踪Java API的调用。另外,它在第二个目标Android上也不起作用。

对于Android,您可以使用DDMS跟踪目标,以便使用事件探查器进行检查,但是不会获取参数。如果您需要API调用和数据,则可以通过kprobes在内核中检测binder_transaction函数,尽管解析事务缓冲区有问题。
@MathewHall这非常有趣,可能是Android的解决方案。会调查一下!我想您会使用systemtap通过kprobes来测试binder_transaction吗?

是的,虽然您需要能够“解析”数据包(binder_transaction的参数),但SystemTap可能更容易。事务数据中的代码是服务的aidl文件中的索引,服务本身在缓冲区中显示为UTF-16字符串。对象参数比较棘手。这个0xlab幻灯片组很好地总结了Binder。

#1 楼

Oracle Java虚拟机

可以通过Java Platform Debugger Architecture(JPDA)跟踪Java程序的执行。该框架使您可以完全控制JVM中的执行(而无需修改原始代码)。请参阅本教程,以更深入地了解此框架。

如果要自己实现,则应使用MethodEntryRequest接口并拦截任何方法调用。

但是,如果您很懒(就像我一样),您可以最好使用InTrace等现有项目(另请参见InTrace项目的“相关项目”页面)。

Android Java Dalvik虚拟机

跟踪Android Java程序可以通过Dalvik调试监视器服务器(DDMS)和完整的Android调试框架来完成。

已经存在一些跟踪程序执行的工具,例如Traceview和dmtracedump工具。最后,有关Dalvik JVM的一些技巧。

评论


哇,这正是我在寻找的东西,我什至不知道这种东西的存在。感谢您睁开眼睛,这对于Java代码来说应该是完美的。

–JavaSec
13年4月11日在16:29

但是,所有这些工具都取决于javaagents功能,Dalvik不支持该功能,因此在Android上将无法使用。我想我应该再问一个更具体的Android问题。

–JavaSec
13年4月11日在16:30

我的错,我没有注意到您专门要求Dalvik JVM(认为'android'标签应该已经响了...)。而且,我对Android JVM不太了解。抱歉。 :-/

–恐怖
13年4月11日在16:42



我可以为Dalvik JVM附带的最接近的似乎是Dalvik调试监视器服务器(DDMS)和完整的Android调试框架。您似乎可以使用Traceview和dmtracedump工具提取跟踪。但是,我从未尝试过。

–恐怖
13年4月11日在16:58

我已经尝试过了,但似乎无法为这些方法提供论据,将进一步研究。我也刚刚发现,dalvikVM可以在adb shell上使用“ dalvikvm”独立启动,并且支持某种-agentlib选项来启动jdwp。我不知道这是否有用。 [netmite.com/android/mydroid/2.0/dalvik/docs/debugger.html]

–JavaSec
13年4月11日在17:02



#2 楼

您可以通过使用代理来检测Java,该代理将操纵已加载文件的字节码(建议使用Asm进行字节码操纵)。

您可能想使用Eclipse的Bytecode Outline插件来调试执行。 br />
这是关于该主题的很好的教程。

评论


谢谢你,这很好。但是,这涉及到操作jar文件,基本上是插入钩子。我主要是在做所有事情时都不要触碰.jar文件,以便被动地对其进行检查。这将允许分析``受保护''的代码(例如,通过另一个库使用完整性保护的代码,被严重混淆的代码等)。也许可操纵的Java或dalvik VM可以工作,以便API调用将自己记录在某个位置(?)。

–JavaSec
13年4月11日在9:54

嗯,我只是再次阅读了您发送的文章,看来它不涉及应用程序的操纵..嗯,还在研究中!

–JavaSec
13年4月11日在9:56

#3 楼

通过加载时编织,可以使用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


评论


请注意,这不适用于混淆的应用程序(或仅适用于没有调试信息编译的应用程序)。

–锑
13年8月28日在13:37