Excuse the ads! We need some help to keep our site up.

List

Memory cheat(AOS)

  • 해당 내용은 2016년에 분석하고 개발한 Cheat tool에 대한 설명입니다.
  • 해당 Tool은 보안 점검시 Memory cheat에 대한 검증용으로 필요해 개발하였습니다.
  • 해당 정보와 Tool을 이용하여 부정 행위시 부정 행위를 한 사용자에게 책임이 있으며, 개발자에게는 책임이 없습니다.

Structure of Memory Cheat

  • Memory cheats tool은 다음과 같은 형태로 동작합니다.
The default behavior of the memory cheat tool.
1Process attach사용자 레벨에서 프로세스 주소 공간에 접근하기 위해 ptrace()를 사용해 대상 프로세스를 연결합니다.
2Check the process memory area효율적인 Memory 분석을 위해 대상 프로세스가 사용하는 Memory 정보(Memory map)를 확인합니다.
3Memory access대상 프로세스의 Memory를 분석 및 변경하기 위해 ptrace를 사용해 메모리의 값을 읽고 변경합니다.

Process attach

ptrace()

  • ptrace() 시스템 콜을 사용해 사용자 레벨에서 프로세스를 연결해 메모리를 읽고, 수정, 등의 분석을 진행 할 수 있습니다.
    • ptrace()는 gdb, strace, ltrace 에서 사용되고 있습니다.
    • ptrace()를 사용해 코드를 삽입하고 공유 라이브러리 리다이렉션을 위한 GOT와 같은 중요한 데이터 구조체를 수정할 수 있습니다.

ptrace synopsis

  • ptrace의 개요는 다음과 같습니다.
ptrace()
#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pit_t pid, void *addr, void *data);

ptrace request

  • 아래와 같은 요청 목록을 ptrace에서 사용 할 수 있습니다.
요청 항목
요청설명
PTRACE_ATTACH
  • 해당 요청은 전달된 pid의 프로세스를 연결하여 분석 대상으로 설정합니다.
    • 분석 대상에 SIGSTOP을 전송하지만 이 호출의 성공으로 반드시 멈추지 않습니다.
    • 분석 대상의 중지를 기다리기 위해 waitpid(2)를 사용합니다.
PTRACE_TRACEME
  • 이 프로세스가 부모로부터 추적되기를 원함을 나타냅니다.
    • 대부분 부모 프로세스가 이 프로세스를 추적하는 것을 원치 않는다면 이 요청을 해서는 안됩니다.

PTRACE_PEEKTEXT
PTRACE_PEEKDATA
PTRACE_PEEKUSER 

  • 해당 요청들은 분석 대상 프로세스의 메모리의 값을 읽을 수 있습니다.
    • 예로 분석을 위해 전체 텍스트와 데이터 세그먼트를 버퍼로 읽어들일 수 있습니다.
    • PEEKTEXT,PEEKDATA,PEEKUSER 사이의 구현에는 차이가 없다는 점을 기억합시다.

PTRACE_POKTEXT
PTRACE_POKEDATA
PTRACE_POKEUSER 

  • 해당 요청들은 분석 대상 프로세스의 메모리의 값을 변경 할 수 있습니다.
PTRACE_GETREGS
  • 해당 요청은 분석 대상 프로세스의 레지스터 복사본을 얻어 프로세스를 분석 할 수 있습니다.
    • 각 스레드 컨텍스트마다 각자의 레지스터 집합을 가지고 있습니다.
PTRACE_SETREGS
  • 해당 요청은 분석 대상 프로세스의 레지스터 값을 변경 할 수 있습니다.
    • 예를 들어 실행 포인터의 값을 쉘 코드를 가리키도록 수정합니다.
PTRECE_CONT
  • 해당 요청은 정지된 분석 대상 프로세스의 실행을 재개합니다.
PTRACE_DETACH
  • 해당 요청은 연결된 분석 대상 프로세스의 연결을 해제합니다.
