我有一个smali代码,我想在其中一开始就注入一个sleep函数。为此,我创建了一个仅休眠的应用程序,生成了它的smali,并将其复制为应用程序,作为onCreate方法的第一条指令,并且运行良好,生成的代码为:

.locals 2
const-wide/16 v0, 0x2710

:try_start_0
invoke-static {v0, v1}, Ljava/lang/Thread;->sleep(J)V
:try_end_0
.catch Ljava/lang/InterruptedException; {:try_start_0 .. :try_end_0} :catch_0

:catch_0
//code continues here


我已经在一个应用程序中进行了测试,并且可以正常工作,0x2710 milisecconds(10秒)。注意,我必须更改locals值以注入新变量。现在,我想将同一段代码添加到另一个应用程序中,但是当我使用以下代码运行该应用程序时,出现了错误:


  10-04 22:53:50.709 4396 4396 E AndroidRuntime:java.lang.VerifyError:验证者拒绝了类com.sulctue.beaiasa.hcoisis:void com.sulctue.beaiasa.hcoisis.onCreate()无法验证:void com.sulctue .beaiasa.hcoisis.onCreate():[0x2]拒绝调用,索引0处的long或double参数不是一对:9 + 1。(“ com.sulctue.beaiasa.hcoisis”的声明出现在/ data / app / com.paranbijuv.aijuy-bovbnI4hv2jswty95nHE9A == / base.apk)
  10-04 22:53:50.709 4396 4396 E AndroidRuntime:at java.lang.Class.newInstance(本机方法)
  10-04 22:53:50.709 4396 4396 E AndroidRuntime:在android.app.Instrumentation.newApplication(Instrumentation.java:1102)
  10-04 22:53:50.709 4396 4396 E AndroidRuntime:在android.app.Instrumentation.newApplication(Instrumentation.java:1087)
  10-04 22:53:50.709 4396 4396 E AndroidRuntime:at android.app.LoadedApk.makeApplication(LoadedApk.java:983)
  10-04 22:53:50.709 4396 4396 E AndroidRuntime:在android.app.ActivityThread.handleBindApplication(ActivityThread.java:5715)
  10-04 22:53:50.709 4396 4396 E AndroidRuntime:at android.app.ActivityThread.-wrap1(未知来源:0)
  10-04 22:53:50.709 4396 4396 E AndroidRuntime:在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1656)
  10-04 22:53:50.709 4396 4396 E AndroidRuntime:在android.os.Handler.dispatchMessage(Handler.java:106)
  10-04 22:53:50.709 4396 4396 E AndroidRuntime:at android.os.Looper.loop(Looper.java:164)
  10-04 22:53:50.709 4396 4396 E AndroidRuntime:在android.app.ActivityThread.main(ActivityThread.java:6494)
  10-04 22:53:50.709 4396 4396 E AndroidRuntime:at java.lang.reflect.Method.invoke(本机方法)
  10-04 22:53:50.709 4396 4396 E AndroidRuntime:在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:438)
  10-04 22:53:50.709 4396 4396 E AndroidRuntime:在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
  10-04 22:53:53.470 1656 1907 I ActivityManager:杀死4396:com.paranbijuv.aijuy / u0a79(adj 900):崩溃


所以,我该怎么称呼:

invoke-static {v0, v1}, Ljava/lang/Thread;->sleep(J)V


的中间值是0x2710而不是变量v0?我尝试仅调用invoke-static {0x2710, v1} (...),但失败,并显示与上述相同的错误消息。

最佳答案

无法将常量值直接传递给Dex字节码中的函数。一切都必须首先存储在寄存器中。

仅根据错误消息很难说出您做错了什么,但是我的猜测是,您注入的本地代码导致注入代码之后的代码出现问题。也许您不小心覆盖了代码使用的方法参数。您能否张贴您收到验证错误的确切代码?

附言如果尝试运行invoke-static {0x2710, v1},则不应“得到与上述完全相同的错误”,因为该代码甚至都不会汇编。您应该已经得到了一个smali错误,因此您正在运行的apk可能不是汇编您认为正确的代码的结果。您应该仔细检查工具设置,并确保安装并运行正确的apk。

10-08 15:31