2010年7月16日 星期五

移植dropbear到Android

從現在開始我會紀錄在實作上遇到的問題或學到的方法,這是第一篇,以後會慢慢增加。

我從暑假起開始學Android,不過是從底層的building開始,而不是應用程式。因為想參加比賽,所以之後一定會練習,即使JAVA已經很久沒碰...

今天的工作是把在嵌入式系統上常用的sshd,也就是dropbear,移植到開發版上。開發版是6410XP,已經移植了Busybox 1.16.2,也改了/system資料夾的權限使之可寫入(預設是read-only),而且可有線上網。之前的過程有空再寫。

1. 下載dropbear原始碼
由於Android被Google改很大,裡面的shell環境和標準Linux有很大的不同。例如,dropbear通常會使用到/etc/passwd這檔案,但是Android裡沒有。這還只是眾多不同的其中一個....

所以我們需要Patch檔修改dropbear原始碼。可在http://jblomer.web.cern.ch/jblomer/android.htm找到dropbear0.52-android.patch這檔案。接著下載dropbear 0.52,解壓後,把patch檔放到該資料夾下,接著鍵入

patch -p1 < dropbear0.52-android.patch  

這邊要注意的是,dropbear的版本一定要用0.52,否則會出現Hunk #1 FAILED at 1.之類的錯誤訊息並產生.rej檔案。這代表patch檔和被patch的程式碼兩者之間的版本不符。若成功則會出現:

patching file common-session.c
patching file loginrec.c
patching file runopts.h
patching file svr-auth.c
patching file svr-authpasswd.c
patching file svr-authpubkey.c
patching file svr-chansession.c
patching file svr-runopts.c

2. 編譯dropbear
編譯之前要先確定自己的toolchain中有libz.a,因為到時候編譯時我們要以靜態連結函式庫。如果沒有,必須自己下載並編譯:

./confugure --prefix=/usr/local/arm/4.3.1-eabi-armv6/usr/ (指定安裝到自己toolchain的資料夾內)
make CC=arm-linux-gcc
make install

最後開始編譯dropbear:

./confugure --host=arm-linux
STATIC=1 make PROGRAMS="dropbear dropbearkey"
生成dropbear和dropbearkey兩個執行檔

3. 移植並配置

我把這兩檔案放到system/bin資料夾後重新以mkyaffs2image打包之後燒到板子上,然後執行以下兩個指令生出key,否則dropbear沒有作用:

dropbearkey -t rsa -f /system/etc/dropbear/dropbear_rsa_host_key
dropbearkey -t dss -f /system/etc/dropbear/dropbear_dss_host_key

最後鍵入dropbear -A -N <username> -C  <password> -E 讓他在背景執行,我們就可以用ssh登入到這台Android機器了!

如果要讓系統啟動時就開啟dropbear,就在init.rc加入(關於init.rc 改天再講)
service dropbear /system/bin/dropbear -A -N <username> -C  <password> -E

後記

其實一開始我們並不知道要用-A -N等等的選項,因為這些都是patch之後才出現的,而且都是for Android,我們可以下-h看到這些參數的說明:
....
-A Android Mode, specify a user explicitly
-N Android Mode, user name
-C Android Mode, password
-R Android Mode, public key file (authorized_keys)
-U Android Mode, UID
-G Android Mode, GID
....

那時,我們只下-E。並用root帳號去登入,且當輸入密碼時直接按enter,但不管怎麼打一定都會出現Permission denied.,登不進去。後來google了一下才知道要這樣用(http://android.modaco.com/content/htc-hero-hero-modaco-com/294137/sshd/),但不知道還有沒有更好的方法?因為使用者和登入的密碼都要在指令打感覺有點......怪

另外有趣的是,如果用上一段的方式開啟dropbear的話,不管你的帳號是誰,只要密碼符合,都登得進去....= =

我想這還需要時間去改

沒有留言:

張貼留言