Excuse the ads! We need some help to keep our site up.
List
Memory cheat(AOS)
- 해당 내용은 2년전에 분석하고 개발한 Cheat tool에 대한 설명입니다.
- 해당 Tool은 보안 점검시 Memory cheat에 대한 검증용으로 필요해 개발하였습니다.
- 해당 정보와 Tool을 이용하여 부정 행위시 부정 행위를 한 사용자에게 책임이 있으며, 개발자에게는 책임이 없습니다.
Structure of Memory Cheat
- Memory cheats tool은 다음과 같은 형태로 동작합니다.
The default behavior of the memory cheat tool.
1 | Process attach | 사용자 레벨에서 프로세스 주소 공간에 접근하기 위해 ptrace()를 사용해 대상 프로세스를 연결합니다. |
---|---|---|
2 | Check the process memory area | 효율적인 Memory 분석을 위해 대상 프로세스가 사용하는 Memory 정보(Memory map)를 확인합니다. |
3 | Memory 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 |
|
PTRACE_TRACEME |
|
PTRACE_PEEKTEXT |
|
PTRACE_POKTEXT |
|
PTRACE_GETREGS |
|
PTRACE_SETREGS |
|
PTRECE_CONT |
|
PTRACE_DETACH |
|
PTRACE_SYSCALL |
|
PTRACE_SINGLESTEP |
|
PTRACE_GETSIGINFO |
|
PTRACE_SETSIGINFO |
|
PTRACE_SETOPTIONS |
|
man page - ptrace(process trace)
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 |
|
---|---|
perms |
|
offset |
|
dev |
|
inode |
|
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 필드 |
|
---|---|
pathname 필드 |
|
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
- lseek() 함수를 이용하여 읽을 파일의 위치로 초기화합니다.
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()를 이용해 값을 고정하고 싶은 주소에 고정하고 싶은 값을 계속 저장합니다.