PTRACE_SYSCALL
  • 해당 요청은 분석 대상 프로세스를 재실행하고, 다음 시스템 콜의 진입점이나 종료시점에서 중지되도록 합니다.
    • 해당 요청으로 시스콜의 매개 변수를 조사하고 수정할수 있습니다.
    • 해당 요청은 strace 프로그램에서 사용되고 있습니다.
PTRACE_SINGLESTEP
  • 해당 요청은 분석 대상 프로세스를 재실행하고, 다음 명령에서 중지되도록 합니다.
    • 해당 요청은 사용자가 프로세스의 각 명령어를 실행시킨 뒤 레지스터와 상태를 확인할 때 사용합니다.
PTRACE_GETSIGINFO
  • 해당 요청은 분석 대상 프로세스의 중지를 발생 시킨 신호에 대한 정보를 추출합니다.
    • 해당 요청은 구조체 siginfo_t 를 이용해 정보를 추출합니다.
PTRACE_SETSIGINFO
  • 해당 요청은 시그널 정보를 설정합니다.
    • 분석 대상의 데이터로를 구조체 siginfo_t에 복사해 분석 대상에 전달합니다.
    • 해당 요청은 분석 대상으로 전달되며, 분석 대상이 감지한 시그널에 대해서만 영향을 줍니다.
PTRACE_SETOPTIONS
  • 데이터에 ptrace 옵션을 설정합니다.
    • 데이터의 설정 값의 비트 마스크 형태로 해석됩니다.
    • 플래그 목록은 ptrace(2)의 메인 페이지를 확인합니다

Check the process memory area

/proc/pid/maps

  • 다음과 같이 maps 파일에 대한 이해가 필요합니다.
/proc/self/maps
root@angler:/ # cat /proc/self/maps         
address			  perms	offset  dev   inode      pathname
b6c00000-b6e00000 rw-p 00000000 00:00 0          [anon:libc_malloc]
b6eeb000-b6eed000 r-xp 00000000 b3:17 2482 /system/lib/libnetd_client.so
b6eed000-b6eee000 r--p 00001000 b3:17 2482 /system/lib/libnetd_client.so
b6eee000-b6eef000 rw-p 00002000 b3:17 2482 /system/lib/libnetd_client.so
b6eef000-b6f0f000 r--s 00000000 00:0b 7141 /dev/__properties__
b6f0f000-b6f11000 r-xp 00000000 b3:17 2727 /system/lib/libstdc++.so
b6f11000-b6f12000 r--p 00001000 b3:17 2727 /system/lib/libstdc++.so
b6f12000-b6f13000 rw-p 00002000 b3:17 2727 /system/lib/libstdc++.so
...


Fields in the maps file
address
  • address 필드는 프로세스에 매핑된 주소 영역입니다.
perms
  • perms 필드는 해당 주소 영역의 사용 권한을 나타냅니다.
    • r : read
    • w : write
    • x : execute
    • s : shared
    • p : private
offset
  • 오프셋 필드는 파일에 대한 오프셋 정보 입니다.
dev
  • dev 필드는 장치에 대한 정보입니다. (major:minor)
inode
  • inode 필드는 해당 장치에 대한 inode 입니다.
    • inode의 값이 0인 경우 메모리 영역과 관련되 inode가 없다는 것을 나타냅니다.
pathname
  • pathname 필드는 맵핑된 파일의 경로 입니다.

Filter the mapping area

  • 다음과 같이 프로세스의 매핑 정보를 확인하면, 사용중인 메모리 영역이 매우 큽니다.
    • 해당 영역을 값을 모두 검색하게 되면 메모리 검색 성능 및 효율성에서 매우 비효율적입니다.
    • 그렇기 때문에 매핑 정보를 이용하여 메모리 검색 영역에 대한 필터링이 필요합니다.
