【问题标题】:Modifying Dalvik Virtual Machine to intercept methods of Application code修改 Dalvik 虚拟机以拦截应用程序代码的方法
【发布时间】:2015-03-18 15:27:14
【问题描述】:

在我目前的实现中,我只能拦截一些Class初始化方法的Method_Entry事件,包括:

*.<init> or *.<cinit>
* stands for any Class

所有用Java应用程序编写的方法都不见了。

目前,我已在以下位置插入“fprintf()”:

stack.cpp: dvmCallMethod() 
stack.cpp: dvmCallMethodV() 
stack.cpp: dvmCallMethodA()
stack.cpp: dvmInvokeMethod()
Interp.cpp: dvmInterpret()
Mterp.cpp: dvmMterpStd()

当 DVM 的这些地方被执行时,我会在我的日志文件中打印一条消息。但是,只有类初始化函数触发了我的 println() 代码。换句话说,应用程序方法的执行似乎并没有经过DVM的上述地方。我不知道 DVM 的哪个部分负责应用程序的方法执行。谁能给我一个线索?

【问题讨论】:

  • 请尝试格式化您的问题,这很难阅读。
  • 我刚刚重新编辑。你现在可以看到了。你能帮帮我吗?
  • 请不要与此问题互动,除非您真正准备好帮助某人试图在虚拟机实现的深处进行修改。如果那不是你,那么你不是观众,不太可能理解这里的问题。
  • 我想知道执行应用程序操作码是哪个函数。现在我修改一些cpp来知道是哪个
  • 我的代码没有被跳过。我将 dalvik 编译为 libdvm.so ,并在 IDA 中对其进行反汇编,我的代码仍然存在。连我都调试过了。

标签: android virtual-machine dalvik


【解决方案1】:

弄清楚事情是如何工作的最简单的方法是查看方法分析是如何工作的。每次调用方法时,分析都会在日志文件中添加一个条目。密钥文件是dalvik/vm/Profile.h,它定义了像TRACE_METHOD_ENTER 这样的宏。 (在姜饼中,这就是你需要寻找的全部。在 ICS 中情况发生了很大变化,当调试、分析和 JIT 编译之间的交互被重新设计时。KitKat 将“采样”分析器添加到了组合中。所以它是现在有点曲折,还有一些其他功能需要注意,比如dvmFastMethodTraceEnter()。)

您在问题中确定的入口点用于反射和调用本机代码。解释代码之间的调用通过更新堆栈和程序计数器来处理,并继续循环通过解释器。你可以在line 3928 in the portable interpreter看到这个。

不明显的部分是FINISH() 宏,定义在第 415 行。这会调用dvmCheckBefore(),行1692 in Interp.cpp。这个函数检查subMode 字段,看看是否有什么有趣的事情要做;您可以在定义中找到各种含义,line 50 in InterpState.h。简而言之,标志用于各种分析、调试和 JIT 编译功能。

您可以在方法调用处理中看到subModeline 3916 in the portable interpreter 的检查。它调用dvmReportInvoke(),在Interp.cpp 中调用TRACE_METHOD_ENTER 宏。

如果您只是想在每次调用任何方法时都发生一些事情,那么您可能应该将其连接到分析系统中,因为这已经在做您想做的事情了。如果您不需要方法分析功能,只需将它们替换为您的代码即可。

【讨论】:

  • 我在 InterpC-portable.cpp 中添加了我的日志函数:GOTO_TARGET(invokeMethod, bool methodCallRange, const Method* _methodToCall, 3793 u2 count, u2 regs)。应用程序代码被执行了。但是我还是不明白为什么应用程序代码在这里运行。
  • 我不确定你不理解什么。 invokeMethod goto 目标具有用于方法调用处理的通用代码。它要么调用本机方法,要么将 PC 移动到被调用方法的开头并继续循环执行指令。
  • 大循环是由方法启动的,与应用程序代码无关,方法不调用应用程序方法,为什么应用程序可以代码执行?
  • VM 代码结构为共享库,因此当有人(通常是应用程序框架)进行 JNI 调用时开始执行。查看命令行dalvikvm 的来源,了解我的意思:android.googlesource.com/platform/dalvik/+/jb-mr2-release/…。第 273 行的 CallStaticVoidMethod() 是解释代码执行开始的地方(如果您忽略类加载器活动)。通过 Jni.cpp (CallStatic##_jname##Method) 到 interp/Stack.cpp 中的 dvmCallMethodV(),它调用 dvmInterpret()
  • FWIW,Android应用框架第一次开始执行解释代码的地方在android.googlesource.com/platform/frameworks/base/+/…
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2015-02-22
  • 2011-06-17
相关资源
最近更新 更多