首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Smali型转换为原语型

Smali型转换为原语型
EN

Stack Overflow用户
提问于 2015-09-06 19:22:58
回答 1查看 1.5K关注 0票数 1

我得到以下dalvikvm验证器错误:

代码语言:javascript
复制
Line 1041: W/dalvikvm( 2610): VFY: register1 v5 type 13, wanted 5
Line 1042: W/dalvikvm( 2610): VFY:  rejecting opcode 0x70 at 0x0032
Line 1043: W/dalvikvm( 2610): VFY:  rejected Lcom/cleanmaster/notification/aj;.b 

Smali代码:

代码语言:javascript
复制
.method private b(Lcom/cleanmaster/notification/normal/NotificationSetting;Lcom/cleanmaster/notification/normal/o;Landroid/widget/RemoteViews;)V
.registers 11
.prologue
const/4 v5, 0x1
.line 126
iget-object v0, p2, Lcom/cleanmaster/notification/normal/o;->s:Landroid/content/Intent;
if-eqz v0, :cond_c
.line 127
iget-object v0, p2, Lcom/cleanmaster/notification/normal/o;->s:Landroid/content/Intent;
.line 128
const-string v1, "notify_style_type"
.line 129
invoke-static {v5}, Ljava/lang/Byte;->valueOf(B)Ljava/lang/Byte;
move-result-object v5
const-string v6, "putExtra(Ljava/lang/String;B)Landroid/content/Intent;"
invoke-static {v6, v0, v1, v5}, La;->c(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
invoke-virtual {v5}, Ljava/lang/Byte;->byteValue()B
move-result v5
:cond_c
.line 130
invoke-static {}, Lcom/keniu/security/c;->a()Landroid/content/Context;
move-result-object v1
.line 131
const-string v0, "notification"
.line 132
const-string v6, "getSystemService(Ljava/lang/String;)Ljava/lang/Object;"
invoke-static {v6, v1, v0}, Lb;->a(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v6
check-cast v6, Ljava/lang/Object;
move-object v0, v6
check-cast v0, Landroid/app/NotificationManager;
iget-boolean v2, p1, Lcom/cleanmaster/notification/normal/NotificationSetting;->i:Z
iget-boolean v3, p1, Lcom/cleanmaster/notification/normal/NotificationSetting;->o:Z
.line 133
invoke-direct {p0, v1, p2, v2, v3}, Lcom/cleanmaster/notification/aj;->a(Landroid/content/Context;Lcom/cleanmaster/notification/normal/o;ZZ)Landroid/app/Notification;
move-result-object v2
iget v3, p2, Lcom/cleanmaster/notification/normal/o;->d:I
const/4 v4, 0x0
.line 134
invoke-direct {p0, v3, v4, v5}, Lcom/cleanmaster/notification/aj;->a(IZZ)I

在我看来,这就像上一次调用-直接参数v5是个问题。不知何故,dalvik事物不是一个原始类型,因此不能被转换为布尔型。总有一个:

代码语言:javascript
复制
invoke-virtual {v5}, Ljava/lang/Byte;->byteValue()B
move-result v5

有没有找不到支票?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-06 21:17:08

Opcode 0x70是调用直接的。引用v5的唯一的调用直接指令是最后一个:invoke-direct {p0, v3, v4, v5}, Lcom/cleanmaster/notification/aj;->a(IZZ)I。看起来v5是从您提到的方法设置的,但是它是一个字节(B),而这个方法需要一个布尔(Z)

为了自己诊断这类问题,您可以使用-r选项在有问题的dex文件上运行baksmali,该选项在任何给定点上都会在与寄存器类型相关的反汇编中添加注释。

另一个有用的选项是-f,它添加带有指令偏移量的注释,这样您就可以准确地识别dalvik验证错误用于哪个指令。

例如rejecting opcode 0x70 at 0x0032 -所以您可以在偏移量0x32处查找指令

代码语言:javascript
复制
baksmali classes.dex -o out -f -r

最后,为了确定错误提到的实际类型,可以查看https://android.googlesource.com/platform/dalvik/+/kitkat-mr2.2-release/vm/analysis/CodeVerify.h#59上的枚举。

例如,对于W/dalvikvm( 2610): VFY: register1 v5 type 13, wanted 5:类型13是字节,而类型5是布尔型。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32427371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档