Изменение существующих методов в Smali

Я искал простой метод в smali (здесь из Android), и мне было интересно, как бы я сделал что-то простое для него, например, вернул false. Я пытался понять это, сравнивая с аналогами Java на некоторых примерах, и я думаю, что понимаю, как большая часть этого работает, но любые изменения, которые я делаю, не работают.

В настоящее время в Java используется следующий метод:

public static boolean isEnabled(){
    return com.example.test.isEnabled();
}

а в smali это:

.method public static isEnabled()Z
    .registers 1

    .prologue
    .line 3714
    invoke-static {}, Lcom/example/test;->isEnabled()Z

    move-result v0

    return v0
.end method

В контексте выше, как бы я изменил метод, чтобы просто сделать эквивалент Java return false;? Из того, что я смог увидеть, 0x0 является ложным, но просто возвращает эту проблему при компиляции smali (ожидая REGISTER?), поэтому мне было интересно, что именно мне нужно сделать.

Решение, а также объяснение, будут оценены! Это не для чего-то особенного, мне просто нравится смотреть на это.


person whitfin    schedule 26.08.2013    source источник
comment
move-result принимает только регистр. Вы можете загрузить ноль в регистр v0 с помощью const/4 v0, 0. См. milk.com/kodebase/dalvik-docs-mirror/docs. /dalvik-bytecode.html (или source.android. com/devices/tech/dalvik/dalvik-bytecode.html, но с форматированием не так просто справиться).   -  person fadden    schedule 27.08.2013


Ответы (1)


Вы могли бы довольно легко ответить на этот вопрос сами, написав быструю программу на Java, скомпилировав ее, выполнив dx-обработку, а затем разобрав ее.

public class EnabledTest {
    public static boolean isEnabled() {
        return false;
    }
}

А затем скомпилировать/dx/разобрать его

javac EnabledTest.java
dx --dex --output=EnabledTest.dex EnabledTest.class
baksmali EnabledTest.dex

И вы получите что-то вроде

.method public static isEnabled()Z
    .registers 1
    const v0, 0
    return v0
.end method
person JesusFreke    schedule 26.08.2013
comment
О, так вы можете просто использовать 0 вместо false? И спасибо за команды. Кроме того, тогда не нужно будет указывать ссылку на строку? - person whitfin; 27.08.2013
comment
Да, на уровне байт-кода нет определенного логического типа, только 0 и 1. Я не уверен, но я не думаю, что вы можете использовать произвольное ненулевое значение как истинное, я думаю должно быть 1. - person JesusFreke; 27.08.2013
comment
Номера строк — это просто отладочная информация. Они используются для добавления номеров строк в трассировки исключений и для обратного сопоставления с исходным расположением источника при отладке. Но вы можете безопасно удалить их, не затрагивая реальную функциональность программы. - person JesusFreke; 27.08.2013
comment
Верификатор байт-кода в Dalvik более требователен, чем верификатор в других популярных виртуальных машинах. Значение, отличное от 0 или 1, не должно приниматься в качестве логического значения. - person fadden; 27.08.2013
comment
@JesusFreke Ах, хорошо, я подумал, что, возможно, он использовался для отслеживания того, где он был каким-то образом с точки зрения исполнения или чего-то в этом роде. Хотя имеет смысл, что это просто отладка. - person whitfin; 27.08.2013
comment
@fadden Хорошо, тогда я, должно быть, ошибся, я думал, что увидел const v0, 0x0 в значении, которое в Java было var = false. - person whitfin; 27.08.2013
comment
@Zackehh9lives: Чтобы было ясно: 0 — ложь, 1 — правда. 0x0 равно 0. 0 также может быть нулевой ссылкой и числом ноль. Средство проверки байт-кода Dalvik отслеживает максимально возможное значение числа и пытается помешать вам рассматривать произвольные int как boolean, byte, short и т. д. - person fadden; 27.08.2013