雖然試過了 smali/baksmali ,
但如何換掉 .dex 裡的 opcode ,還是沒有什麼頭緒。
看了猛男 SITOS 的教學,
總算知道我們應該是先用原版的 baksmali 把 .dex 轉成 .smali 檔,
再用修改過的 smali 來把 .smali 編回 .dex 檔,只是在編的時候要把 "move" 編成 0x73 。
要怎麼修改 smali 呢?
想像中,應該是有個對照表,把 "move" 這個 instruction 對應到 0x01 ,
把這個對照表改一改,讓它對應到 0x73 就好了。
但是這個對照表在哪裡呢?找了半天都沒找到,還是得回去看 SITOS 的教學,
才發現是在 external/smali/dexlib/src/main/java/org/jf/dexlib/Code/Opcode.java 裡,
我想我一輩子都找不到吧。
改完之後,再 build 一次 smali ,
編一下 Foo.smali 之後,跑出 out.dex ,
再跑一跑 Dalvik ,的確跑出了一樣的結果,
但實在不知道怎麼驗證我真的有跑到 0x73 這個 opcode ,
其實有種說不出的空虛感。
2014年3月17日 星期一
看看 smali 和 baksmali 在幹嘛!!!!!
因為在寫作業二,所以想要把 .dex 檔給 decompile 和 compile 。
看一下人家的網誌,發現有好多工具可以選擇,
其中 dexdump 好像是最陽春的一個工具,
而看了大家的討論,好像 smali/baksmali 是最熱門的一個選項,
所以這次就來先用用看它。
其中 baksmali 是反組譯的,我們就來試試看,
在 build 完之後,直接執行 baksmali Foo.dex ,
果然跑出一個叫做 out 的資料夾,裡面有個 Foo.smali 的檔案,
打開來看看,是一個滿詭異的組語檔案,
我想這樣應該就是成功了吧。
接著就是把 Foo.smali 再轉回 .dex 檔,
為了確定我們真的有轉到,可以改一下 Foo.smali 的一些數字再轉,
簡單地執行一下 smali Foo.smali ,真的跑出一個 out.dex 。
再用 Dalvik 跑一下,真的跑出改過數字的版本了,
太感人了。
看一下人家的網誌,發現有好多工具可以選擇,
其中 dexdump 好像是最陽春的一個工具,
而看了大家的討論,好像 smali/baksmali 是最熱門的一個選項,
所以這次就來先用用看它。
其中 baksmali 是反組譯的,我們就來試試看,
在 build 完之後,直接執行 baksmali Foo.dex ,
果然跑出一個叫做 out 的資料夾,裡面有個 Foo.smali 的檔案,
打開來看看,是一個滿詭異的組語檔案,
我想這樣應該就是成功了吧。
接著就是把 Foo.smali 再轉回 .dex 檔,
為了確定我們真的有轉到,可以改一下 Foo.smali 的一些數字再轉,
簡單地執行一下 smali Foo.smali ,真的跑出一個 out.dex 。
再用 Dalvik 跑一下,真的跑出改過數字的版本了,
太感人了。
2014年3月13日 星期四
在 Dalvik 裡加上一個 opcode 看看!!!!
作業二的第一步,就是要在現在的 Dalvik 裡加上一個新的 opcode ,
聽起來困難得誇張,其實因為 Dalvik 很有遠見,早就準備好未來會想要新增 opcode 了,
所以其實只是在走別人鋪好的路,算是簡單。
不過簡單歸簡單,沒有這篇教學的話,我也不會做。
首先,要新增 opcode 的定義。
先 cd 到 dalvik/opcode-gen 裡,有個 bytecode.txt ,
看起來好像只是個普通的純文字檔,沒想到就是定義所有 opcode 的地方。
作業的要求是要我們用 unused 的 73 來複製 move 的功能,
就在 bytecode.txt 加上這個 move73 之後,就跑一下裡面 regen-all 這個 shell script 來更新。
讓我不解的是,到底 73 為什麼會是 unused 呢?明明 72 和 74 都有用呀?
這個 73 是什麼神秘的數字呢?
新增完定義之後,就到 dalvik/vm/mterp 裡,要把這個 move73 的實作弄出來。
說是實作,其實也就是把原本的 move 複製一份而已。
要複製 C++ 的部份,還有 ARM 、 MIPS 、 x86 這些 architecture 的組語。
最後再跑一下 rebuild.sh 來 compile 它們。
有點不懂的部份是, rebuild 時要設 TARGET_ARCH=portable 這個變數,
不大懂這個 portable 是什麼意思。
然後到 dalvik/vm/analysis 裡,其實我有點搞不清楚這裡要幹嘛,
反正就也是把程式修改成說 move73 要做的事和 move 是一樣的。
最後一步,回到 project 的 root 來個絕地大 make ,
只是這裡要加一些 argument ,
什麼 WITH_HOST_DALVIK=true 啦,什麼 WITH_JIT=false 啦,
後面還有個附註說可能還要加 -B ,實在不知道這些具體上在幹嘛,不加又會怎麼樣…
在教學的結尾時,要我們看一下 git status 的樣子,
一看發現超怪,一大堆我明明沒動的檔案也都被標成 modified 了,
比方說 libdex/DexOpcodes.cpp ,它自己就把 "unused-73" 改成 "move73" 了,
這樣看起來,它們都是自動生成的檔案,
那就不應該放進 git 的 repo 呀,非常奇怪。
這樣子好像是加好 opcode 了,
但是要怎麼測試呢?明天再說好了。
聽起來困難得誇張,其實因為 Dalvik 很有遠見,早就準備好未來會想要新增 opcode 了,
所以其實只是在走別人鋪好的路,算是簡單。
不過簡單歸簡單,沒有這篇教學的話,我也不會做。
首先,要新增 opcode 的定義。
先 cd 到 dalvik/opcode-gen 裡,有個 bytecode.txt ,
看起來好像只是個普通的純文字檔,沒想到就是定義所有 opcode 的地方。
作業的要求是要我們用 unused 的 73 來複製 move 的功能,
就在 bytecode.txt 加上這個 move73 之後,就跑一下裡面 regen-all 這個 shell script 來更新。
讓我不解的是,到底 73 為什麼會是 unused 呢?明明 72 和 74 都有用呀?
這個 73 是什麼神秘的數字呢?
新增完定義之後,就到 dalvik/vm/mterp 裡,要把這個 move73 的實作弄出來。
說是實作,其實也就是把原本的 move 複製一份而已。
要複製 C++ 的部份,還有 ARM 、 MIPS 、 x86 這些 architecture 的組語。
最後再跑一下 rebuild.sh 來 compile 它們。
有點不懂的部份是, rebuild 時要設 TARGET_ARCH=portable 這個變數,
不大懂這個 portable 是什麼意思。
然後到 dalvik/vm/analysis 裡,其實我有點搞不清楚這裡要幹嘛,
反正就也是把程式修改成說 move73 要做的事和 move 是一樣的。
最後一步,回到 project 的 root 來個絕地大 make ,
只是這裡要加一些 argument ,
什麼 WITH_HOST_DALVIK=true 啦,什麼 WITH_JIT=false 啦,
後面還有個附註說可能還要加 -B ,實在不知道這些具體上在幹嘛,不加又會怎麼樣…
在教學的結尾時,要我們看一下 git status 的樣子,
一看發現超怪,一大堆我明明沒動的檔案也都被標成 modified 了,
比方說 libdex/DexOpcodes.cpp ,它自己就把 "unused-73" 改成 "move73" 了,
這樣看起來,它們都是自動生成的檔案,
那就不應該放進 git 的 repo 呀,非常奇怪。
這樣子好像是加好 opcode 了,
但是要怎麼測試呢?明天再說好了。
2014年3月12日 星期三
讓 Dalvik VM 跑起來!!!
第二個作業是要我們新增 Dalvik 的 opcode ,
還有寫一些轉換的東西,最後好像還要去改 Dalvik 的 code 。
說實在的,我完全不知道 Dalvik 是個什麼玩意兒,
還要去改它,簡直是天方夜譚,
只有一個模糊的概念,它好像是一台 virtual machine 吧…?
既然是一台 VM ,那在做任何事情之前,至少應該先跑跑看它再說,
找到了課程提供的教學,發現要跑它還真麻煩,
要設好環境變數,要創幾個資料夾,真正執行的時候還要加上超長的 argument ,
在教學裡面,乾脆把這些東西寫成一個 shell script 檔,
要執行 Dalvik 的時候就只要跑它就行了。
在 Java VM 可以執行 .jar 檔,在 Dalvik 我們要執行的是 .dex 檔,
下載一下教學裡面的 Foo1.dex ,再用剛剛的 script 跑了一跑,
果然跑出一堆四則運算出來,算是跑成功了吧。
回頭看了一下教學的 title ,是 "Host Dalvik" ,
代表是跑在 host ,也就是電腦上的 Dalvik ,
這個 dalvikvm 執行檔,是放在 out/host/linux-x86/bin 裡。
這麼說起來,應該也要有 target ,也就是手機裡的 Dalvik 啦,
找了一下,果然在 out/target/product/generic/system/bin 裡就發現另一台 dalvikvm 了。
用 file 這個指令來檢查一下,這台 host 的 Dalvik 是跑在 Intel 80386 的,
而 target 的 Dalvik 是跑在 ARM 上的,
真厲害。
還有寫一些轉換的東西,最後好像還要去改 Dalvik 的 code 。
說實在的,我完全不知道 Dalvik 是個什麼玩意兒,
還要去改它,簡直是天方夜譚,
只有一個模糊的概念,它好像是一台 virtual machine 吧…?
既然是一台 VM ,那在做任何事情之前,至少應該先跑跑看它再說,
找到了課程提供的教學,發現要跑它還真麻煩,
要設好環境變數,要創幾個資料夾,真正執行的時候還要加上超長的 argument ,
在教學裡面,乾脆把這些東西寫成一個 shell script 檔,
要執行 Dalvik 的時候就只要跑它就行了。
在 Java VM 可以執行 .jar 檔,在 Dalvik 我們要執行的是 .dex 檔,
下載一下教學裡面的 Foo1.dex ,再用剛剛的 script 跑了一跑,
果然跑出一堆四則運算出來,算是跑成功了吧。
回頭看了一下教學的 title ,是 "Host Dalvik" ,
代表是跑在 host ,也就是電腦上的 Dalvik ,
這個 dalvikvm 執行檔,是放在 out/host/linux-x86/bin 裡。
這麼說起來,應該也要有 target ,也就是手機裡的 Dalvik 啦,
找了一下,果然在 out/target/product/generic/system/bin 裡就發現另一台 dalvikvm 了。
用 file 這個指令來檢查一下,這台 host 的 Dalvik 是跑在 Intel 80386 的,
而 target 的 Dalvik 是跑在 ARM 上的,
真厲害。
2014年3月7日 星期五
繼續寫作業一!!!
要做的事情,就是讓手機一開機,就會自動執行那個 NTU Android Homework 。
先研究一下大家都怎麼開機自動執行的,
就查到了這個東西,發現其實還滿迂迴的,
據說開機的時候,手機會發出一個廣播的訊號說 "我開好機囉" ,
然後我們要想辦法聽到這個訊號,在聽到之後就把自己打開就好了。
第一件事情,就是要先取得 "聽得見開機廣播" 的權限,
講到權限就要看一下 AndroidManifest.xml ,
一打開就發現裡面本來就有 WRITE_EXTERNAL_STORAGE 的權限了,
所以當然可以寫進 SD card 啊,我真有夠腦殘…
放下沮喪的情緒,趕快加上 RECEIVE_BOOT_COMPLETED 這個權限。
得到權限之後還不夠,還要幫它寫一個 class ,
說我們聽到廣播之後要自動打開 app 。
這個 class 似乎自己寫成一個 java 檔比較方便,不要寫成原本 activity 裡的 inner class ,
如果真的要寫的話,好像可以參考看看這個,
不過作業的 deadline 快到了,還是有空再試吧。
最後,回到 AndroidManifest.xml 裡,還要幫這個 class 註明說它是一個 receiver ,
這樣子才收得到廣播。
這樣子一來,應該就可以在開機的時候自動打開 app 了!!!
先研究一下大家都怎麼開機自動執行的,
就查到了這個東西,發現其實還滿迂迴的,
據說開機的時候,手機會發出一個廣播的訊號說 "我開好機囉" ,
然後我們要想辦法聽到這個訊號,在聽到之後就把自己打開就好了。
第一件事情,就是要先取得 "聽得見開機廣播" 的權限,
講到權限就要看一下 AndroidManifest.xml ,
一打開就發現裡面本來就有 WRITE_EXTERNAL_STORAGE 的權限了,
所以當然可以寫進 SD card 啊,我真有夠腦殘…
放下沮喪的情緒,趕快加上 RECEIVE_BOOT_COMPLETED 這個權限。
得到權限之後還不夠,還要幫它寫一個 class ,
說我們聽到廣播之後要自動打開 app 。
這個 class 似乎自己寫成一個 java 檔比較方便,不要寫成原本 activity 裡的 inner class ,
如果真的要寫的話,好像可以參考看看這個,
不過作業的 deadline 快到了,還是有空再試吧。
最後,回到 AndroidManifest.xml 裡,還要幫這個 class 註明說它是一個 receiver ,
這樣子才收得到廣播。
這樣子一來,應該就可以在開機的時候自動打開 app 了!!!
2014年2月25日 星期二
準備拿授權碼!!!!
取得這門課授權碼的條件很簡單,
助教寫了一個小 app 給我們,也就是那個 NTU Android Homework ,
只要能夠改一下,讓這個 app 可以寫檔案到 SD card 就好了。
首先,用 adb shell 進去看看,
不由分說地先試試看 touch /sdcard/foo ,
果然 touch 不到,摸都摸不著。
不死心,繼續留在 adb shell 裡用 ls 檢查 /sdcard 這個東西,
發現它是一個 symbolic link ,連向 /storage/sdcard ,
它的權限是 drwx------ ,這樣除了 root 以外都沒辦法在裡面寫檔案呀,
於是就打了 chmod 777 /storage/sdcard ,
沒想到居然出現 "Unable to chmod /storage/sdcard: Read-only file system" 。
看了課程網之後,發現原來要先用 mksdcard 造出一塊 SD card 才對,
但這個 mksdcard 還沒 compile 好,只好先到 sdk/emulator/mksdcard 去 mm 一下。
順利 compile 出 mksdcard 之後,就可以造出一塊 sdcard.img 了,
因為我不知道該把它放在哪兒比較好,所以就先放在 project 的根目錄吧。
接著把 emulator 重新開機,只是這次開的時候要加一個 -sdcard sdcard.img 的參數。
用 adb shell 進去之後,果然可以在 /sdcard 裡 touch 了,愛怎麼摸就怎麼摸。
接著到 NTU Android Homework 這個 app 裡加上寫檔案的 function ,
就成功寫進去了!!
讓我有點困惑的是,有些人說還要去增加 "WRITE_EXTERNAL_STORAGE" 的權限,
我記得以前寫 app 時的確也是需要,
但現在怎麼不用了呢?是哪裡出問題了嗎?
不管了,先去拿授權碼再說吧XD
助教寫了一個小 app 給我們,也就是那個 NTU Android Homework ,
只要能夠改一下,讓這個 app 可以寫檔案到 SD card 就好了。
首先,用 adb shell 進去看看,
不由分說地先試試看 touch /sdcard/foo ,
果然 touch 不到,摸都摸不著。
不死心,繼續留在 adb shell 裡用 ls 檢查 /sdcard 這個東西,
發現它是一個 symbolic link ,連向 /storage/sdcard ,
它的權限是 drwx------ ,這樣除了 root 以外都沒辦法在裡面寫檔案呀,
於是就打了 chmod 777 /storage/sdcard ,
沒想到居然出現 "Unable to chmod /storage/sdcard: Read-only file system" 。
看了課程網之後,發現原來要先用 mksdcard 造出一塊 SD card 才對,
但這個 mksdcard 還沒 compile 好,只好先到 sdk/emulator/mksdcard 去 mm 一下。
順利 compile 出 mksdcard 之後,就可以造出一塊 sdcard.img 了,
因為我不知道該把它放在哪兒比較好,所以就先放在 project 的根目錄吧。
接著把 emulator 重新開機,只是這次開的時候要加一個 -sdcard sdcard.img 的參數。
用 adb shell 進去之後,果然可以在 /sdcard 裡 touch 了,愛怎麼摸就怎麼摸。
接著到 NTU Android Homework 這個 app 裡加上寫檔案的 function ,
就成功寫進去了!!
讓我有點困惑的是,有些人說還要去增加 "WRITE_EXTERNAL_STORAGE" 的權限,
我記得以前寫 app 時的確也是需要,
但現在怎麼不用了呢?是哪裡出問題了嗎?
不管了,先去拿授權碼再說吧XD
2014年2月22日 星期六
和 VirtualBox 有衝突!!!!
因為我不喜歡 Wine ,但又需要電腦版的 LINE 來聯絡,
所以我一直有用 VirtualBox 裝一個 Windows XP 在電腦裡。
剛剛想要打開這個 Windows XP ,沒想到它壞了,
說要我跑個 /etc/init.d/vboxdrv setup 才行,
這問題好像在更新完 VirtualBox 之後常遇到,沒什麼,就跑一下嘛。
沒想到居然 /etc/init.d/vboxdrv 不見了!!
平常都在呀,今天跑到哪裡去了?
回想一下,在 compile 這個 android 的 project 時,
好像有瞄到它有動到我 VirtualBox 的東西,當時就有種不安全感,
果真出包了。
查了一下,看到有人有類似的問題,
但最佳解答看不懂,反而是票數最高的 Jason Zhu 救了我一命:
$ sudo dpkg-reconfigure virtualbox-dkms
$ sudo modprobe vboxdrv
這樣就好了, VirtualBox 打得開,而 emulator 也可以正常運作,
真是可喜可賀。
所以我一直有用 VirtualBox 裝一個 Windows XP 在電腦裡。
剛剛想要打開這個 Windows XP ,沒想到它壞了,
說要我跑個 /etc/init.d/vboxdrv setup 才行,
這問題好像在更新完 VirtualBox 之後常遇到,沒什麼,就跑一下嘛。
沒想到居然 /etc/init.d/vboxdrv 不見了!!
平常都在呀,今天跑到哪裡去了?
回想一下,在 compile 這個 android 的 project 時,
好像有瞄到它有動到我 VirtualBox 的東西,當時就有種不安全感,
果真出包了。
查了一下,看到有人有類似的問題,
但最佳解答看不懂,反而是票數最高的 Jason Zhu 救了我一命:
$ sudo dpkg-reconfigure virtualbox-dkms
$ sudo modprobe vboxdrv
這樣就好了, VirtualBox 打得開,而 emulator 也可以正常運作,
真是可喜可賀。
打不開 emulator 啦!!!
睡完回籠覺之後,再試著打開了 emulator ,
竟然就已經打不開了!!
出現了這樣的錯誤訊息:
emulator: ERROR: You did not specify a virtual device name, and the system
directory could not be found.
If you are an Android SDK user, please use '@<name>' or '-avd <name>'
to start a given virtual device (see -help-avd for details).
Otherwise, follow the instructions in -help-disk-images to start the emulator
竟然就已經打不開了!!
出現了這樣的錯誤訊息:
emulator: ERROR: You did not specify a virtual device name, and the system
directory could not be found.
If you are an Android SDK user, please use '@<name>' or '-avd <name>'
to start a given virtual device (see -help-avd for details).
Otherwise, follow the instructions in -help-disk-images to start the emulator
查了半天,大家都說要手動設定 ANDROID_PRODUCT_OUT 這個環境變數,
但我試了之後,發現這樣對我來說還不夠,還需要設定 ANDROID_BUILD_TOP 。
越想越奇怪,我早上明明就沒有打過這兩個變數啊,也可以用,
試了一下,原來只要重新打一次
$ . build/envsetup.sh
$ lunch aosp_arm-eng
就可以同時設定這兩個環境變數,然後跑 emulator 了。
不過話說回來, lunch 是個什麼東西呢?午餐嗎?
當時看了這個說明,感覺只是要選一個 target 來 build ,
所以我以為 lunch 只是一個在 make 前要做的動作,
沒想到後來啟動 emulator 前也要做,
希望以後能知道為什麼。
終於 compile 好了!!!!
睡前把它 compile 下去之後,想說早上醒來應該就好了,
沒想到半夜大地震,被震醒之後就睡不著了。
到了早上七點,很幸運地沒有出任何錯誤就 compile 完了,
很興奮地看看接下來要幹嘛,
發現要開 emulator ,順利開起來了一支手機,
然後開 adb 的 logcat ,也順利跑出一堆看不懂的 log ,
最後要開 ddms ,但找不到這個程式,不過就先算了。
比照一下課程網上的截圖,
發現我少了 CMStats 和 NTU Android Homework 這兩個 app ,
其中 NTU Android Homework 感覺是比較重要的XD
看了這裡的教學之後才知道,
原來它的 source 放在 packages/apps/DeviceStatus ,
而 compile 完的 .apk 檔在 out/target/product/generic/system/app 裡,
而且叫做 DeviceInfo.apk ,這樣取名誰知道啊!!!
不過也許這樣取名是有一些原因的吧。
打開 emulator 之後,
用 adb install DeviceInfo.apk 把它安裝起來,
果然有了 NTU Android Homework 了,真感動,
點開來是一些枯燥的系統資訊,真無聊。
有點想去睡個回籠覺了。
沒想到半夜大地震,被震醒之後就睡不著了。
到了早上七點,很幸運地沒有出任何錯誤就 compile 完了,
很興奮地看看接下來要幹嘛,
發現要開 emulator ,順利開起來了一支手機,
然後開 adb 的 logcat ,也順利跑出一堆看不懂的 log ,
最後要開 ddms ,但找不到這個程式,不過就先算了。
比照一下課程網上的截圖,
發現我少了 CMStats 和 NTU Android Homework 這兩個 app ,
其中 NTU Android Homework 感覺是比較重要的XD
看了這裡的教學之後才知道,
原來它的 source 放在 packages/apps/DeviceStatus ,
而 compile 完的 .apk 檔在 out/target/product/generic/system/app 裡,
而且叫做 DeviceInfo.apk ,這樣取名誰知道啊!!!
不過也許這樣取名是有一些原因的吧。
打開 emulator 之後,
用 adb install DeviceInfo.apk 把它安裝起來,
果然有了 NTU Android Homework 了,真感動,
點開來是一些枯燥的系統資訊,真無聊。
有點想去睡個回籠覺了。
2014年2月21日 星期五
要把手伸出去了!!!
今天下午巧遇綠豆,一不小心就受了誘惑,
就決定要修廖世偉老師的 " Android 虛擬機與編譯器" 了。
因為修課的基本要求是寫完部份的作業一,
晚上回家和綠豆要了課程網之後,
就一邊吃水餃,一邊看作業一要幹嘛。
一開始總是要研究怎麼設定環境和怎麼下載程式碼之類的,
有些事情有點不是很明白,
先記下來,以後再慢慢查資料:
就決定要修廖世偉老師的 " Android 虛擬機與編譯器" 了。
因為修課的基本要求是寫完部份的作業一,
晚上回家和綠豆要了課程網之後,
就一邊吃水餃,一邊看作業一要幹嘛。
一開始總是要研究怎麼設定環境和怎麼下載程式碼之類的,
有些事情有點不是很明白,
先記下來,以後再慢慢查資料:
- 為什麼不能用 OpenJDK ,而一定要用 Oracle 的 Java 呢?
- 為什麼我會需要用到 USB 呢?
- 為什麼 ccache 可以加快 compile 的速度呢?
- 為什麼我除了 Git 之外,還要用 Repo 呢?
像是 ccache 和 repo ,還有後面要 compile 前的 lunch ,
我最想要知道的事情是,
這些工具是只有 Android 的 project 在用,還是其他 project 也都在用啊?
目前我的問題差不多就這樣,
打到這裡我發現連 source 都還沒下載完…
我的網路還真是慢啊,這樣什麼時候才能開始 compile 呢?
訂閱:
文章 (Atom)