/proc/pid/maps
root@angler:/ # cat /proc/8913/maps                                            
00008000-0000d000 rw-s 00174000 00:0c 5431                               /dev/kgsl-3d0
0000d000-0002e000 rw-s 0023b000 00:0c 5431                               /dev/kgsl-3d0
12c00000-12e16000 rw-p 00000000 00:04 22331                              /dev/ashmem/dalvik-main space (deleted)
12e16000-13d6d000 rw-p 00216000 00:04 22331                              /dev/ashmem/dalvik-main space (deleted)
13d6d000-32c00000 ---p 0116d000 00:04 22331                              /dev/ashmem/dalvik-main space (deleted)
32c00000-32c01000 rw-p 00000000 00:04 22332                              /dev/ashmem/dalvik-main space 1 (deleted)
32c01000-52c00000 ---p 00001000 00:04 22332                              /dev/ashmem/dalvik-main space 1 (deleted)
70ee7000-718df000 rw-p 00000000 fd:00 318872                             /data/dalvik-cache/arm/system@framework@boot.art
718df000-737c0000 r--p 00000000 fd:00 318869                             /data/dalvik-cache/arm/system@framework@boot.oat
737c0000-74f63000 r-xp 01ee1000 fd:00 318869                             /data/dalvik-cache/arm/system@framework@boot.oat
74f63000-74f64000 rw-p 03684000 fd:00 318869                             /data/dalvik-cache/arm/system@framework@boot.oat
74f64000-75093000 rw-p 00000000 00:04 22330                              /dev/ashmem/dalvik-zygote space (deleted)
75093000-75094000 rw-p 00000000 00:04 25095                              /dev/ashmem/dalvik-non moving space (deleted)
75094000-7509d000 rw-p 00001000 00:04 25095                              /dev/ashmem/dalvik-non moving space (deleted)
7509d000-78765000 ---p 0000a000 00:04 25095                              /dev/ashmem/dalvik-non moving space (deleted)
78765000-78f64000 rw-p 036d2000 00:04 25095                              /dev/ashmem/dalvik-non moving space (deleted)
ab1dd000-ab1e9000 r-xp 00000000 103:0b 65025                             /system/bin/app_process32_xposed
ab1e9000-ab1eb000 r--p 0000b000 103:0b 65025                             /system/bin/app_process32_xposed
ab1eb000-ab1ec000 rw-p 0000d000 103:0b 65025                             /system/bin/app_process32_xposed
bb907000-bba08000 rw-s 00160000 00:0c 5431                               /dev/kgsl-3d0
... 생략 ...
ce683000-ce781000 rw-p 00000000 00:00 0                                  [stack:9328]
ce781000-ce782000 ---p 00000000 00:00 0 
ce782000-ce880000 rw-p 00000000 00:00 0                                  [stack:9327]
ce880000-ceb80000 rw-p 00000000 00:00 0                                  [anon:libc_malloc]
ceb88000-ceb89000 ---p 00000000 00:00 0 
ceb89000-ceb8b000 rw-p 00000000 00:00 0                                  [anon:thread signal stack]
ceb8b000-ceb8d000 rw-p 00000000 00:04 61129                              /dev/ashmem/dalvik-indirect ref table (deleted)
ceb8d000-cebad000 rw-p 00000000 00:04 73001                              /dev/ashmem/dalvik-LinearAlloc (deleted)
cebad000-cee00000 r--s 0002a000 fd:00 1062997                            /data/app/com.********.*******/base.apk
cee00000-cee40000 rw-p 00000000 00:00 0                                  [anon:libc_malloc]
cee4f000-cee50000 ---p 00000000 00:00 0 
cee50000-cee52000 rw-p 00000000 00:00 0                                  [anon:thread signal stack]
cee52000-cee54000 rw-p 00000000 00:04 61127                              /dev/ashmem/dalvik-indirect ref table (deleted)
cee54000-cee57000 r-xp 00000000 fd:00 1063087                            /data/app/com.********.*******/lib/arm/lib*****.so
cee57000-cee58000 r--p 00002000 fd:00 1063087                            /data/app/com.********.*******/lib/arm/lib*****.so
cee58000-cee59000 rw-p 00003000 fd:00 1063087                            /data/app/com.********.*******/lib/arm/lib*****.so
cee63000-cee73000 rwxp 00000000 00:00 0 
cee73000-cef80000 rw-p 00000000 00:00 0 
cef80000-cf680000 rw-p 00000000 00:00 0                                  [anon:libc_malloc]
cf686000-cf6b6000 rwxp 00000000 00:00 0 
cf6b6000-cf6b9000 r-xp 00000000 fd:00 1063085                            /data/app/com.********.*******/lib/arm/libkeystore.so
cf6b9000-cf6ba000 r--p 00002000 fd:00 1063085                            /data/app/com.********.*******/lib/arm/libkeystore.so
cf6ba000-cf6bb000 rw-p 00003000 fd:00 1063085                            /data/app/com.********.*******/lib/arm/libkeystore.so
... 생략 ...
d1bd2000-d1cf3000 r-xp 00000000 fd:00 1063088                            /data/app/com.********.*******/lib/arm/lib*****.so
d1cf3000-d1cf4000 ---p 00000000 00:00 0 
d1cf4000-d1cf7000 r--p 00121000 fd:00 1063088                            /data/app/com.********.*******/lib/arm/lib*****.so
d1cf7000-d1cf9000 rw-p 00124000 fd:00 1063088                            /data/app/com.********.*******/lib/arm/lib*****.so
d1cf9000-d1d40000 rw-p 00000000 00:00 0 
d1d40000-d1f40000 rw-p 00000000 00:00 0                                  [anon:libc_malloc]
d1f40000-d2f80000 rw-s 00000000 00:08 9640                               anon_inode:dmabuf
d2f80000-d3fc0000 rw-s 00000000 00:08 9640                               anon_inode:dmabuf
d3fc0000-d5000000 rw-s 00000000 00:08 9640                               anon_inode:dmabuf
d5000000-d7f80000 rw-p 00000000 00:00 0                                  [anon:libc_malloc]
d7f85000-d7f86000 ---p 00000000 00:00 0 
d7f86000-d8084000 rw-p 00000000 00:00 0                                  [stack:9012]
d8084000-d8085000 ---p 00000000 00:00 0 
d8085000-d8183000 rw-p 00000000 00:00 0                                  [stack:9011]
d8183000-d8185000 rw-p 00000000 00:04 61044                              /dev/ashmem/dalvik-indirect ref table (deleted)
d818b000-d818d000 rw-p 00000000 00:04 68195                              /dev/ashmem/dalvik-indirect ref table (deleted)
d818d000-d818e000 ---p 00000000 00:00 0 
d818e000-d8190000 rw-p 00000000 00:00 0                                  [anon:thread signal stack]
d8190000-d8191000 ---p 00000000 00:00 0 
...생략...
d830a000-d830c000 rw-p 00000000 00:04 68191                              /dev/ashmem/dalvik-indirect ref table (deleted)
d830c000-d831c000 rwxp 00000000 00:00 0 
d831c000-d8339000 r-xp 00000000 fd:00 1063080                            /data/app/com.********.*******/lib/arm/lib*****.so
d8339000-d833a000 ---p 00000000 00:00 0 
d833a000-d833b000 r--p 0001d000 fd:00 1063080                            /data/app/com.********.*******/lib/arm/lib*****.so
d833b000-d833c000 rw-p 0001e000 fd:00 1063080                            /data/app/com.********.*******/lib/arm/lib*****.so
d833c000-d8340000 rw-p 00000000 00:00 0 
d8340000-d83c0000 rw-p 00000000 00:00 0                                  [anon:libc_malloc]
d83c1000-d83c3000 rw-p 00000000 00:04 57117                              /dev/ashmem/dalvik-indirect ref table (deleted)
d83c6000-d83c7000 ---p 00000000 00:00 0 
d83c7000-d84c5000 rw-p 00000000 00:00 0                                  [stack:9009]
d84c5000-d84c6000 ---p 00000000 00:00 0 
... 생략 ...
da580000-da582000 rw-p 00000000 00:04 65885                              /dev/ashmem/dalvik-indirect ref table (deleted)
da582000-da584000 rw-p 00000000 00:04 57110                              /dev/ashmem/dalvik-indirect ref table (deleted)
da584000-da586000 r-xp 00000000 fd:00 1063081                            /data/app/com.********.*******/lib/arm/********.so
da586000-da587000 r--p 00001000 fd:00 1063081                            /data/app/com.********.*******/lib/arm/********.so
da587000-da588000 rw-p 00002000 fd:00 1063081                            /data/app/com.********.*******/lib/arm/********.so
da58d000-da58f000 rw-p 00000000 00:04 65876                              /dev/ashmem/dalvik-indirect ref table (deleted)
da58f000-da590000 ---p 00000000 00:00 0 
da590000-da592000 rw-p 00000000 00:00 0                                  [anon:thread signal stack]
da592000-da5ba000 r-xp 00000000 103:0b 1438                              /system/lib/libwilhelm.so
da5ba000-da5bb000 ---p 00000000 00:00 0 
da5bb000-da5be000 r--p 00028000 103:0b 1438                              /system/lib/libwilhelm.so
da5be000-da5bf000 rw-p 0002b000 103:0b 1438                              /system/lib/libwilhelm.so
...생략...
dcf37000-dddbb000 r-xp 00000000 fd:00 1063091                            /data/app/com.********.*******/lib/arm/libunity.so
dddbb000-dddee000 rw-p 00e83000 fd:00 1063091                            /data/app/com.********.*******/lib/arm/libunity.so
dddee000-ddfbd000 rw-p 00000000 00:00 0 
ddfbd000-de34c000 r-xp 00000000 fd:00 1063052                            /data/app/com.********.*******/lib/arm/libmono.so
de34c000-de34d000 ---p 00000000 00:00 0 
de34d000-de34f000 r--p 0038f000 fd:00 1063052                            /data/app/com.********.*******/lib/arm/libmono.so
de34f000-de354000 rw-p 00391000 fd:00 1063052                            /data/app/com.********.*******/lib/arm/libmono.so
de354000-de371000 rw-p 00000000 00:00 0 
de371000-de804000 r--p 00000000 fd:00 451502                             /data/data/com.linecorp.LGSDG/files/.tomb/.D45AC878/.O/D45AC878.dex (deleted)
de804000-deb90000 r-xp 00493000 fd:00 451502                             /data/data/com.linecorp.LGSDG/files/.tomb/.D45AC878/.O/D45AC878.dex (deleted)
deb90000-deb91000 rw-p 0081f000 fd:00 451502                             /data/data/com.linecorp.LGSDG/files/.tomb/.D45AC878/.O/D45AC878.dex (deleted)
deb91000-df1d4000 r--p 00000000 fd:00 1063266                            /data/app/com.********.*******/oat/arm/base.odex
df1d4000-df713000 r-xp 00643000 fd:00 1063266                            /data/app/com.********.*******/oat/arm/base.odex
df713000-df714000 rw-p 00b82000 fd:00 1063266                            /data/app/com.********.*******/oat/arm/base.odex
df714000-dff14000 rw-p 00000000 00:04 25094                              /dev/ashmem/dalvik-allocspace main rosalloc space mark-bitmap 3 (deleted)
dff14000-e0714000 rw-p 00000000 00:04 25093                              /dev/ashmem/dalvik-allocspace main rosalloc space live-bitmap 3 (deleted)
e0714000-e8040000 ---p 00000000 00:00 0 
e8040000-e82c0000 rw-p 00000000 00:00 0                                  [anon:libc_malloc]
e82c0000-e82c2000 rw-p 00000000 00:04 65872                              /dev/ashmem/dalvik-indirect ref table (deleted)
e82c2000-e82c3000 ---p 00000000 00:00 0 
e82c3000-e82c5000 rw-p 00000000 00:00 0                                  [anon:thread signal stack]
e82c5000-e82c6000 ---p 00000000 00:00 0 
e82c6000-e82c8000 rw-p 00000000 00:00 0                                  [anon:thread signal stack]
e82c8000-e82cd000 r-xp 00000000 103:0b 1282                              /system/lib/libeffects.so
e82cd000-e82ce000 r--p 00004000 103:0b 1282                              /system/lib/libeffects.so
e82ce000-e82cf000 rw-p 00005000 103:0b 1282                              /system/lib/libeffects.so
e82cf000-e82d2000 r-xp 00000000 103:0b 1393                              /system/lib/libstagefright_http_support.so
e82d2000-e82d3000 ---p 00000000 00:00 0 
e82d3000-e82d4000 r--p 00003000 103:0b 1393                              /system/lib/libstagefright_http_support.so
e82d4000-e82d5000 rw-p 00004000 103:0b 1393                              /system/lib/libstagefright_http_support.so
e82d5000-e82d9000 r-xp 00000000 103:0b 1233                              /system/lib/libOpenSLES.so
e82d9000-e82da000 r--p 00003000 103:0b 1233                              /system/lib/libOpenSLES.so
e82da000-e82db000 rw-p 00004000 103:0b 1233                              /system/lib/libOpenSLES.so
... 생략 ...
e8e51000-e904d000 r-xp 00000000 fd:00 1063070                            /data/app/com.********.*******/lib/arm/libglf.so
e904d000-e904e000 rwxp 001fc000 fd:00 1063070                            /data/app/com.********.*******/lib/arm/libglf.so
e904e000-e90b5000 r-xp 001fd000 fd:00 1063070                            /data/app/com.********.*******/lib/arm/libglf.so
e90b5000-e90cb000 rwxp 00264000 fd:00 1063070                            /data/app/com.********.*******/lib/arm/libglf.so
e90cb000-e9109000 r-xp 0027a000 fd:00 1063070                            /data/app/com.********.*******/lib/arm/libglf.so
e9109000-e9127000 rw-p 002b7000 fd:00 1063070                            /data/app/com.********.*******/lib/arm/libglf.so
e9127000-e9130000 rw-p 00000000 00:00 0 
e9130000-e9150000 rwxp 002d5000 fd:00 1063070                            /data/app/com.********.*******/lib/arm/libglf.so
e9150000-e9151000 rwxp 00000000 00:00 0 
...생략...
f76aa000-f76cf000 r-xp 00000000 103:0b 1260                              /system/lib/libbinder.so
f76cf000-f76d0000 ---p 00000000 00:00 0 
f76d0000-f76d7000 r--p 00025000 103:0b 1260                              /system/lib/libbinder.so
f76d7000-f76d8000 rw-p 0002c000 103:0b 1260                              /system/lib/libbinder.so
f76d8000-f76e0000 r-xp 00000000 103:0b 1319                              /system/lib/liblog.so
f76e0000-f76e1000 r--p 00007000 103:0b 1319                              /system/lib/liblog.so
f76e1000-f76e2000 rw-p 00008000 103:0b 1319                              /system/lib/liblog.so
f76e2000-f76fa000 r-xp 00000000 103:0b 1431                              /system/lib/libutils.so
f76fa000-f76fb000 ---p 00000000 00:00 0 
f76fb000-f76fc000 r--p 00018000 103:0b 1431                              /system/lib/libutils.so
f76fc000-f76fd000 rw-p 00019000 103:0b 1431                              /system/lib/libutils.so
f76fd000-f770b000 r-xp 00000000 103:0b 1275                              /system/lib/libcutils.so
f770b000-f770c000 ---p 00000000 00:00 0 
f770c000-f770d000 r--p 0000e000 103:0b 1275                              /system/lib/libcutils.so
f770d000-f770e000 rw-p 0000f000 103:0b 1275                              /system/lib/libcutils.so
f770e000-f770f000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_vector]
f770f000-f7710000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_64]
f7710000-f7711000 r--p 00000000 00:00 0                                  [anon:linker_alloc]
f7711000-f7712000 rw-p 00000000 00:00 0                                  [anon:linker_alloc]
f7712000-f7713000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_vector]
f7713000-f7714000 rw-p 00000000 00:00 0                                  [anon:linker_alloc_32]
f7714000-f7715000 r--p 00000000 00:00 0                                  [anon:linker_alloc]
f7715000-f7735000 r--s 00000000 00:0c 5396                               /dev/__properties__
f7735000-f7736000 r--p 00000000 00:00 0 
f7736000-f7737000 ---p 00000000 00:00 0 
f7737000-f7739000 rw-p 00000000 00:00 0                                  [anon:thread signal stack]
f7739000-f7756000 r-xp 00000000 103:0b 436                               /system/bin/linker
f7756000-f7757000 r--p 0001c000 103:0b 436                               /system/bin/linker
f7757000-f7759000 rw-p 0001d000 103:0b 436                               /system/bin/linker
f7759000-f775b000 rw-p 00000000 00:00 0 
ff246000-ff246000 rw-p 00000000 00:00 0 
ff246000-ff247000 ---p 00000000 00:00 0 
ff247000-ffa46000 rw-p 00000000 00:00 0                                  [stack]
ffff0000-ffff1000 r-xp 00000000 00:00 0                                  [vectors]
root@angler:/ #

  • "Lazenca-A-Android"에서는 다음과 같은 조건으로 매핑된 영역을 필터링 합니다.
    • 필터링 조건은 게임 개발 엔진에 따라 조건을 추가 할 필요가 있습니다.
