gpt4 book ai didi

java - 如何在 Smali 汇编语言中传递即时值?

转载 作者:行者123 更新时间:2023-11-29 02:25:14 26 4
gpt4 key购买 nike

我有一个 smali 代码,我想在其中的一开始就注入(inject)一个 sleep 函数。为此,我创建了一个只是 hibernate 的应用程序,生成了它的 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 毫秒(10 秒)。请注意,我必须更改 locals 值才能注入(inject)新变量。现在,我想将这段相同的代码添加到另一个应用程序中,但是当我使用这段代码运行这个应用程序时,出现了错误:

10-04 22:53:50.709 4396 4396 E AndroidRuntime: java.lang.VerifyError: Verifier rejected class com.sulctue.beaiasa.hcoisis: void com.sulctue.beaiasa.hcoisis.onCreate() failed to verify: void com.sulctue.beaiasa.hcoisis.onCreate(): [0x2] Rejecting invocation, long or double parameter at index 0 is not a pair: 9 + 1. (declaration of 'com.sulctue.beaiasa.hcoisis' appears in /data/app/com.paranbijuv.aijuy-bovbnI4hv2jswty95nHE9A==/base.apk)
10-04 22:53:50.709 4396 4396 E AndroidRuntime: at java.lang.Class.newInstance(Native Method)
10-04 22:53:50.709 4396 4396 E AndroidRuntime: at android.app.Instrumentation.newApplication(Instrumentation.java:1102)
10-04 22:53:50.709 4396 4396 E AndroidRuntime: at 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: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5715)
10-04 22:53:50.709 4396 4396 E AndroidRuntime: at android.app.ActivityThread.-wrap1(Unknown Source:0)
10-04 22:53:50.709 4396 4396 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
10-04 22:53:50.709 4396 4396 E AndroidRuntime: at 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: at android.app.ActivityThread.main(ActivityThread.java:6494)
10-04 22:53:50.709 4396 4396 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
10-04 22:53:50.709 4396 4396 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
10-04 22:53:50.709 4396 4396 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
10-04 22:53:53.470 1656 1907 I ActivityManager: Killing 4396:com.paranbijuv.aijuy/u0a79 (adj 900): crash

那么,我该如何调用:

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

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

最佳答案

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

仅根据错误消息很难判断您做错了什么,但我的猜测是您注入(inject)的局部变量导致注入(inject)代码之后的代码出现问题。也许您不小心覆盖了代码使用的方法参数。您能否发布您收到验证错误的确切代码?

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

关于java - 如何在 Smali 汇编语言中传递即时值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52657370/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com