Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Smali汇编语言中传递imediate值?_Java_Android_Assembly_Bytecode_Smali - Fatal编程技术网

Java 如何在Smali汇编语言中传递imediate值?

Java 如何在Smali汇编语言中传递imediate值?,java,android,assembly,bytecode,smali,Java,Android,Assembly,Bytecode,Smali,我有一个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/Interrupt

我有一个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
10毫秒(10秒)。注意,我必须更改
locals
值以注入新变量。现在,我想将同一段代码添加到另一个应用程序中,但当我使用此代码运行此应用程序时,出现错误:

10-04 22:53:50.709 4396 4396 E AndroidRuntime:java.lang.VerifyError:Verifier拒绝类com.sultue.beaiasa.hcoisis:void com.sultue.beaiasa.hcoisis.onCreate()未能验证:void com.sultue.beaiasa.hcoisis.onCreate():[0x2]拒绝调用,索引0处的长参数或双参数不是一对: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: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.LoadedAppk.makeApplication(LoadedAppk.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:在android.app.ActivityThread.-wrap1(未知来源: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(本机方法)
10-04 22:53:50.709 4396 4396 E AndroidRuntime:com.android.internal.os.RuntimeInit$MethodAndArgscaler.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活动管理者:杀害4396:com.paranbijuv.aijuy/u0a79(形容词900):撞车

那么,我该如何称呼:

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

是否使用imediate值
0x2710
而不是变量
v0
?我尝试调用
invoke static{0x2710,v1}(…)
,但失败了,错误消息与上面相同。

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


仅根据错误消息很难判断您做错了什么,但我的猜测是,您注入的局部变量导致了注入代码后面的代码出现问题。可能您无意中覆盖了代码使用的方法参数。你能发布你得到验证错误的确切代码吗


另外,如果您试图运行
调用静态{0x2710,v1}
,您不应该“得到与上面完全相同的错误”,因为该代码甚至不会汇编。您应该得到一个smali错误,因此您正在运行的apk可能不是您认为是汇编代码的结果。您应该仔细检查您的工具设置,并确保您正在安装和运行正确的apk。

您可以发布获得验证错误的确切代码吗?两种情况下的错误消息基本相同:
“拒绝调用,索引0处的长参数或双参数不是一对:9+1”
。都经过logcatI的验证我刚刚在这里发布了代码,所以我的问题没有被1000行代码淹没…我没有看到发布的代码有任何错误。尝试缩小问题范围的两件事是:尝试在不做任何修改的情况下拆解和重新组装应用程序,看看它是否有效。然后对您的测试应用程序执行同样的操作。我对其进行了拆解和重新组装,完全没有进行任何修改,我注意到重新组装工作正常,但与原始应用程序的哈希值不同