안드로이드 커널 레벨 후킹하기
작성자 : wh1ant, mongii

 

이 문서는 리눅스 커널 기반인 안드로이드 OS에 LKM(Loadable Kernel Module)을 올리고,
시스템콜을 후킹하는 방법에 대해 설명합니다.

시스템콜이란 운영체제 커널 레벨에서 제공하는 함수로서, 이를 후킹(다른 함수로 교체하는 기술) 할 경우
운영체제의 주요 행위를 원하는 목적에 맞게 변조할 수 있습니다.

그래서 해커들은 이를 이용하여 운영체제에 커널 레벨의 백도어를 생성하거나, 
특정 함수를 모니터링 하거나, 
혹은 악성코드/취약점 분석을 위한 별도의 기능을 추가 할 수 있습니다.


이 문서의 내용은 두 파트로 나뉘어지는데, 하나는 안드로이드 OS에 커널 모듈을
올리는 내용이고, 다른 하나는 시스템 콜을 후킹하는 내용입니다.

 
우선, 커널 모듈을 작성 및 컴파일하고, 폰에 적재시키는 예제를 설명하겠습니다.
 
이 문서 작성 당시 테스트를 위해서 사용 된 폰은 안드로이드 2.3.6 기반의 HTC 넥서스원입니다.
그리고 이후 추가적으로 갤럭시S 등에서 문제없이 적용 됨을 확인하였습니다.
 
 
커널 모듈 컴파일을 위해서는 ARM 크로스 컴파일용 gcc와 안드로이드 커널 소스가 필요합니다.

여기서 굳이 안드로이드 커널 소스가 필요한 이유는,
모듈 컴파일에 요구되는 주요 파일들이 커널 소스에 포함 되어있기 때문입니다.

(Makefile, Kbuild.include, autoconf.h, Module.symvers 등)
 
 
1. ARM 크로스 컴파일용 gcc 다운로드
 
 


위 URL에 접속하면, ARM Cross compiler의 설치파일을 다운로드 받을 수 있습니다.
여러개의 파일들 중 가장 최신버젼
을 받아 설치하시면 됩니다.

ex> http://sourcery.mentor.com/public/gnu_toolchain/arm-none-linux-gnueabi/arm-2012.03-57-arm-none-linux-gnueabi.bin


[mongii@hackerschool ~]$ mkdir SOURCERY
[mongii@hackerschool ~]$ cd SOURCERY/
[mongii@hackerschool SOURCERY]$ wget http://sourcery.mentor.com/public/gnu_toolchain/arm-none-linux-gnueabi/arm-2012.03-57-arm-none-linux-gnueabi.bin

--2012-07-27 13:12:17--  http://sourcery.mentor.com/public/gnu_toolchain/arm-none-linux-gnueabi/arm-2012.03-57-arm-none-linux-gnueabi.bin
Resolving sourcery.mentor.com... 107.20.212.105
Connecting to sourcery.mentor.com|107.20.212.105|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 159668420 (152M) [application/octet-stream]
Saving to: `arm-2012.03-57-arm-none-linux-gnueabi.bin'
 
100%[======================================================>] 159,668,420 1.81M/s   in 1m 45s  
 
2012-07-27 13:14:04 (1.45 MB/s) - `arm-2012.03-57-arm-none-linux-gnueabi.bin' saved [159668420/159668420]

* ARM 크로스 컴파일러 인스톨러를 실행합니다.
 
[mongii@hackerschool SOURCERY]$ sh arm-2012.03-57-arm-none-linux-gnueabi.bin 
Checking for required programs: awk grep sed bzip2 gunzip
Preparing to install...
Extracting the JRE from the installer archive...
Unpacking the JRE...
Extracting the installation resources from the installer archive...
Configuring the installer for this system's environment...
 
Launching installer...

...

 

* 위 인스톨러는 bash를 필요로 합니다. 하지만 우분투의 경우 /bin/sh이 bash가 아닌 dash로
심볼릭 링크 되어 있습니다. 그래서 우분투를 사용하고 계실 경우 다음과 같이 /bin/sh를
bash로 심볼릭 링크 시켜주어야 인스톨이 진행됩니다.

# rm -rf /bin/sh
# ln -s /bin/bash /bin/sh

 

설치 도중 이것저것을 계속 물어보는데 모두 <enter> 혹은 y를 눌러서 진행하면 됩니다.
설치 과정은 몇 분 정도 소요됩니다.

설치가 완료되면, 자신의 home 디렉토리 아래에 CodeSourcery라는 디렉토리가 생긴 것을 볼 수 있습니다.
(설치에 사용 된 SOURCERY 디렉토리는 이제 지워도 됩니다.)

 

[mongii@hackerschool SOURCERY]$ cd
[mongii@hackerschool ~]$ ls -al
합계 96
drwx------  7 mongii mongii 4096  7월 27 13:19 .
drwxr-xr-x 17 root   root   4096  7월 27 11:36 ..
drwxrwxr-x  2 mongii mongii 4096  7월 27 13:15 .InstallAnywhere
-rw-r--r--  1 mongii mongii   33  7월 27 11:36 .bash_logout
-rw-r--r--  1 mongii mongii  176  7월 27 11:36 .bash_profile
-rw-r--r--  1 mongii mongii  266  7월 27 11:50 .bashrc
-rw-r--r--  1 mongii mongii  515  7월 27 11:36 .emacs
-rw-------  1 mongii mongii  809  7월 27 13:11 .viminfo
drwxrwxr-x  3 mongii mongii 4096  7월 27 13:17 CodeSourcery
drwxrwxr-x  2 mongii mongii 4096  7월 27 13:12 SOURCERY
drwxrwxr-x  2 mongii mongii 4096  7월 27 13:19 Sourcery_CodeBench_Lite_for_ARM_GNU_Linux
[mongii@hackerschool ~]$ 

 

