본 포스팅에서는 dalvik 바이트코드를 메모리에서 변조하는 방법을 다룹니다.


필자의 테스트 환경

- galaxy S5 

- Android 4.4.2

- Snapdragon 805 (32bit) 


"안드로이드 후킹, 메모리 변조 : frida framework를 활용한 dex 함수 후킹" 포스트에서 사용한 apk를 그대로 사용합니다.

우선, ida로 classes.dex를 연 다음 check_file 함수를 찾습니다. su 파일 경로를 인자로 전달받아, 파일이 존재하면 true를 리턴하는 함수입니다.

이 함수를 무조건 false를 리턴하게 하면 되겠지요.

현재 바이트 파싱이 big endian으로 되어있기 때문에 바이트를 뒤집어서 보셔야 합니다.

각 바이트들이 무엇을 의미하는지는 http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html 에 자세하게 설명되어 있습니다.

함수의 마지막 줄을 보면 v0을 리턴하게 됩니다. 참고로 0이 true이고 1이 false입니다.

v0이 0또는 1로 설정되어 리턴하는 것을 보실 수 있습니다.

첫 줄을 보면, hex 0x12는 4비트를 변수에 설정하는 opcode입니다.

보통 0x12 0xXY 형태로 사용합니다. 

X는 설정할 값이고, Y는 변수입니다.

Y=0이면 v0, Y=1이면 v1, Y=2이면 v2 이런 식입니다.

우리는 v0 값을 false로 설정할 것이므로, 0x12 0x10 으로 메모리를 변조하면 됩니다.

0x12 0x10 수행 후, 0x00 0x0F 를 통해 리턴을 하게 하면 무조건 false를 리턴하게 되겠지요.


제, classes.dex 메모리를 ptrace를 통해 변조하면 됩니다.

classes.dex 파일에서는 check_file 함수의 offset이 0x132C60이었는데, 메모리에 매핑될 때는 앞에 부가적인 데이터들이 삽입됩니다. (0x28 바이트 고정)

이 데이터들을 건너뛰면, 해당 함수의 offset은 "dex" signature offset으로부터 0x132C60에 위치하게 됩니다. 

아래 그림은 0x76958000 를 덤프한 그림입니다. (메모리 덤프 방법은 http://codetronik.tistory.com/118 참조하세요.

아래 코드와 같이 dex 메모리를 변조할 수 있습니다.

ptrace에서 메모리를 read/write할 때, 사이즈 단위가 long이므로 (테스트한 단말기 환경에서는 4바이트), 아래의 PtraceWrite와 같은 패치 코드를 나눠서 write할 수 있는 함수를 작성해야 합니다.


정상적으로 패치가 되면 아래 화면처럼 null이 나타납니다.



+ Recent posts