dalvik字节码验证-dex2oat

如何解决dalvik字节码验证-dex2oat

我已经在字节码级别检测了一个应用程序,并从dex2oat收到以下验证错误:

2020-09-23 19:39:04.005 4864-4864/? W/dex2oat: Verification error in int a.d.cg.b(byte[],int,int)
2020-09-23 19:39:04.005 4864-4864/? W/dex2oat: int a.d.cg.b(byte[],int): [0x25] 
2020-09-23 19:39:04.005 4864-4864/? W/dex2oat: int a.d.cg.b(byte[],int): [0x27] 
2020-09-23 19:39:04.005 4864-4864/? W/dex2oat: int a.d.cg.b(byte[],int) failed to verify: int a.d.cg.b(byte[],int): [0x2C] monitor-exit on non-object (Undefined)

此方法的smali表示如下:

.method b([BII)I
    .locals 4

    move-object/from16 v2,p0

    move-object/from16 v3,p1

    move/from16 p0,p2

    move/from16 p1,p3

    iget-object v0,v2,La/d/cg;->a:La/d/bj;

    iget-object v0,v0,La/d/bj;->p:Ljava/io/InputStream;

    if-eqz v0,:cond_0

    const-string p2,"La/d/cg;->b([BII)I->3"

    invoke-static/range {p2 .. p2},Lde/tracer/Tracer;->trace(Ljava/lang/String;)V

    iget-object v0,La/d/bj;->p:Ljava/io/InputStream;

    check-cast v0,La/d/cn;

    iget-object v1,La/d/cn;->b:Ljava/lang/Object;

    monitor-enter v1

    :try_start_0
    invoke-virtual {v0,v3,p0,p1},La/d/cn;->b([BII)I

    iget-object v0,La/d/cn;->b:Ljava/lang/Object;

    invoke-virtual {v0},Ljava/lang/Object;->notify()V

    monitor-exit v1

    :cond_0
    const-string p2,"La/d/cg;->b([BII)I->12"

    invoke-static/range {p2 .. p2},Lde/tracer/Tracer;->trace(Ljava/lang/String;)V

    return p1

    :catchall_0
    move-exception v0

    monitor-exit v1
    :try_end_0
    .catchall {:try_start_0 .. :try_end_0} :catchall_0

    throw v0
.end method

非仪器版本不包含跟踪器的调用和前面定义跟踪字符串的const-string指令。另外,最初的四个移动指令在原始版本中也没有。它们用于在“末端”获得免费的寄存器。 我还用寄存器类型信息注释了smali文件,输出如下(仅是验证错误描述的有趣部分):

    #@1b
    #v0=(Reference,La/d/cn;);v1=(Reference,Ljava/lang/Object;);v2=(Reference,La/d/cg;);v3=(Reference,[B);p0=(Integer);p1=(Integer);p2=(Reference,Ljava/lang/String;);p3=(Integer);
    monitor-enter v1
    #v0=(Reference,Ljava/lang/String;);p3=(Integer);

    #@1c
    :try_start_1c
    #v0=(Reference,Ljava/lang/String;);p3=(Integer);
    invoke-virtual {v0,La/d/cn;->b([BII)I
    #v0=(Reference,Ljava/lang/String;);p3=(Integer);

    #@1f
    #v0=(Reference,Ljava/lang/String;);p3=(Integer);
    iget-object v0,La/d/cn;->b:Ljava/lang/Object;
    #v0=(Reference,Ljava/lang/Object;);v1=(Reference,Ljava/lang/String;);p3=(Integer);

    #@21
    #v0=(Reference,Ljava/lang/String;);p3=(Integer);
    invoke-virtual {v0},Ljava/lang/Object;->notify()V
    #v0=(Reference,Ljava/lang/String;);p3=(Integer);

    #@24
    #v0=(Reference,Ljava/lang/String;);p3=(Integer);
    monitor-exit v1
    #v0=(Reference,Ljava/lang/String;);p3=(Integer);

    #@25
    :cond_25
    #v0=(Reference,Ljava/lang/Object;):merge{0xc:(Reference,Ljava/io/InputStream;),0x24:(Reference,Ljava/lang/Object;)}
    #v1=(Conflicted):merge{0xc:(Uninit),Ljava/lang/Object;)}
    #v2=(Reference,[B);p0=(Integer);p1=(Integer);
    #p2=(Conflicted):merge{0xc:(Integer),Ljava/lang/String;)}
    #p3=(Integer);
    const-string p2,"La/d/cg;->b([BII)I->12"
    #v0=(Reference,Ljava/lang/Object;);v1=(Conflicted);v2=(Reference,Ljava/lang/String;);p3=(Integer);

    #@27
    #v0=(Reference,Ljava/lang/String;);p3=(Integer);
    invoke-static/range {p2 .. p2},Lde/tracer/Tracer;->trace(Ljava/lang/String;)V
    #v0=(Reference,Ljava/lang/String;);p3=(Integer);

    #@2a
    #v0=(Reference,Ljava/lang/String;);p3=(Integer);
    return p1
    #v0=(Reference,Ljava/lang/String;);p3=(Integer);

    #@2b
    :catchall_2b
    #v0=(Reference,0x1b:(Reference,La/d/cn;),0x1c:(Reference,0x1f:(Reference,Ljava/lang/Object;),0x21:(Reference,0x25:(Reference,0x2b:(Reference,Ljava/lang/Throwable;)}
    #v1=(Conflicted):merge{0xc:(Uninit),0x25:(Conflicted),0x2b:(Conflicted)}
    #v2=(Reference,Ljava/lang/String;),0x2b:(Conflicted)}
    #p3=(Integer);
    move-exception v0
    #v0=(Reference,Ljava/lang/Throwable;);v1=(Conflicted);v2=(Reference,[B);p0=(Integer);p1=(Integer);p2=(Conflicted);p3=(Integer);

    #@2c
    #v0=(Reference,[B);p0=(Integer);p1=(Integer);p2=(Conflicted);p3=(Integer);
    monitor-exit v1
    #v0=(Reference,[B);p0=(Integer);p1=(Integer);p2=(Conflicted);p3=(Integer);
    :try_end_2d
    .catchall {:try_start_1c .. :try_end_2d} :catchall_2b

    #@2d
    #v0=(Reference,[B);p0=(Integer);p1=(Integer);p2=(Conflicted);p3=(Integer);
    throw v0
    #v0=(Reference,[B);p0=(Integer);p1=(Integer);p2=(Conflicted);p3=(Integer);
.end method

当查看位置[0x2C]时,我仅观察到v1处于冲突状态,[0x2B]中描述的合并告诉我uninit已与引用类型合并。我认为这是问题所在,并导致验证错误(https://android.googlesource.com/platform/art/+/master/runtime/verifier/register_line.cc#367)。但是,当考虑附带寄存器类型信息的原始smali文件时,我发现v1从未处于冲突状态。而且,至少对我来说,奇怪的是,我的仪器从未接触过寄存器v1,因此如何发生这种冲突?

解决方法

问题在于,通过将调用添加到try块中的跟踪函数,您正在将该位置的边缘添加到所有异常处理程序。

有些指令可以引发异常,有些则不能。例如返回指令不能引发异常,而调用指令可以引发异常。因此,对于try块中可能抛出的任何指令,都会在该try块的所有异常处理程序中添加一条边。

在原始方法中,方法开始处的条件(if-eqz v0,:cond_0)直接跳转到return语句,因此异常处理程序没有任何优势,因为它不能引发异常。因此,到达该异常处理程序的唯一方法是通过已设置v1的执行路径。

但是,通过添加invoke指令,您从此处向异常处理程序添加了一条边,因此现在存在未设置v1的异常处理程序的执行路径。

因此,基本上,请考虑以下情况:v0在有条件的情况下为null(因此进行跳转),然后trace函数引发异常。将会调用异常处理程序,但尚未设置v1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res