我感兴趣的是拥有一个在JavaVM中运行的
strace
文件。 是否可以检测或跟踪应用程序代码引起的所有Java API调用?
,即,没有对
ftrace
的内容进行任何静态分析或没有任何方法编辑.jar
的内容(例如,添加钩子)。理想情况下,解决方案相当于.jar
或例如操纵的javaVM 同样适用于Android-是否有一种方法可以跟踪应用程序进行的所有Android框架API调用(或其他本质上为DalvikVM的函数),而无需对所有APK文件进行任何编辑?在环境/系统中进行所有其他其他编辑都很好。
在我的理想世界中,分析师在运行未编辑的应用程序(
.jar
或strace
)时会得到以下输出: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")
#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
评论
在这种情况下-当.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。