Lpackage / name / ObjectName ;where L at the beginning means that it is an object, a; - the end of the name. This entry will be equivalent to
package . name . ObjectNamein java.
[ Ljava / lang / String ;
Lpackage / name / ObjectName ; -> MethodName ( III ) ZIn this example, Lpackage / name / ObjectName; - this is the object containing the method, MethodName is the name of the method, (III) are the types of the parameters to be passed (in this case, 3 inta), and Z is the type of the return value (in this case, bool).
method ( I [ [ IILjava / lang / String ; [ Ljava / lang / Object ; ) Ljava / lang / String ;
String method ( int , int [ ] [ ] , int , String , Object [ ] )
Lpackage / name / ObjectName ; -> FieldName : Ljava / lang / String ;
LMyObject ; -> callMe ( II ) V
private void updateProblemView ( )and his smali code
{
TextView localTextView = this . problem ;
String str1 = String . valueOf ( this . a ) ;
StringBuilder localStringBuilder1 = new StringBuilder ( str1 ) . append ( "" ) ;
int i = this . p ;
String str2 = op2text ( i ) ;
StringBuilder localStringBuilder2 = localStringBuilder1. append ( str2 ) . append ( "" ) ;
int j = this . b ;
StringBuilder localStringBuilder3 = localStringBuilder2. append ( j ) . append ( "" ) ;
int k = this . q ;
String str3 = op2text ( k ) ;
StringBuilder localStringBuilder4 = localStringBuilder3. append ( str3 ) . append ( "" ) ;
int m = this . c ;
String str4 = m + "=" ;
localTextView. setText ( str4 ) ;
}
. method private updateProblemView ( ) V
. locals 3
. prologue
. line 520
iget - object v0, p0, Lcom / splunchy / android / alarmclock / RingerActivity ; -> problem : Landroid / widget / TextView ;
new - instance v1, Ljava / lang / StringBuilder ;
iget v2, p0, Lcom / splunchy / android / alarmclock / RingerActivity ; -> a : I
invoke - static { v2 } , Ljava / lang / String ; -> valueOf ( I ) Ljava / lang / String ;
move - result - object v2
invoke - direct { v1, v2 } , Ljava / lang / StringBuilder ; -> < init > ( Ljava / lang / String ; ) V
const - string v2, ""
invoke - virtual { v1, v2 } , Ljava / lang / StringBuilder ; -> append ( Ljava / lang / String ; ) Ljava / lang / StringBuilder ;
move - result - object v1
iget v2, p0, Lcom / splunchy / android / alarmclock / RingerActivity ; -> p : I
invoke - direct { p0, v2 } , Lcom / splunchy / android / alarmclock / RingerActivity ; -> op2text ( I ) Ljava / lang / String ;
move - result - object v2
invoke - virtual { v1, v2 } , Ljava / lang / StringBuilder ; -> append ( Ljava / lang / String ; ) Ljava / lang / StringBuilder ;
move - result - object v1
const - string v2, ""
invoke - virtual { v1, v2 } , Ljava / lang / StringBuilder ; -> append ( Ljava / lang / String ; ) Ljava / lang / StringBuilder ;
move - result - object v1
iget v2, p0, Lcom / splunchy / android / alarmclock / RingerActivity ; -> b : I
invoke - virtual { v1, v2 } , Ljava / lang / StringBuilder ; -> append ( I ) Ljava / lang / StringBuilder ;
move - result - object v1
const - string v2, ""
invoke - virtual { v1, v2 } , Ljava / lang / StringBuilder ; -> append ( Ljava / lang / String ; ) Ljava / lang / StringBuilder ;
move - result - object v1
iget v2, p0, Lcom / splunchy / android / alarmclock / RingerActivity ; -> q : I
invoke - direct { p0, v2 } , Lcom / splunchy / android / alarmclock / RingerActivity ; -> op2text ( I ) Ljava / lang / String ;
move - result - object v2
invoke - virtual { v1, v2 } , Ljava / lang / StringBuilder ; -> append ( Ljava / lang / String ; ) Ljava / lang / StringBuilder ;
move - result - object v1
const - string v2, ""
invoke - virtual { v1, v2 } , Ljava / lang / StringBuilder ; -> append ( Ljava / lang / String ; ) Ljava / lang / StringBuilder ;
move - result - object v1
iget v2, p0, Lcom / splunchy / android / alarmclock / RingerActivity ; -> c : I
invoke - virtual { v1, v2 } , Ljava / lang / StringBuilder ; -> append ( I ) Ljava / lang / StringBuilder ;
move - result - object v1
const - string v2, "="
invoke - virtual { v1, v2 } , Ljava / lang / StringBuilder ; -> append ( Ljava / lang / String ; ) Ljava / lang / StringBuilder ;
move - result - object v1
invoke - virtual { v1 } , Ljava / lang / StringBuilder ; -> toString ( ) Ljava / lang / String ;
move - result - object v1
invoke - virtual { v0, v1 } , Landroid / widget / TextView ; -> setText ( Ljava / lang / CharSequence ; ) V
. line 521
return - void
. end method
invoke - static { v2 } , Ljava / lang / String ; -> valueOf ( I ) Ljava / lang / String ;on
invoke - static { v2 } , Ljava / lang / Integer ; -> toHexString ( I ) Ljava / lang / String ;and deal with the end. With the other two a little more complicated, they are not translated into String added to the result. Therefore, we replace
iget v2, p0, Lcom / splunchy / android / alarmclock / RingerActivity ; -> b : Ion
invoke - virtual { v1, v2 } , Ljava / lang / StringBuilder ; -> append ( I ) Ljava / lang / StringBuilder ;
move - result - object v1
iget v2, p0, Lcom / splunchy / android / alarmclock / RingerActivity ; -> b : I(note that the type of value being transferred has changed). Similarly, we do with the third number.
invoke - static { v2 } , Ljava / lang / Integer ; -> toHexString ( I ) Ljava / lang / String ;
move - result - object v2
invoke - virtual { v1, v2 } , Ljava / lang / StringBuilder ; -> append ( Ljava / lang / String ; ) Ljava / lang / StringBuilder ;
move - result - object v1
invoke - virtual { v2 } , Ljava / lang / String ; -> toUpperCase ( ) Ljava / lang / String ;for all three numbers.
move - result - object v2
const - string v2, "="on
const - string v2, "= 0x"Next, you need to change the type of the input field from numeric to text (numeric hex, unfortunately, does not provide). Similar properties are stored in xml files. Here I was helped by searching the files by the keywords “arithmetic”, “math” and the like. In the file res / layout / ringer.xml we find the line
we google, we find the list of values inputType, we change on "text".<EditText android: textSize = "36.0dip" android: gravity = "left" android: id = "@ id / math_solution" android: visibility = "invisible" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: text = "@ null" android: inputType = "phone" />
...It is rather difficult to understand anything, but we see some connection between the solution and com / splunchy / android / alarmclock / RingerActivity $ 9. It turns out the last - this is a smali file, which, apparently, jd-gui could not adequately display. We go there and find the comparison method we need!
label1621 : label1912 : for ( boolean bool15 = false ;; bool15 = true )
{
boolean bool16 = bool15 ;
this . arithmeticProblemSolved = bool16 ;
RingerActivity localRingerActivity14 = this ;
int i9 = 2131099787 ;
TextView localTextView4 = ( TextView ) localRingerActivity14. findViewById ( i9 ) ;
this . problem = localTextView4 ;
RingerActivity localRingerActivity15 = this ;
int i10 = 2131099788 ;
EditText localEditText1 = ( EditText ) localRingerActivity15. findViewById ( i10 ) ;
this . solution = localEditText1 ;
RingerActivity localRingerActivity16 = this ;
String str7 = "input_method" ;
InputMethodManager localInputMethodManager = ( InputMethodManager ) localRingerActivity16. getSystemService ( str7 ) ;
this . imm = localInputMethodManager ;
EditText localEditText2 = this . solution ;
9 local91 = new com / splunchy / android / alarmclock / RingerActivity $ 9 ;
9 local92 = local91 ;
RingerActivity localRingerActivity17 = this ;
ImageButton localImageButton5 = localImageButton3 ;
ImageButton localImageButton6 = localImageButton1 ;
local92. < init > ( localRingerActivity17, localImageButton5, localImageButton6 ) ;
localEditText2. setOnEditorActionListener ( local91 ) ;
...
...Well, we add the translation in the upper case to the line read from the input field, since we have already learned this. After that we replace
iget - object v1, p0, Lcom / splunchy / android / alarmclock / RingerActivity $ 9 ; -> this $ 0 : Lcom / splunchy / android / alarmclock / RingerActivity ;
invoke - static { v1 } , Lcom / splunchy / android / alarmclock / RingerActivity ; -> access $ 10 ( Lcom / splunchy / android / alarmclock / RingerActivity ; ) Landroid / widget / EditText ;
move - result - object v1
invoke - virtual { v1 } , Landroid / widget / EditText ; -> getText ( ) Landroid / text / Editable ;
move - result - object v1
invoke - interface { v1 } , Landroid / text / Editable ; -> toString ( ) Ljava / lang / String ;
move - result - object v1
new - instance v2, Ljava / lang / Integer ;
iget - object v3, p0, Lcom / splunchy / android / alarmclock / RingerActivity $ 9 ; -> this $ 0 : Lcom / splunchy / android / alarmclock / RingerActivity ;
iget v3, v3, Lcom / splunchy / android / alarmclock / RingerActivity ; -> x : I
invoke - direct { v2, v3 } , Ljava / lang / Integer ; -> < init > ( I ) V
invoke - virtual { v2 } , Ljava / lang / Integer ; -> toString ( ) Ljava / lang / String ;
move - result - object v2
invoke - virtual { v1, v2 } , Ljava / lang / String ; -> equals ( Ljava / lang / Object ; ) Z
move - result v1
...
iget v3, v3, Lcom / splunchy / android / alarmclock / RingerActivity ; -> x : Ion
invoke - direct { v2, v3 } , Ljava / lang / Integer ; -> < init > ( I ) V
invoke - virtual { v2 } , Ljava / lang / Integer ; -> toString ( ) Ljava / lang / String ;
move - result - object v2
iget v2, v3, Lcom / splunchy / android / alarmclock / RingerActivity ; -> x : Iand here we also add the translation to the upper case. We collect, we look. Hooray! Everything is working.
invoke - static { v2 } , Ljava / lang / Integer ; -> toHexString ( I ) Ljava / lang / String ;
move - result - object v2
Source: https://habr.com/ru/post/127637/
All Articles