void MapsListFiltering()
void MapsListFiltering(){
	for(int i = 0;i < mapsList.size();i++){
		maps = mapsList.at(i);

		if(!strstr(maps.strPerms,"rw-p")){
			continue;
		}else if(strstr(maps.strPath,"/system/bin")){
			continue;
		}else if(strstr(maps.strPath,"/system/lib")){
			continue;
		}else if(strstr(maps.strPath,"/system/vendor")){
			continue;
		}else if(strstr(maps.strPath,"/dev/ashmem")){
			if(!strstr(maps.strPath,"/dev/ashmem/dalvik-heap")){
				continue;
			}
		}else if(strstr(maps.strPath,"")){
			continue;
		}
		memReadAreaList.push_back(maps);
	}
}
Filter list
perms 필드
  • "rw-p" 권한이 있는 영역만 검색
pathname 필드
  • "/system/bin" 경로의 파일은 메모리 검색에 제외
  • "/system/lib" 경로의 파일은 메모리 검색에 제외
  • "/system/bin" 경로의 파일은 메모리 검색에 제외
  • "/dev/ashmem" 경로의 파일은 메모리 검색에 제외
    • "/dev/ashmem/dalvik-heap"경로의 파일은 메모리 검색에 포함
  • "[anon:libc_malloc]" 메모리 검색에 제외