이 디렉토리의 하위 디렉토리들 중 bin으로 들어가보면, ARM Cross Compile용 gcc를 볼 수 있습니다.

 

[mongii@hackerschool ~]$ cd CodeSourcery/
[mongii@hackerschool CodeSourcery]$ cd Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/
[mongii@hackerschool Sourcery_CodeBench_Lite_for_ARM_GNU_Linux]$ cd bin/
[mongii@hackerschool bin]$ ls -al
합계 18140
drwxr-xr-x 2 mongii mongii    4096  7월 27 13:20 .
drwxr-xr-x 9 mongii mongii    4096  7월 27 13:19 ..
-rwxr-xr-x 1 mongii mongii  621232  5월 28 05:40 arm-none-linux-gnueabi-addr2line
-rwxrwxr-x 2 mongii mongii  645508  5월 28 21:40 arm-none-linux-gnueabi-ar
-rwxrwxr-x 2 mongii mongii 1084656  5월 28 21:40 arm-none-linux-gnueabi-as
-rwxr-xr-x 2 mongii mongii  278832  5월 28 05:40 arm-none-linux-gnueabi-c++
-rwxr-xr-x 1 mongii mongii  619728  5월 28 05:40 arm-none-linux-gnueabi-c++filt
-rwxr-xr-x 1 mongii mongii  278832  5월 28 05:40 arm-none-linux-gnueabi-cpp
-rwxr-xr-x 1 mongii mongii   21396  5월 28 05:40 arm-none-linux-gnueabi-elfedit
-rwxr-xr-x 2 mongii mongii  278832  5월 28 05:40 arm-none-linux-gnueabi-g++
-rwxr-xr-x 2 mongii mongii  278832  5월 28 05:40 arm-none-linux-gnueabi-gcc
-rwxr-xr-x 2 mongii mongii  278832  5월 28 05:40 arm-none-linux-gnueabi-gcc-4.6.3
-rwxr-xr-x 1 mongii mongii   27392  5월 28 05:40 arm-none-linux-gnueabi-gcov
-rwxr-xr-x 1 mongii mongii 3190704  5월 28 05:40 arm-none-linux-gnueabi-gdb
-rwxr-xr-x 1 mongii mongii 3190704  5월 28 05:40 arm-none-linux-gnueabi-gdbtui
-rwxr-xr-x 1 mongii mongii  682100  5월 28 05:40 arm-none-linux-gnueabi-gprof
-rwxrwxr-x 2 mongii mongii 1065592  5월 28 21:40 arm-none-linux-gnueabi-ld
-rwxrwxr-x 2 mongii mongii  630512  5월 28 21:40 arm-none-linux-gnueabi-nm
-rwxrwxr-x 2 mongii mongii  779720  5월 28 21:40 arm-none-linux-gnueabi-objcopy
-rwxrwxr-x 2 mongii mongii  937424  5월 28 21:40 arm-none-linux-gnueabi-objdump
-rwxrwxr-x 2 mongii mongii  645508  5월 28 21:40 arm-none-linux-gnueabi-ranlib
-rwxr-xr-x 1 mongii mongii  374236  5월 28 05:40 arm-none-linux-gnueabi-readelf
-rwxr-xr-x 1 mongii mongii  622516  5월 28 05:40 arm-none-linux-gnueabi-size
-rwxr-xr-x 1 mongii mongii  387616  5월 28 05:40 arm-none-linux-gnueabi-sprite
-rwxr-xr-x 1 mongii mongii  621968  5월 28 05:40 arm-none-linux-gnueabi-strings
-rwxrwxr-x 2 mongii mongii  779720  5월 28 21:40 arm-none-linux-gnueabi-strip
[mongii@hackerschool bin]$ 

 

 

이제 이 arm-none-linux-gnueabi-gcc를 이용해서 C 소스코드를 컴파일 할 수 있습니다.

참고로 만약 우분투를 사용하고 계신다면 apt-get 명령을 사용해서 크로스 컴파일러를
자동으로 설치할 수도 있을 것입니다. (사용 시 문제없는지는 미확인)

# apt-get install gcc-arm-linux-gnueabi

이렇게 해서 ARM cross compler 설치가 완료되었습니다.

 
 
이제 다음으로 안드로이드 커널을 다운로드 받습니다.
 
 
 
2. 안드로이드 커널 다운로드 및 컴파일
 
 

 

# git clone https://android.googlesource.com/kernel/common.git kernel
Cloning into 'kernel'...
remote: Counting objects: 5, done
remote: Counting objects: 2468365, done
remote: Finding sources: 100% (26/26)
Receiving objects:   0% (11945/2468356), 2.08 MiB | 4.14 MiB/s   
[root@hackerschool ~]# 
[root@hackerschool ~]# 
[root@hackerschool ~]# cd kernel/
[root@hackerschool kernel]# ls -al
합계 24
drwxr-xr-x  3 root root 4096  7월 27 15:45 .
drwxr-x--- 47 root root 4096  7월 27 15:45 ..
drwxr-xr-x  8 root root 4096  7월 27 15:49 .git
[root@hackerschool kernel]# git branch -r
  origin/HEAD -> origin/master
  origin/android-2.6.39
  origin/android-3.0   <== 커널버젼, 해당 플랫폼은 4.0
  origin/android-3.3
  origin/android-3.4
  origin/android-3.4-compat
  origin/coupled-cpuidle
  origin/master
