【问题标题】:register has type Long (High Half) but expected Long (Low Half)寄存器的类型为 Long(High Half),但预期为 Long(Low Half)
【发布时间】:2019-12-22 17:56:45
【问题描述】:

我正在尝试解决媒体播放器 seekTo() 方法的问题,该方法在前进/后退远程按钮按下事件中调用,但我收到此错误:

使用以下已编辑的 smali 尝试将 long 参数转换为 int:

.method private static synthetic a(JLandroid/media/MediaPlayer;)V
    .locals 1

    long-to-int v0, p1
    .line 317
    invoke-virtual {p2, v0}, Landroid/media/MediaPlayer;->seekTo(I)V

    return-void
.end method

我该如何解决这个错误,或者有没有其他方法可以让它工作?

这是原始代码(但当我按下前进或倒退时,它只会停止/暂停视频):

long-to-int p1, p0
.line 317
invoke-virtual {p2, p1}, Landroid/media/MediaPlayer;->seekTo(I)V

我的临时修复是这样的:

.method private static synthetic a(JLandroid/media/MediaPlayer;)V
    .locals 3

#get current position
invoke-virtual {p2}, Landroid/media/MediaPlayer;->getCurrentPosition()I
move-result v0

#add some ms to current position register
const/16 v1, 0x6978
add-int v2,v0,v1
add-int v2,v2,v1
add-int v2,v2,v1
add-int v2,v2,v1
add-int v2,v2,v1

#seek to calculated position
    .line 317
    invoke-virtual {p2, v2}, Landroid/media/MediaPlayer;->seekTo(I)V
    return-void
.end method

但即使我按下后退,它也只会向前搜索(因为我只将时间添加到当前位置)。
我无法为 Rewind 事件找到/创建自定义方法,源非常大并且被混淆了。
跟随错误链和方法调用链并没有把我带到任何地方。

【问题讨论】:

    标签: android reverse-engineering smali


    【解决方案1】:

    因为这是一个静态方法,所以没有隐含的“this”参数,参数寄存器从p0开始。所以第一个长参数是p0,p1,MediaPlayer 参数是p2。

    对于long-to-int 指令(以及大多数使用长值的指令),您可以通过传递宽寄存器对中的第一个寄存器来指定要处理的宽值。在这种情况下,即p0,而不是p1。

    错误是指您传递的是宽寄存器对的上半部分,而不是下半部分。

    所以,long-to-int v0, p0 可能就是你想要的。

    【讨论】:

    • 谢谢您的解释,我在网上找不到任何相关信息。尽管它没有解决我的问题,但它帮助我理解了它的结构。我认为问题出在正在发送的参数中。
    • 是的,看起来您的更改实际上并没有……改变任何东西:)
    猜你喜欢
    • 1970-01-01
    • 2020-07-06
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    相关资源
    最近更新 更多