Memory read

ptrace()

  • 다음과 같이 ptrace()를 이용해 메모리의 값을 추출할 수 있습니다.
    • "PTRACE_ATTACH"를 이용해 대상 프로세스를 연결합니다.

    • "PTRACE_PEEKDATA"를 이용해 대상 프로세스가 사용중인 메모리 영역의 값을 추출합니다.
    • "PTRACE_ATTACH"를 이용해 대상 프로세스를 연결을 종료합니다.
void readData(int pid, void* address)
void readData(int pid, void* address){
	ptrace(PTRACE_ATTACH, pid, NULL, NULL);
	long value = ptrace(PTRACE_PEEKDATA, pid,(void *) address,NULL);
	ptrace(PTRACE_DETACH, pid, NULL, NULL);
}

/proc/pid/mem

  • 앞에서 설명한 방법은 많은양의 메모리 값을 읽을 경우 다음과 같은 현상이 발생 합니다.
    • 치트 프로세스의 메모리 과부하가 발생
    • 처리 속도가 느림
  • 이러한 문제를 해결하기 위해 "/proc/pid/mem" 파일을 사용하여 메모리 값을 추출 할 수 있습니다.
    • 첫번째 인자 값으로 open() 함수로 부터 반환받은 파일 디스크립터를 전달 합니다.("/proc/pid/mem")
    • 두번째, 세번재 인자 값을 메모리 값을 읽을 주소 범위를 전달 합니다.
      • 시작 주소, 끝 주소
    • 네번재 인자 값은 읽어들인 메모리 값을 저장할 공간을 전달 합니다.