[root@hackerschool kernel]# git checkout origin/android-3.0
Checking out files: 100% (37135/37135), done.
Note: checking out 'origin/android-3.0'.
 
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
 
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
 
  git checkout -b new_branch_name
 
HEAD is now at 62618c1... net: wireless: bcmdhd: Prevent HT Avail request failure to flood the log

[root@hackerschool kernel]# ls -al
합계 660
drwxr-xr-x 24 root root   4096  7월 27 15:53 .
drwxr-x--- 47 root root   4096  7월 27 15:45 ..
drwxr-xr-x  8 root root   4096  7월 27 15:53 .git
-rw-r--r--  1 root root    966  7월 27 15:53 .gitignore
-rw-r--r--  1 root root   4268  7월 27 15:53 .mailmap
-rw-r--r--  1 root root  18693  7월 27 15:53 COPYING
-rw-r--r--  1 root root  94495  7월 27 15:53 CREDITS
drwxr-xr-x 93 root root  12288  7월 27 15:53 Documentation
-rw-r--r--  1 root root   2464  7월 27 15:53 Kbuild
-rw-r--r--  1 root root    252  7월 27 15:53 Kconfig
-rw-r--r--  1 root root 195212  7월 27 15:53 MAINTAINERS
-rw-r--r--  1 root root  53438  7월 27 15:53 Makefile
-rw-r--r--  1 root root  17459  7월 27 15:53 README
-rw-r--r--  1 root root   3371  7월 27 15:53 REPORTING-BUGS
drwxr-xr-x 26 root root   4096  7월 27 15:53 arch
drwxr-xr-x  2 root root   4096  7월 27 15:53 block
drwxr-xr-x  3 root root   4096  7월 27 15:53 crypto
drwxr-xr-x 95 root root   4096  7월 27 15:53 drivers
drwxr-xr-x 38 root root   4096  7월 27 15:53 firmware
drwxr-xr-x 72 root root   4096  7월 27 15:53 fs
drwxr-xr-x 21 root root   4096  7월 27 15:53 include
drwxr-xr-x  2 root root   4096  7월 27 15:53 init
drwxr-xr-x  2 root root   4096  7월 27 15:53 ipc
drwxr-xr-x  9 root root   4096  7월 27 15:53 kernel
drwxr-xr-x  8 root root   4096  7월 27 15:53 lib
drwxr-xr-x  2 root root   4096  7월 27 15:53 mm
drwxr-xr-x 53 root root   4096  7월 27 15:53 net
drwxr-xr-x 10 root root   4096  7월 27 15:53 samples
drwxr-xr-x 13 root root   4096  7월 27 15:53 scripts
drwxr-xr-x  8 root root   4096  7월 27 15:53 security
drwxr-xr-x 22 root root   4096  7월 27 15:53 sound
drwxr-xr-x  9 root root   4096  7월 27 15:53 tools
drwxr-xr-x  2 root root   4096  7월 27 15:53 usr
drwxr-xr-x  3 root root   4096  7월 27 15:53 virt
[root@hackerschool kernel]#
 

 

커널 소스 다운로드가 완료되었습니다.
(이 과정은 네트워크 상태에 따라 오랜 시간이 소요될 수 있습니다.)

 
 
커널 모듈을 컴파일하기 위해선 각종 헤더 파일이 필요하게 되는데, 어떤 헤더 파일들은
다운로드한 커널 소스에 포함되어 있으며, 반면에 어떤 헤더 파일들은 커널 컴파일 이후에 생성이 됩니다.
 


 
그렇기 때문에 커널 모듈을 컴파일하기에 앞서 커널 컴파일 과정이 필수적으로 필요합니다.
 
 
 
3. 안드로이드 커널 컴파일
 
 
 

 

# export PATH=$PATH:/ARM_크로스컴파일러_설치경로/Sourcery_G++_Lite/bin/
make mrproper
make distclean
make defconfig ARCH=arm
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

...

 

 
커널 컴파일엔 10~20분 정도의 시간이 소요되며, 완료 시엔 다음과 같은 주요 파일들이 생성됩니다.
 

 

 

# ls -al
합계 26452
...
-rw-r--r--  1 root root  197233  7월 30 16:34 Module.symvers
...
-rw-r--r--  1 root root  730800  7월 30 16:34 System.map
...
drwxr-xr-x 23 root root    4096  7월 30 16:27 include
...
-rwxr-xr-x  1 root root 4824151  7월 30 16:34 vmlinux
...
 

 

 
 
이로써 커널 모듈 컴파일에 필요한 환경 구축이 완료되었습니다.
 
 
이제 모듈 컴파일을 위한 디렉토리를 만듭니다. 
 
# vi hello.c 
 
#include <linux/init.h> 
#include <linux/kernel.h> 
#include <linux/module.h>  
#include <linux/syscalls.h> 
 
