Smali Code

2020. 2. 1. 15:202020/Android App Hacking

1. move vA, vB (A = B )

A: target register (4bits), B: source register (4bits)

 

2. move-result vAA ★★★★

A: target register (8bits)

해당 명령 직전의 invoke-X 함수 호출의 결과를 A에 저장한다.

 

3. return-void

invoke-X 함수 실행 후에 void값을 리턴한다. move-result명령 필요 X

 

4. return vAA

A: target register (8bits)

4byte까지의 데이터를 리턴한다.

 

5. return-object vAA

단순 변수가 아닌 Object를 리턴할 때 사용한다.

 

6.  const/4 vA, #+B

A(4bits), B(4bits) 

B에 지정된 값을 A에 저장한다

 

7. const/16 vAA, #+BBBB

AA: 16bits

BBBB: 정수 (16bits)

 

8. const vAA, #+BBBBBBBB

AA: 16bits

BBBBBBBB: 4byte짜리 상수

 

9. const-string vAA, string@BBBB

AA: 8bits

B: 문자열

A에는 B문자열에 대한 참조가 입력된다.

 

10. array-length vA, vB

A: 4bits

B: 4bits, 배열 참조 레지스터

B로 지정된 배열의 길이를 A에 저장한다.

 

11. new-array vA, vB, type@CCCC

A: 8bits

B: 배열 크기 register

C: 배열 타입

C로 지정한 형식으로 B로 지정한 크기의 배열을 만들어 A에 저장

 

12. goto + AA

AA: 8bits

해당 offset으로 분기

 

13. if-(X) vA, vB +CCCC  (e.g. if-eqz v0, :cond_26)

A: 4bits register

B: 4bits  register

CCCC: 분기되어질 offset (16bits)

if-eq: A==B

if-ne: A!=B

if-lt: A<B

if-le: A<=B

if-ge: A>=B

if-gt: A>B

 

14. if-(X)z vAA, +BBBB

AA: 8bits register

BBBB: 분기할 offset (16bits) - 주로 cond_0

if-eqz, if-nez, if-ltz, if-gtz, if-gez, if-lez

 

15. invoke-(X) {vC, vD, ...}, meth@BBBB

B: 참조할 함수

C,D : 함수의 인수

B로 지정한 함수를 실행한다. 함수의 결과는 move-result에 저장한다.

invoke-virtual, invoke-direct, invoke-static ...

 

* 69번 옆 주석은 반환값이 0과 같은 때 cond_17로 분기됨으로 수정해야한다.