void getValue(int mem_fd,long staMemAddr,long endMemAddr,void *buf)
void getValue(int mem_fd,long staMemAddr,long endMemAddr,void *buf){
	void* address;
	void* value;

	printf("staMemAddr : %#lx, endMemAddr : %#lx\n",staMemAddr,endMemAddr);

	for (; staMemAddr < endMemAddr; staMemAddr += 4096) {
		printf("fd : %d, staMemAddr : %#lx, endMemAddr : %#lx\n",mem_fd,staMemAddr,endMemAddr);
		lseek(mem_fd, staMemAddr, SEEK_SET);
		read(mem_fd, buf, MEMREADSIZE);
		for (int j = 0; j < MEMREADSIZE / 4; j++) {
			address = (void*) (staMemAddr + (j * 4));
			value = ((long**) buf)[j];
			printf("address : %#lx, Value : %ld\n",(long)address,(long)value);
		}
	}
}

waitpid(2) - Linux man page

Memory write

ptrace()

  • 다음과 같이 ptrace()를 이용해 메모리의 값을 추출할 수 있습니다.

    • "PTRACE_ATTACH"를 이용해 대상 프로세스를 연결합니다.

    • "PTRACE_POKEDATA"를 이용해 대상 프로세스가 사용중인 메모리 영역에 값을 변경합니다.

    • "PTRACE_ATTACH"를 이용해 대상 프로세스를 연결을 종료합니다.