int __init my_init( void ) 
    printk("Hello world\n”); 
    return 0; 
void __exit my_exit( void ) 
    printk("Goodbye~\n”); 
module_init(my_init); 
module_exit(my_exit); 
MODULE_LICENSE("GPL"); 
 
이것은 일반적인 커널 모듈 프로그래밍 형태입니다.

insmod <모듈파일> 명령을 입력하면 모듈이 올라가면서 my_init 함수가 호출되고,
rmmod <모듈명> 명령을 입력하면 모듈이 내려가면서 my_exit 함수가 호출됩니다.

 
 그리고 각 모듈을 올림과 내림에 의해 printk()로 메시지가 로그에 기록이 될 것이고,
이 커널 메시지들은 dmesg 명령어를 통해 확인할 수 있게 될 것입니다.

 
이제 모듈 컴파일을 위한 Makefile을 생성합니다.
 
 
# vi Makefile 
 
obj-m := hello.o 
KDIR := /리눅스 커널 설치 경로/
PWD := $(shell pwd) 
CCPATH :=/root/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin
default: 
        $(MAKE) ARCH=arm CROSS_COMPILE=$(CCPATH)/arm-none-linux-gnueabi- -C $(KDIR) M=$(PWD) modules 
clean: 
        rm -rf *.ko 
        rm -rf *.mod.* 
        rm -rf .*.cmd 
        rm -rf *.o 
        rm -rf .tmp_versions 
        rm -rf modules.order 
        rm -rf Module.symvers 
 
위 값들 중 탭 문자에 해당하는 부분은 실제로 탭이 들어가야함에 유의합니다.
탭 대신 스페이스가 들어가면 오류가 납니다.

그리고 KDIR과 CCPATH는 각각 자신이 설치한 경로에 맞게 수정해 줍니다.

 

이제 모듈을 컴파일 합니다.

 
# make
 
 오류가 없다면 정상적으로 모듈이 컴파일 된 것입니다.

이제 디렉토리 내에 hello.ko 파일이 생성된 것을 볼 수 있을 겁니다.
 
 
이제 스마트폰을 USB로 PC와 연결한 뒤,
adb 명령어를 이용하여 컴파일 된 모듈 파일을 스마트폰으로 전송합니다.
 
 
>adb push hello.ko /sdcard/
hello.ko 파일을 스마트폰으로 전송한다
 

>adb shell 
안드로이드 쉘로 접속한다. 
 
$ su 
모듈을 올리기 위해서는 루트 권한으로 전환해야 한다. 
 
# id 
id 
uid=0(root) gid=0(root) 
Hello world 
 
# insmod /sdcard/hello.ko 
모듈을 올린다. 
 
# dmesg 
… 
<1>[ 3389.640106] Hello world 
… 
로그를 확인하여 커널 레벨의 메시지를 확인한다.
(
dmesg는 커널 레벨에서 출력한 메시지를 볼 수 있는 명령어입니다.)
 
 
 

 

	- Android kernel level systemcall hooking -


시스템콜 후킹을 하기 위해서는 
시스템콜 테이블의 시작 주소를 담은 커널 내 포인터 변수인 sys_call_table의 주소를 찾아야 합니다. 

이를 찾는 여러 테크닉이 존재하지만, 
이 문서에서는 가장 기본적인 방법인 System.map 파일로부터 주소를 얻는 방법을 설명합니다.


root@anbuild:~/kernel# cat System.map  | grep sys_call_table
c00280c4 T sys_call_table
이처럼 sys_call_table의 주소값은 확인했습니다.
 
하지만 만약 컴파일 된 커널과 실제 스마트폰의 커널에 차이가 있다면,
위 System.map 파일 안의 
주소들 역시 실제 주소와 다를 수 있습니다.
 
이럴 경우엔 스마트폰 내에 /proc/kallsyms 파일을 이용하여 같은 방법으로 주소를 얻을 수 있습니다.
 

					
root@android:/data/local/tmp # cat /proc/kallsyms | ./grep sys_call_table      
c00280c4 T sys_call_table
root@android:/data/local/tmp # 
 
만약 이 방법으로도 sys_call_table의 주소를 찾지 못했다면 최하단의 "팁2"를 봐주시기 바랍니다.
 
 
다음으로 후킹할 시스템 콜을 살펴 보겠습니다.

					
#vi arch/arm/include/asm/unistd.h


/*
 *  arch/arm/include/asm/unistd.h
 *
 *  Copyright (C) 2001-2005 Russell King
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * Please forward _all_ changes to this file to rmk@arm.linux.org.uk,
 * no matter what the change is.  Thanks!
 */
#ifndef __ASM_ARM_UNISTD_H
#define __ASM_ARM_UNISTD_H

#define __NR_OABI_SYSCALL_BASE  0x900000

#if defined(__thumb__) || defined(__ARM_EABI__)
#define __NR_SYSCALL_BASE       0
#else
#define __NR_SYSCALL_BASE       __NR_OABI_SYSCALL_BASE
#endif

/*
 * This file contains the system call numbers.
 */

#define __NR_restart_syscall            (__NR_SYSCALL_BASE+  0)
#define __NR_exit                       (__NR_SYSCALL_BASE+  1)
#define __NR_fork                       (__NR_SYSCALL_BASE+  2)
#define __NR_read                       (__NR_SYSCALL_BASE+  3)
#define __NR_write                      (__NR_SYSCALL_BASE+  4)
#define __NR_open                       (__NR_SYSCALL_BASE+  5)
#define __NR_close                      (__NR_SYSCALL_BASE+  6)
                                        /* 7 was sys_waitpid */
#define __NR_creat                      (__NR_SYSCALL_BASE+  8)
#define __NR_link                       (__NR_SYSCALL_BASE+  9)
#define __NR_unlink                     (__NR_SYSCALL_BASE+ 10)
#define __NR_execve                     (__NR_SYSCALL_BASE+ 11)
#define __NR_chdir                      (__NR_SYSCALL_BASE+ 12)
#define __NR_time                       (__NR_SYSCALL_BASE+ 13)
#define __NR_mknod                      (__NR_SYSCALL_BASE+ 14)
#define __NR_chmod                      (__NR_SYSCALL_BASE+ 15)
...

이처럼 많은 종류의 시스템콜들 중 자신이 후킹하고자 하는 대상을 선택하여 후킹하면 됩니다.
이 문서에서는 sys_read() 함수를 대상으로 해보겠습니다.




					
/* hook.c
   sys_call_table hooking source.
*/

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/syscalls.h>

void** sys_call_table = (void*)0xc00280c4;      // sys_call_talbe address setting
asmlinkage ssize_t (*org_sys_read)(int fd, char* buf, size_t count);

asmlinkage ssize_t hooked_read(int fd, char* buf, size_t count)
{
  printk(KERN_ALERT "pseudo read(): %s\n", buf);
  return org_sys_read(fd, buf, count);
}

int __init my_init( void )
{
  org_sys_read=*(sys_call_table+__NR_read);
  printk(KERN_ALERT "init sys_read before %p\n", *(sys_call_table+__NR_read));
  *(sys_call_table+__NR_read)=hooked_read;
  printk(KERN_ALERT "init sys_read after %p\n", *(sys_call_table+__NR_read));
  return 0;
}

void __exit my_exit( void )
{
  printk(KERN_ALERT "exit sys_read before %p\n", *(sys_call_table+__NR_read));
  *(sys_call_table+__NR_read)=org_sys_read;
  printk(KERN_ALERT "exit sys_read after %p\n", *(sys_call_table+__NR_read));
}

module_init(my_init);
module_exit(my_exit);

MODULE_LICENSE("GPL");
 

위 커널 모듈이 insmod에 의해 올라갈 때 sys_read() 함수를 후킹하며,
모듈이 내려올 때엔 반대로 sys_read()함수를 정상적으로 복귀시킵니다.

실제 후킹을 성공 했는지 확인하기 위해 주소를 출력하고 있으며,
sys_read() 함수 대신 후킹 된 함수에서는 버퍼의 내용을 printk로 출력합니다.

Makefile은 앞의 예제와 동일합니다.


					
root@anbuild:~/test# make
make ARCH=arm CROSS_COMPILE=/root/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- -C /root/kernel M=/root/test modules
make[1]: Entering directory `/root/kernel'
  CC [M]  /root/test/hook.o
  Building modules, stage 2.
  MODPOST 1 modules
  LD [M]  /root/test/hook.ko
make[1]: Leaving directory `/root/kernel'

make 명령어를 실행하여 오류 메시지가 없다면 정상적으로 컴파일된 것입니다.
 

이제 다시 adb를 이용하여 컴파일 된 모듈 파일을 안드로이드에 복사합니다.


					
>adb push hook.ko /sdcard/
>adb shell
$ su -
# cd /sdcard
# ls hook.ko
hook.ko
#
 

다음으로 insmod 명령을 이용하여 커널 모듈을 적재시킵니다.



					
# insmod hook.ko

아무런 에러 메시지가 없다면 모듈이 정상적으로 올라간 것입니다.

그리고 다음과 같이 lsmod 명령을 이용하여 모듈의 적재 상태를 확인할 수 있습니다.



					
# lsmod
hook 789 0 - Live 0xbf000000
#

마지막으로 실제 후킹에 성공 했는지 확인하도록 하겠습니다.



					
# dmesg
...
<1>[  100.485229] <6>[   21.417297] SMD: ch 50 1 -> 2
<1>[  100.485260] <6>[   21.417755] qmi: smd opened
<1>[  100.485290] <6>[   21.418212] qmi: smd closed
<1>[  100.485290] <6>[   21.418457] SMD: ch 51 1 -> 2
<1>[  100.485321] <6>[   21.418701] qmi: smd opened
<1>[  100.485351] <6>[   21.419250] qmi: ctl: wds use client_id 0x01
<1>[  100.485382] <6>[   21.419525] qmi: ctl: wds use client_id 0x01
<1>[  100.485412] <6>[   21.419830] qmi: smd closed
<1>[  100.485443] <6>[   21.420288] SMD: ch 52 1 -> 2
<1>[  100.485473] <6>[   21.420532] qmi: smd opened
<1>[  100.485504] <6>[   21.421325] qmi: ctl: wds use client_id 0x01
<1>[  100.485534] <6>[   22.332397] a1026_bootup_init
<1>[  100.503601] pseudo read(): ELF
<1>[  100.504425] pseudo read(): 휇
<1>[  100.505249] pseudo read(): ELF
<1>[  100.505950] pseudo read(): 휇
<1>[  100.506988] pseudo read(): ELF
<1>[  100.507415] pseudo read(): 휇
 


커널 메시지를 보니 hook.c에서 printk()로 찍은 pseudo read() 메시지가 보입니다.
지속적으로 후킹 된 read() 함수가 호출되고 있다는 걸 알 수 있습니다.

이렇게 해서 안드로이드 커널 시스템콜 후킹에 성공했습니다~!

 

적재된 모듈을 커널에서 내리는 예제를 마지막으로 강좌를 마치겠습니다.



					
# rmmod hook.ko
# lsmod
모듈이 제거된걸 확인할 수 있습니다.
 

 


 

팁1. 컴파일된 모듈과 실제 대상의 커널 버전이 맞지 않을 경우 다음과 같은 오류가 나타납니다.

 



					

root@android:/data/local/tmp # insmod hello.ko                                 

[ 3390.170163] hello: version magic '3.0.17 SMP preempt mod_unload ARMv7 p2v8 ' should be '3.0.41 SMP preempt mod_unload ARMv7 p2v8 '
insmod: init_module 'hello.ko' failed (Exec format error)
255| root@android:/data/local/tmp # 

 

이럴 경우엔 타겟의 버전과 동일한 환경을 구축해야하지만,
hello.ko를 HEX EDITOR로 열어 커널 버전을 강제로 맞춰주면 쉽게 해결되기도 합니다.
 
 

						

 

root@android:/data/local/tmp # insmod hello.ko                             
[ 3588.819508] Hello world
root@android:/data/local/tmp # 

팁2. sys_call_table의 주소를 찾지 못했을 때

출처 : http://packetstormsecurity.com/files/105317/Android-LKM-Cheat-Sheet.html


unsigned long *sys_call_table;


						
int sct_swi(void) {
    const void *vSWI_LDR_addr = 0xFFFF0008;
    unsigned long* ptr;
    unsigned long vSWI_offset;
    unsigned long vSWI_instruction;
    unsigned long *vt_vSWI;
    unsigned long sct_offset;
    int isAddr;
 
    vSWI_instruction = vSWI_offset = sct_offset = 0;
    ptr = vtable_vSWI = NULL;
 
    memcpy(&vSWI_instruction, vSWI_LDR_addr, sizeof(vSWI_instruction));
    vSWI_offset =     veSWI_instruction & (unsigned long)0x00000fff; 
    vt_vSWI = (unsigned long *) ((unsigned long)vSWI_addr+vSWI_offset+8);
    ptr=*vt_vSWI;
    isAddr = 0;
    while (!isAddr) {
        isAddr = ( ((*ptr) & ((unsigned long)0xffff0000)) == 0xe28f0000 );
        if (isAddr) {
            sct_offset = (*ptr) & ((unsigned long)0x00000fff);
            sys_call_table = (unsigned long)ptr + 8 + sct_offset;
        }
        ptr++;
    }
    return 0;
}
 
 
 

 

40개의 댓글이 달려있습니다.

%uBA4D%uBA4D' aNd '7'='2
Oct 26, 2013 02:13
' oR '%'='

%uBA4D%uBA4D' aNd '7'='2
Oct 26, 2013 02:13
' oR '%'='2

재미지잖아
Oct 31, 2014 08:08
감사합니다! ㅎㅎ

flack3r
Dec 28, 2014 12:45
유용한 정보 감사합니다~! :)

sadf
May 25, 2015 12:28
오메 재미있습니다.

jameshan92
Jul 03, 2015 11:39
굿 팁 한번 해보겠습니다

ranitidine 150 mg
Mar 21, 2018 11:31
ranitidine 300 mg

ranitidine 150 mg
Mar 21, 2018 11:31
ranitidine 300 mg

ranitidine 150 mg
Mar 21, 2018 11:32
ranitidine 300 mg

Online cialis
Mar 24, 2018 09:37
Your way of describing all in this article is truly good, every one can simply be aware of it, Thanks a lot.

이상민
Feb 27, 2019 07:13
지난 시즌 승강 플레이오프라는 최악을 경험했던 서울이 절치부심하며 새판 짜기에 나섰다. 설계자는 '승부사'안전놀이터토토사이트 최용수 감독이었다. 최용수 감독은 가장 먼저 자신의 축구 색깔과 맞지 않는 선수들을 내보내며 완전한 '새판'을 구상했고, 알리바예프와 페시치를 영입하며 외국인 선수 구성을 확 바꿨다. (=안전놀이터) 안전한놀이터 확 달라진 서울을 예고했다. '토토사이트"시즌을 앞둔 최용수 감독은 안전놀이터 2016년 완성시키지 못했던 3-5-2 포메이션을 바탕으로 빠르고 역동적인 축구를 구사하겠다는 계획을 세웠다. 이에 최용수 감독은 페시치, 알리바예프, 박주영, 윤주태, 고요한, 하대성 등 공격적인 선수들을 다양하게 조합하며 전술적인 실험과 함께 플랜A를 만들고 있었다.안전놀이터 토토사이트안전한놀이터 11일 일본 가고시마 고쿠보 경기장에서 만난 최용수 감독은 "올해는 3백을 한 번 써보려고 한다. 지난 해 4백을 많이 써봤는데 잘 되지 않았다. 2016년도에 3백을 썼는데 완성체가 아니었다. 올해 방점을 찍으려고 한다. 안전한놀이터 나 도 생각하고 있다"며 전술 변화를 예고했다. 최용수 감독은 핵심 선수로 페시치, 알리바예프, 박주영 그리고 '신예' 김주성을 꼽았다. 페시치와 알리바예프에 대해서는 엄지를 치켜세웠고, 박주영의 헌신에 대해서도 극찬했다. 여기에 '신예 수비수' 김주성을 제2의 김민재로 키워보겠다면서 새 시즌 주전 수비수로 활용하겠다는 뜻을 전했다. 이에 대해 최용수 감독은 "페시치는 정말 좋다. 내가 오랜 시간 관찰했고, 확실히 좋은 공격수다. 슈팅 임팩트가 매우 좋고, 골 결정력을 갖췄다. 공격수에게 필요한 모든 것을 갖춘 선수라고 생각하면 된다. 계약 문제로 훈련을 많이 하지 못했는데 스스로 훈련을 더 하고 있다. 적극적으로 훈련하고 있다. 훈련 태도가 아주 좋고, 선수들과도 잘 어울리고 있다. 페시치가 우리 팀과 시너지 효과를 내줬으면 좋겠다"며 페시치를 극찬했다. 이어 최용수 감독은 "박주영은 팀에 모범이 되고 있다. 책임감이 있는 모습을 보여주고 있다. 지난해와는 다른 모습 보여줄 것이다. 고요한과 하대성도 솔선수범해주고 있는데 내 입장에서는 정말 고맙다. 우리 혈통이다"며 베테랑들의 헌신에 활짝 웃었다. '신예' 수비수 김주성에 대한 칭찬도 잊지 않았다. 최용수 감독은 "올해 들어왔는데 정말 놀랐다. 김민재처럼 성장할 수 있는 수비수고, 정말 좋다. 과거에는 내가 19살짜리 선수를 쓸지 몰랐다. 나이에 비해 기본기, 시야 등 다양한 장점을 가지고 있다. 개막전에도 선발로 쓸 것이다. 이것이 내가 변한 것이다. 아직 김민재 보다는 부족하지만 실전 경기를 치르면서 평가를 받아야 한다. 내가 봤을 때는 우리 팀에 잘 녹아들고 있다. 기대되는 선수다"며 칭찬을 아끼지 않았다. 지난 시즌 서울은 분명 부정적인 요소가 가득했다. 그러나 '승부사' 최용수 감독이 부임하고 나서 확실히 분위기가 변하고 있고, 최용수 감독 역시 서울이 변하고 있음을 실감하고 있었다. 최용수 감독은 "선수들이 1차 체력 훈련을 잘 진행했고, 일본에서는 히로시마 등 좋은 팀들과 경기를 하고 있다. 실전 감각과 조직력을 끌어올려야 한다. 현재 서울은 부정에서 긍정으로 바뀌는 시기다. 길지는 않지만 짧은 시간 동안 준비를 잘해야 한다. 완벽하지는 않다. 현재는 60% 정도다"며 서울의 분위기가 부정에서 긍정으로 바뀌고 있다고 말하면서 반전을 예고했다. https://www.mastertoto2019.com 토 토 사 이 트 https://www.mastertoto2019.com 안 전 놀 이 터 https://www.mastertoto2019.com 안 전 한 놀 이 터 https://www.mastermajor2019.com 토 토 사 이 트 https://www.mastermajor2019.com 안 전 놀 이 터 https://www.mastermajor2019.com 안 전 한 놀 이 터 https://www.master2019.net 안 전 놀 이 터 https://www.master2019.net 토 토 사 이 트 https://www.master2019.net 안 전 한 놀 이 터

Vidmwoto
Apr 11, 2019 12:30
Today almost everyone visits Youtube or any other video hosting to upload and watch video about cats, free movies and other video content. But sometimes you want to download a movie or a video and the service doesn't allow you to do so. That's where Vidmate is coming to help you out. It provides with an ability for you to get a video from may services, including YT, Vimeo, Vimeo and many other hosting services. To perform this you just need to open video page and click download button. Plus, the app is completely free of charge and has user-friendly UI! Download Vidmate now and start downloading very entertaining videos to share them with your friends or family!

JaviesryFes
Sep 04, 2019 08:44
Door Repair Are you looking for a Toronto & the GTA door service company near you? We are your trusted door and locksmith experts that you can count on. If you have a new door that needs installation or if you have a problem with your door and lock from a break-in, we will fix it on the spot. Our specialist provides a valuable and affordable service to our commercial and residential customers and offers a 1-year industry standard manufacturer warranty on any of our hardware products.

JaviesryFes
Sep 06, 2019 05:10
Door Repair Are you looking for a Toronto & the GTA door service company near you? We are your trusted door and locksmith experts that you can count on. If you have a new door that needs installation or if you have a problem with your door and lock from a break-in, we will fix it on the spot. Our specialist provides a valuable and affordable service to our commercial and residential customers and offers a 1-year industry standard manufacturer warranty on any of our hardware products.

JaviesryFes
Sep 07, 2019 12:04
Door Repair Are you looking for a Toronto & the GTA door service company near you? We are your trusted door and locksmith experts that you can count on. If you have a new door that needs installation or if you have a problem with your door and lock from a break-in, we will fix it on the spot. Our specialist provides a valuable and affordable service to our commercial and residential customers and offers a 1-year industry standard manufacturer warranty on any of our hardware products.

123123
Sep 28, 2019 01:54
토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 메이저놀이터 - 메이저놀이터 승인전화없는 - 승인전화없는 안전놀이터 - 안전놀이터 먹튀없는 놀이터 - 먹튀없는 놀이터 사설놀이터 - 사설놀이터 스포츠토토추천 - 스포츠토토추천 스포츠토토 - 스포츠토토 스포츠토토추천 - 스포츠토토추천 안전놀이터추천 - 안전놀이터추천 사설토토 - 사설토토 메이저놀이터 - 메이저놀이터 승인전화없는 사이트 - 승인전화없는 사이트 승인전화없는 토토사이트 - 승인전화없는 토토사이트 사설토토 - 사설토토 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 안전놀이터 추천 - 안전놀이터 추천 검증놀이터 - 검증놀이터 검증된토토사이트 - 검증된토토사이트 검증된놀이터 - 검증된놀이터 사설토토검증 - 사설토토검증 검증된 안전놀이터 - 검증된 안전놀이터 안전한놀이터찾는법 - 안전한놀이터찾는법 메이저놀이터 - 메이저놀이터 메이저사이트 - 메이저사이트 메이저놀이터 추천 - 메이저놀이터 추천 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 메이저놀이터 - 메이저놀이터 먹튀없는 놀이터 - 먹튀없는 놀이터 검증된메이저놀이터 - 검증된메이저놀이터 사설놀이터 - 사설놀이터 스포츠토토추천 - 스포츠토토추천 안전놀이터 추천 - 안전놀이터 추천 검증놀이터 - 검증놀이터 스포츠토토 - 스포츠토토 스포츠토토추천 - 스포츠토토추천 안전놀이터추천 - 안전놀이터추천 사설토토 - 사설토토 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터 토토사이트 - 토토사이트 안전놀이터 - 안전놀이터

MarkReake
Feb 01, 2020 06:06
Acquisto Viagra Sicuro http://ggenericcialisle.com - Buy Cialis Cialis Pas Cher cialis 5 mg Cipro And Amoxicillin 12 Hours Apart

카지노사이트
May 18, 2020 11:24
Good day, I'm grateful to make this blog because I learned a lot here https://ace21.net/

바카라사이트
May 18, 2020 11:25
I often find a site that your blog is unique and enables read friend thanks 바카라사이트

카지노사이트
May 18, 2020 11:25
this blog is really enjoyable, thank you for making it because of it I learned a lot 카지노사이트

바카라
May 18, 2020 11:25
I have checked your all mentioned blogs.Thanks for sharing this useful blog. all blogs are very helpful for me. https://www.nun777.com/

바카라사이트
May 18, 2020 11:26
I really appreciate your work. This post is really handy and useful, I am sure people will get help from this. And thanks for sharing. https://www.casino815.com/

kim
Jul 18, 2020 09:49
https://www.hototo109.com 안전놀이터 https://www.hototo109.com 토토사이트 https://www.hototo109.com 먹튀검증 https://www.hototo109.com 메이저놀이터 https://www.toto109.com 안전놀이터 https://www.toto109.com 토토사이트 https://www.toto109.com 먹튀검증 https://www.toto109.com 메이저놀이터

kenny
Sep 05, 2020 12:15
https://www.usb75.com/ https://www.usb75.com/ 바카라사이트 https://www.usb75.com/ 카지노사이트 https://www.usb75.com/ 온라인카지노 https://www.usb75.com/maxcasino/ 맥스카지노 https://www.usb75.com/smcasino/ 에스엠카지노 https://www.usb75.com/casimbaslot/ 카심바슬 롯머신 https://www.usb75.com/pharaocasino/ 파라오카지노 https://www.usb75.com/solairecasino/ 솔레어카지노 https://www.usb75.com/coincasino/ 코인카지노 https://www.usb75.com/royalcasino/ 로얄카지노 https://www.usb75.com/millioncasino/ 밀리언클럽카지노 https://www.usb75.com/platinum/ 플래티넘카지노 https://www.chrome36.com/ https://www.chrome36.com/ 온라인카지노 https://www.chrome36.com/ 우리계열카지노 https://www.chrome36.com/casinosite/ 카지노사이트 https://www.chrome36.com/baccaratsite/ 바카라카지노 https://www.chrome27.com/onlinecasino/ 온라인카지노 https://www.chrome27.com/ https://www.chrome27.com/ 우리카지노 https://www.chrome27.com/ 우리계열카지노 https://www.chrome27.com/ 카지노사이트 https://www.chrome27.com/ 바카라사이트 https://news7game.blogspot.com/카지노사이트 https://kj500.blogspot.com/바카라사이트 https://giu77.blogspot.com/카지노사이트 https://oebb7.blogspot.com/바카라사이트 https://so33ju.blogspot.com/온라인카지노 https://dnfl9.blogspot.com/카지노사이트 https://site81on.blogspot.com/바카라사이트 https://dnfl72.blogspot.com/우리카지노 https://chucheon.blogspot.com/우리계열카지노 https://soara77.blogspot.com/카지노사이트 https://dhszk18.blogspot.com/카지노사이트 https://online777game.blogspot.com/바카라사이트 https://royal765.blogspot.com/에스엠카지노 https://joara27.blogspot.com/파라오카지노 https://pharao99.blogspot.com/바카라사이트

zithromax z pak
Feb 14, 2021 06:59
zpak price zithromax 500 zpack uti treatment

plaquenil 200 mg twice a day
Feb 17, 2021 10:46
cheapest erectile dysfunction plaquenil autoimmune erectile disorder

tadalafil gel
Feb 20, 2021 09:35
sedafil tadalafil max dose erectafil-5

aralen where to buy
Feb 22, 2021 06:15
chloroquinone aralen for sale chloroquinolone malaria

hydroxychloroquine sulfate plaquenil
Feb 24, 2021 06:43
erectile dysfunction drugs plaquenil drug class can erectile dysfunction caused by guilt

zithromax canada
Feb 25, 2021 05:13
zithromax tablets buy zithromax canada what is the generic name for zithromax

sildenafil citrate
Feb 26, 2021 11:15
https://genericviagragog.com viagra buy

tadalafil cost
Jun 09, 2021 04:57
tadalafil dosage tadalafil daily online tadalafil uses

cialis without a doctor prescription
Jun 10, 2021 01:12
tadalafil dosage cialis pills tadalafil vs vardenafil

clonidine hcl
Jun 10, 2021 06:11
whats hcq chloroquine hcl plaquenil 400 mg

malarone
Jun 10, 2021 08:39
side effects of hydroxychloroquine chloroquine tablets whats hcq

pharmaceptica
Jun 28, 2021 03:59
sildenafil usa https://pharmaceptica.com/

www.pharmaceptica.com
Jun 28, 2021 09:18
drug chloroquine https://pharmaceptica.com/

hydroxychloroquine classification
Jul 16, 2021 05:00
side effects of chloroquine https://chloroquineorigin.com/# hydroxyclorquin

hcqs pill
Jul 16, 2021 08:46
chloroquine tablets amazon https://chloroquineorigin.com/# what does hydroxychloroquine do

hydroxicloriquine
Aug 04, 2021 11:48
hydroxicloriquin https://plaquenilx.com/# hydrochloquine


 댓글 남기기

ID Password
   
Hit : 68852  

Copyright(C) HACKERSCHOOL All Rights Reserved.