#smali
#smali
Вопрос:
В последнее время я копался в некоторых закодированных файлах smali, и есть терминология, которую я просто не понимаю и нигде не объясняется (даже на сайте dalvik opcodes). Давайте начнем с вопросов
1. What is ->?
2. What is (somerandomletter):I, F, J, S, C, B etc. (any element encoding letter)?
example of both in one: Lcom/google/android/gms/games/achievement/AchievementEntity;->j:I
3. What is this god damned v1, v2, v3, or v4 I see everywhere?
ex. const-string/jumbo v1, "Type"
4. What is invoke-static and invoke-interface?
ex. invoke-interface {p0}, Lcom/google/android/gms/games/achievement/Achievement;->n()J
ex. invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
5. What are interfaces and public or private fields?
Ответ №1:
->
синтаксис, используемый для обозначения элемента (либо метода, либо поля).- Это примитивные типы. Они задокументированы на https://source.android.com/devices/tech/dalvik/dex-format.html (найдите «Семантику описания типов»). Смотрите также https://github.com/JesusFreke/smali/wiki/TypesMethodsAndFields
Lcom/google/android/gms/games/achievement/AchievementEntity;->j:I
является ссылкой на поле. Lcom/google/android/gms/games/achievement/AchievementEntity;
это класс, содержащий поле, ->
это синтаксис для обозначения члена, j
это имя поля, :
это просто разделитель и I
это тип поля (int).
-
Это регистры. Вы можете найти более подробную информацию на https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html и https://github.com/JesusFreke/smali/wiki/Registers
-
Они задокументированы на https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html
invoke-static используется для вызова статического метода (который всегда считается прямым методом).
invoke-interface используется для вызова метода интерфейса, то есть для объекта, конкретный класс которого неизвестен, используя method_id, который ссылается на интерфейс.
- Они соответствуют стандартной концепции интерфейса Java, а также общедоступных и закрытых полей.