void readData(int pid, void* address, void* address)
void readData(int pid, void* address, void* address){
	ptrace(PTRACE_ATTACH, pid, NULL, NULL);
	ptrace(PTRACE_POKEDATA, pid, (void *) address,(void *) value);
	ptrace(PTRACE_DETACH, pid, NULL, NULL);
}

/proc/pid/mem

  • 다음과 같이 write()함수와 "/proc/pid/mem" 파일을 사용하여 메모리 값을 변경 할 수 있습니다.
    • 첫번째 인자 값으로 변경할 값의 주소를 전달 합니다.
    • 두번째 인자 값으로 해당 주소에 저장할 값을 전달 합니다.
void MemoryWrite(char *cAddress, char *cValue)
void MemoryWrite(char *cAddress, char *cValue) {
	if(cmdSizeCheck(cAddress)){
		if(cmdSizeCheck(cValue)){
			int status;
			long tmpValue;
			long address;
			char memFileName[30];
			int mem_fd;

			address = strtoul(cAddress, NULL, 16);
			sscanf(cValue, "%ld", &tmpValue);
			sprintf(memFileName, "/proc/%d/mem", privatePid);

			ptrace(PTRACE_ATTACH, privatePid, NULL, NULL);
			waitpid(privatePid, &status, WUNTRACED);

			if (0 < (mem_fd = open(memFileName, O_WRONLY | O_LARGEFILE))) {
				lseek(mem_fd, address, SEEK_SET);
				write(mem_fd, &tmpValue, sizeof(tmpValue));
				close(mem_fd);
			} else {
				printf("%s\n", errorMsgPid);
			}
			ptrace(PTRACE_DETACH, privatePid, NULL, NULL);
			renewal();
		}
	}
}

Memory fuzzing

  • 치트 툴에서 제공하는 Memory fuzz 기능은 다음과 같습니다.
    • 값이 이전과 같음
    • 값이 이전과 같지 않음
    • 값이 이전보다 증가
    • 값이 이전보다 감소
  • 해당 기능들은 다음과 같이 처리 됩니다.
    • 우선 Fuzz기능을 실행하면 대상 프로세스에서 사용중인 모든 메모리 값을 메모리 영역 또는 파일에 저장합니다.
    • 사용자가 치트 기능을 선택하면, 치트 툴은 앞에서 저장해둔 정보를 이용하여 값을 비교합니다.
      • 사용자가 입력한 조건에 만족하는 값만 메모리 영역 또는 파일에 저장합니다.
      • 이러한 과정을 반복합니다.

Memory lock

  • 치트 툴에서 제공하는 Memory lock 기능은 매우 간단합니다.
    • 스레드를 생성합니다.
    • ptrace()를 이용해 값을 고정하고 싶은 주소에 고정하고 싶은 값을 계속 저장합니다.

Related site