Memget Project for Mobile [Android] 사용법 입니다.
DOWNLOAD SITE : https://unsigned.kr/
현재 버전(1.5.12.192)기준으로 작성하겠습니다.
*****************************************
* Memget Project *
* Memget Mobile for Android *
* last update : 2017.02.26 *
* by nvdark *
* Version : 1.5.12.192 *
*****************************************
Usage : ./mm OPTION [...]
OPTIONS :
# 1 ######################
-m PATH [PATH ...] : File system event Monitor
ex) ./mm -m /data/local /system
# 2 ######################
-p PID : Function using PID, Read below
-i LIB_PATH : Library injection
ex) ./mm -p [PID] -i /data/lib.so
-s(Not yet) : SVC Monitor
ex) ./mm -p [PID] -s
-d OPTIONS: Debugging mode
ex) ./mm -p [PID] -d
-m : Menu mode : Step by Step
ex) ./mm -p [PID] -d -m
-n [NUMBER] : Select syscall number With Menu mode
Step by Syscall number you selected
ex) ./mm -p [PID] -d -n [SYSCALL NUMBER]
-s : Data search mode (not yet)
ex) ./mm -p [PID] -d -f 0x00003233
# 3 ######################
-t [EVENT] : Function Using Touch event
ex) ./mm -t /dev/input/event1
# 4 ######################
-d [DEX FILE] : Dex file class dump
ex) ./mm -d classes.dex
-d : Dalvik format
ex) ./mm -d classes.dex -d
- End -
PS : 한글화 버전 별도 배포
총 4가지 기능으로 되어 있으며, using을 보시면 '# [num] ####################' 으로 구분되어있습니다.
1. 파일 시스템 이벤트 모니터
취약점 점검을 하다보면 중요정보가 파일로 저장되고 있는지 확인해야할때가 있습니다. 또는 분석 시 순간적으로 생성되어졌다가 삭제되는 파일들도 존재합니다. 해당 옵션을 쓰면 모니터링 하고자 하는 디렉토리를 기준으로 파일 시스템 이벤트를 모니터링 합니다.
사용법은 다음과 같습니다.
./mm -m [PATH ...]
ex ./mm -m /data/data/abcd /data/app/abcd /data/data/eeee
모니터링 하고자 하는 경로를 쓰시면 하위 디렉토리까지 포함하여 모니터링을 시작합니다. 단, /data/local/tmp/은 하지마세요...버그 있습니다. /system이나 / 로 해도 상관은 없으나....죽을 확율이 클거라 생각됩니다...
실행하면 다음과 같은 화면이 나타납니다.
root@zerofltektt:/data/local/tmp # ls -al /data/data | grep line
drwxr-x--x u0_a196 u0_a196 2018-04-04 09:06 jp.naver.line.android
aver.line.android/ /data/app/jp.naver.line.android-1/ <
[+]File system event mode
[+]start...
[+]make temp directory : /data/local/tmp/mm_cmp
[+]Initalizing...
[+]Monitoring file System event
[+]Init for accessing
[+]Allocate memory for watch descriptors
[+]Target : total 14 directorise
[+]Listening
아무 앱이나 해봣습니다. /data/data/jp.naver.line.android와 /data/app/jp.naver.line.android-1/ 을 함께 모니터링 해봤습니다.
실행하고 나면 총 하위디렉토리 포함 총 14개의 디렉토리가 발견되었고 모니터링을 시작한다고 표시됩니다.
또한, temp directory가 있습니다. 새로 생성되거나 수정된파일들은 모드 /data/local/tmp/mm_cmp 폴더로 자동 복사가 됩니다. 때문에 순간적으로 생성되는 파일들도 별도의 분석없이 다 확인이 가능합니다.
점검 시 /data/local/tmp/mm_cmp 폴더 내 모인 파일들에서만 중요정보를 확인해보시면 될것 같습니다. 검색 기능은 추가예정이나 귀찮아서 못하고 못하고 있습니다. 추후 추가 예정이니다.
모니터링은 다음과 같이 표시됩니다.
[OPEN]: /data/data/jp.naver.line.android//databases/TsEvent-journal [file]
[MODIFY] : /data/data/jp.naver.line.android//databases/TsEvent-journal [file]
[MODIFY] : /data/data/jp.naver.line.android//databases/TsEvent-journal [file]
[OPEN]: /data/data/jp.naver.line.android//databases/TsEvent-journal [file]
[CLOSE_NOWRITE] : /data/data/jp.naver.line.android//databases/TsEvent-journal [file]
[OPEN]: /data/data/jp.naver.line.android//databases/TsEvent-journal [file]
[CLOSE_NOWRITE] : /data/data/jp.naver.line.android//databases/TsEvent-journal [file]
[OPEN]: /data/data/jp.naver.line.android//databases [directory]
[OPEN]: /data/data/jp.naver.line.android//databases/ [directory]
[CLOSE_NOWRITE] : /data/data/jp.naver.line.android//databases [directory]
[CLOSE_NOWRITE] : /data/data/jp.naver.line.android//databases/ [directory]
[MODIFY] : /data/data/jp.naver.line.android//databases/TsEvent [file]
[MODIFY] : /data/data/jp.naver.line.android//databases/TsEvent [file]
[OPEN]: /data/data/jp.naver.line.android//databases/TsEvent [file]
[CLOSE_NOWRITE] : /data/data/jp.naver.line.android//databases/TsEvent [file]
[OPEN]: /data/data/jp.naver.line.android//databases/TsEvent [file]
[CLOSE_NOWRITE] : /data/data/jp.naver.line.android//databases/TsEvent [file]
[MODIFY] : /data/data/jp.naver.line.android//databases/TsEvent-journal [file]
[OPEN]: /data/data/jp.naver.line.android//databases/TsEvent-journal [file]
[CLOSE_NOWRITE] : /data/data/jp.naver.line.android//databases/TsEvent-journal [file]
[CLOSE_WRITE] :/data/data/jp.naver.line.android//databases/TsEvent-journal [file]
파일 또는 디렉토리를 열거나 닫을때, 수정할때, 생성할때 등 이벤트를 표시해 줍니다.
생성, 변경 등의 이벤트가 발생한 파일에 대해서는 /data/local/tmp/mm_cmp에 모이게 됩니다.
130|root@zerofltektt:/data/local/tmp # cd mm_cmp
root@zerofltektt:/data/local/tmp/mm_cmp # ls -al
-rw------- root root 20480 2018-04-04 09:11 TsEvent
-rw------- root root 12824 2018-04-04 09:11 TsEvent-journal
-rw------- root root 12824 2018-04-04 09:11 TsEvent-journal_cmp
-rw------- root root 741 2018-04-04 09:11 com.google.android.gms.measurement.prefs.xml
-rw------- root root 741 2018-04-04 09:11 com.google.android.gms.measurement.prefs.xml_cmp
-rw------- root root 16384 2018-04-04 09:11 google_app_measurement_local.db
-rw------- root root 16384 2018-04-04 09:11 google_app_measurement_local.db_cmp
-rw------- root root 311296 2018-04-04 09:11 naver_line
-rw------- root root 12824 2018-04-04 09:11 naver_line-journal
-rw------- root root 20480 2018-04-04 09:11 naver_line_push_history
root@zerofltektt:/data/local/tmp/mm_cmp #
_cmp 라는 파일들이 있는데, 사실 변경전과 변경 후를 비교하기 위해서 만들었던 파일인데 다른곳에 신경쓰다가 까먹고 안했습니다...
2. PID가 필요한 기능들
pid가 필요한 기능들을 모아 뒀습니다.
사용법은 다음과 같습니다.
./mm -p [PID] [OPTIONS]
-i : 라이브러리 인젝션 기능입니다. 4.x 버전까지는 잘 동작하나 5.x부터는 selinux가 강화되어 /system/lib로 복사 후 인젝션을 진행해야 합니다.
현재는 별도의 인젝션 도구를 만들어 사용하고 있으나 자동화가 되어있지 않습니다...
-s : SVC 모니터라고 해놨으나 사실 구현하다가 왜 이걸 만들고 있나...쓸곳도 없는데....라는 생각에 접었습니다. 무시하셔도 무방합니다.
[+]Pid : 17531
[+]svc checker...
[+]Attached...
[+] recvfrom(0x70, *buf, 0x8d8, 0x40)
[+] recvfrom(0xe0, , 0x8d8, 0x40)
[+] sendto(0x70, , 0x10, 0x4040)
[+] recvfrom(0x70, *buf, 0x8d8, 0x40)
[+] recvfrom(0xe0, , 0x8d8, 0x40)
[+] recvfrom(0x70, *buf, 0x8d8, 0x40)
[+] recvfrom(0xfffffff5, , 0x8d8, 0x40)
-d : 디버깅옵션 입니다. 디버깅을 차단하기 위한 방법으로 gdb같은 특정 프로그램을 막는경우 테스트하기 위해 만들었습니다. 이것도 딱히 쓸 일은 없을듯 하여 자세한 설명은 생략하도록 하겠습니다.
[+]Pid : 17531
[+]Debugging mode
[+]Mode : None(0)
[+]Starting...
REGS==========================================================[0]
pc=0xf765a41c lr=0xf75d574b sp=0xff847008 fp=0x12c04dc0
ip= 0 cpsr=0x600d0010
r0= 0x1 r1=0xff847008 r2=0xf75d9ba0 r3= 0
r4= 0x32 r5= 0x1 r6=0x12c04dc0 r7= 0x107
r8=0x70ecdca8 r9=0xf4c28000 r10= 0 o_r0= 0x1
VALUE=========================================================
pc=0xe1a0700c lr= 0x4a0398 sp= 0 fp=0x71764370
r0=0xffffffff r1= 0 r2= 0 r3=0xffffffff
r4=0xffffffff r5=0xffffffff r6=0x71764370 r7=0xffffffff
r8=0x716a3038 r9= 0x550000 r10=0xffffffff
REGS==========================================================[0]
pc=0xf765a41c lr=0xf75d574b sp=0xff847008 fp=0x12c04dc0
ip= 0x1 cpsr=0x600d0010
3. 터치 이벤트 관련
예전에 터치 이벤트 관련하여 작업할때 만들어 뒀던 기능입니다. 사용자가 터치이벤트를 통해 어떠한 액션을 취한다거나, 특정 화면을 캡쳐하여 탈취할때 사용했었던 기능입니다.
사용법은 다음과 같습니다.
root@zerofltektt:/data/local/tmp # ./mm -t a
=> -t만 넣을 경우 메뉴가 뜨지 않습니다. 모니터링할 입력 이벤트를 설정해줘야 하는데 모르시면 아무거나 넣고 실행하시면 다음과 같은 화면이 나타납니다.
[+]Touch event mode
[+]make temp directory : /data/local/tmp/mm_touch
****************************************************
[*] MM_TOUCH Copy Dir : /data/local/tmp/mm_touch
[*] Device Info Dir : /proc/bus/input
****************************************************
- MENU
1. Screen Capture (4.1.2 or less)
2. Screen Capture for Security KeyPad (4.1.2 or less)
3. Touch Coordinates Capture
8. Select event (not yet)
9. Exit
Select Number :
이벤트는 /proc/bus/input/devices 에서 확인 가능합니다.
cat /proc/bus/input/devices
제 테스트 단말기의 터치 이벤트 정보는 다음과 같습니다. (펜으로 입력 시 이벤트가 다릅니다.)
I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="sec_touchscreen"
P: Phys=sec_touchscreen/input1
S: Sysfs=/devices/14e10000.hsi2c/i2c-7/7-0049/input/input1
U: Uniq=
H: Handlers=event1
B: PROP=2
B: EV=2b
B: KEY=80 0 420 0 0 0 0 0
B: ABS=4a63800000000000
B: SW=8000
이벤트 대상을 넣고 실행하면 다음과 같이 나타납니다.
root@zerofltektt:/data/local/tmp # ./mm -t /dev/input/event1
...
- MENU
1. Screen Capture (4.1.2 or less)
2. Screen Capture for Security KeyPad (4.1.2 or less)
3. Touch Coordinates Capture
8. Select event (not yet)
9. Exit
Select Number : 3
[MM_TOUCH] Type : 0x3, Code : 0x39, Value : 96
[MM_TOUCH] Type : 0x1, Code : 0x14a, Value : 1
[MM_TOUCH] Type : 0x1, Code : 0x145, Value : 1
[MM_TOUCH] Type : 0x3, Code : 0x35, Value : 956
[MM_TOUCH] Set Code : Y
[MM_TOUCH] Type : 0x3, Code : 0x36, Value : 2446
[MM_TOUCH] Set Code : X
[MM_TOUCH] Type : 0x3, Code : 0x30, Value : 6
[MM_TOUCH] Type : 0x3, Code : 0x31, Value : 6
[MM_TOUCH] Type : 0x0, Code : 0x0, Value : 0
[MM_TOUCH] Type : 0x3, Code : 0x35, Value : 953
[MM_TOUCH] Set Code : Y
[MM_TOUCH] Type : 0x3, Code : 0x36, Value : 2448
[MM_TOUCH] Set Code : X
[MM_TOUCH] Type : 0x3, Code : 0x30, Value : 7
[MM_TOUCH] Type : 0x3, Code : 0x31, Value : 7
[MM_TOUCH] Type : 0x0, Code : 0x0, Value : 0
[MM_TOUCH] Type : 0x3, Code : 0x35, Value : 941
[MM_TOUCH] Set Code : Y
[MM_TOUCH] Type : 0x3, Code : 0x36, Value : 2449
1,2 번은 화면 캡쳐기능입니다. 이미지 프레임 버퍼에서 데이터를 가져와 복원하는 방식이나, 4.x까지만 동작합니다.... 쓸일이 별로 없어서 그 뒤로 업데이트는 하지 않고 있습니다.
3번을 선택하면 다음과 같이 화면을 터치하는 좌표들이 출력되며, 해당 정보는 /data/local/tmp/mm_touch 에 생성되며 다음과 같습니다.
root@zerofltektt:/data/local/tmp # cd mm_touch/
root@zerofltektt:/data/local/tmp/mm_touch # ls -al
-rw------- root root 779 2018-04-04 09:52 position.log
at position.log
0:956
2446:956
2446:953
2448:953
2448:941
2449:941
2449:902
2461:902
2461:848
2486:848
2486:802
2526:802
해당 좌표 정보를 이용하여 사용자가 어떤 동작을 수행했는지(생성순서가 시간별), 어떠한 글을 썼고, 서명을 했고, 그림을 그렸는지 복원이 가능합니다.
memget windows용에 해당정보를 넣으면 이미지로 복원시켜주는 도구를 만들었었는데 어디간지 모르겠네요....나중에 찾으면 같이 올리도록 하겠습니다.
4. Class dump 관련
말그대로 dex파일로부터 클래스 덤프하는 기능입니다. 공부겸 겸사겸사 만들어 봤던기능입니다.
사용법은 간단합니다.
./mm -d [DEX FILE PATH]
ex) ./mm -d classes.dex
실행결과는 다음과 같습니다.
[+]Dex Class Dump mode
[+]make temp directory : /data/local/tmp/mm_dump
[+]Done
폴더에 결과를 확인하면 다음과 같습니다.
Lcom/e/a/a/b/a; <clinit>; Void; Void
Lcom/e/a/a/b/a; <init>; Void; Void
Lcom/e/a/a/b/a; inProgress; Float, Long, Int; Void
Lcom/e/a/a/b/a; onAfter; Int; Void
Lcom/e/a/a/b/a; onBefore; w, Int; Void
Lcom/e/a/a/b/a; onError; e, Exception, Int; Void
Lcom/e/a/a/b/a; onResponse; Object, Int; Void
Lcom/e/a/a/b/a; parseNetworkResponse; y, Int; Object
Lcom/e/a/a/b/a; validateReponse; y, Int; Bool
Lcom/e/a/a/b/b; <init>; Void; Void
Lcom/e/a/a/b/b; parseNetworkResponse; y, Int; Object
Lcom/e/a/a/b/b; parseNetworkResponse; y, Int; String
Lcom/aio/downloader/adapter/LastRequestListAdapter$MyStringCallback; <init>; LastRequestListAdapter, String, Long, String, Int, LastRequestListAdapter$ViewHolder; Void
기본출력값은 int, Bool 등으로 출력됩니다. 달빅형식으로 출력을 원하면 -d 옵션을 사용하면 됩니다.
Landroid/support/v7/app/e; a(I, Landroid/view/Menu;) V
Landroid/support/v7/app/e; a(Ljava/lang/CharSequence;) V
Landroid/support/v7/app/e; a(I, Landroid/view/KeyEvent;) Z
Landroid/support/v7/app/e; a(Landroid/view/KeyEvent;) Z
Landroid/support/v7/app/e; b( ) Landroid/view/MenuInflater;
Landroid/support/v7/app/e; b(Ljava/lang/CharSequence;) V
Landroid/support/v7/app/e; b(I, Landroid/view/Menu;) Z
Landroid/support/v7/app/e; c(Landroid/os/Bundle;) V
Landroid/support/v7/app/e; f( ) V
Landroid/support/v7/app/e; h( ) Z
Landroid/support/v7/app/e; k( ) V
Landroid/support/v7/app/e; l( ) Landroid/support/v7/app/ActionBar;
Landroid/support/v7/app/e; m( ) Landroid/content/Context;