Интерпретация и понимание smali. может кто-нибудь помочь мне перевести?

я экспериментирую на своем устройстве Android, пытаясь поиграть с кодом приложения, чтобы я мог изучить его в то же время. Но я в значительной степени застрял в том, как редактировать smali-код. На самом деле это не так просто для тех, кто только выучил языки ООП.

Итак, это мой маленький код:

const-string v0, "get_value_one"
invoke-virtual {p0, v0}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I
move-result v0
iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:I

и это эквивалентный код Java:

Processor MyProcessor = new Processor();
try { 
    MyProcessor.l = paramJSONObject.getInt("get_value_one");
    return MyProcessor;  
} catch (Exception e) { }    
return MyProcessor;

На данный момент я хотел бы упростить задачу и просто добавить константу в параметр «MyProcessor.l» IE в Java:

MyProcessor.l = 10;

Я пробовал несколько разных подходов, таких как:

iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:10

но я получал ошибки компиляции, так что это было явно неправильно. Кроме того, я не очень понимал, что и почему я делаю то, что делаю. Может ли кто-нибудь провести меня через логические шаги здесь? Большое спасибо.


person Scott_yers    schedule 19.10.2014    source источник


Ответы (2)


Я также новичок в Android Reversing, и я потратил некоторое время на поиск простого понимания кода Smali и нашел это:

обратите внимание на структуру класса L;

Lcom/breakapp/dd/mymod/Processor;->l:I

исходное имя файла java

.source "example.java"

это переменные экземпляра класса

.field private someString:Ljava/lang/String;

Это присваивает строковое значение v0

const-string v0, "get_value_one"


Финалы фактически не используются напрямую, поскольку ссылки на них заменяются самим значением примитивной шпаргалки:

V - void, B - byte, S - short, C - char, I - int

J — long (использует два регистра), F — float, D — double

.field public final someInt:I  # the :I means integer
.field public final someBool:Z # the :Z means boolean

Взято из: взлом Android!

person JDFuzyll    schedule 06.11.2016

Вы можете прочитать документацию по байт-коду dalvik, так как она более подробная, чем документация, которую вы можете найти о smali. В любом случае, я также изучаю smali, поэтому, возможно, я не могу дать вам лучший ответ, но, возможно, это поможет. Давайте начнем с того, что делает iput:

iput vx,vy, field_id Помещает vx в поле экземпляра. На экземпляр ссылается vy.

источник: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html из коды операций dalvik

То же самое происходит и здесь. Вы влияете на регистр v2 с помощью регистра v0. При этом сделанное вами изменение было ошибочным. Вы изменили «I» на «10», но это не значение. В данном случае I означает целое число. Кроме того, это даже не то место, где вы хотите внести изменения в свой код. Давайте посмотрим:

const-string v0, "get_value_one"

reg v0 теперь имеет значение строки «get_value_one» (значение может быть не лучшим словом для его описания, поскольку это строка, но я думаю, что понял свою точку зрения)

invoke-virtual {p0, v0}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I
move-result v0

теперь вы вызвали метод getInt(String) для JSONObject, который вы получаете через параметр. Вы знаете это, так как {p0, v0} означает, что вы передаете v0 методу объекта, на который ссылается p0, который, как вы знаете, является параметром, поскольку он следует правилу p*. (Вы можете прочитать об этом здесь: https://code.google.com/p/smali/wiki/Registers).

К настоящему времени вы, должно быть, начинаете понимать, что вызов этого метода не поможет, если вы хотите присвоить значение cont вашей переменной 'l'.

iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:I

Эта последняя инструкция берет ваш регистр v2 и помещает в него значение v0. v0, прежде чем эта строка будет выполнена, имеет значение, полученное из метода JSONObject getInt(String), в то время как v2 ссылается на объект MyProcessor, а «Lcom/breakapp/dd/mymod/Processor;->l» ссылается на переменную 'l ', содержащееся в этом указанном объекте. ' :I ' позволяет узнать тип переменной. Поскольку Java строго типизирована, я уверен, что вы знаете, что для переменной всегда существует связанный тип. Это, конечно, должно быть указано в байт-коде, и именно так это и делается.

Я надеюсь, что это дало некоторую информацию, чтобы иметь возможность вносить нужные изменения, но я попытаюсь помочь немного больше, предложив вам изменить код, который вы показали, на что-то вроде этого:

const/4 v0, 0xA
iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:I

Первая строка присваивает константе (0xA шестнадцатеричный = 10 десятичный) значение v0, а затем передает ее, как я упоминал ранее.

Удачи в изучении smali и надеюсь хоть немного помогло

person XFCC    schedule 20.11.2014