演講:Android 應用程式逆向工程提示
七月 23 日 (週六),小弟將應 HIT (Hacks In Taiwan) Conference 2011 大會的邀請,出席並給予主題為「Android 應用程式逆向工程提示」的演講,詳情可參考 [
議程表]。逆向工程一向是許多開發者或黑客所熱衷的主題,在 Android 異軍突起於智慧型手機、平板電腦裝置,甚至智慧電視的今日,自然就是個值得研究的方向。本議程嘗試分析現有 Android 系統架構以及提供應用程式執行環境的 Dalvik 虛擬機器,並透過若干可公開取得的工具,對 Android 應用程式作逆向工程,涵蓋從動態追蹤、反組譯、反編譯,到修改與施加保護等實務。
不同於 Mahmud ab Rahman 的主題〈Reversing Android Malware〉,小弟不會探討 Android 上慢慢浮現出來的惡意程式,也不會探討其影響,而是著重於逆向工程的原理與技巧本身,出發點是善意的,至少有助於提昇工程能力的培養。命名「提示」,就是強調這是一系列的方法與模式,並沒有預設立場要進行怎樣的行為,當然也衷心希望,這個議程分享,對與會者能有些啟發。期待您的指教,謝謝!
由 jserv 發表於
12:23 AM
|
迴響 (0)
演講:Android 系統最佳化的迷思
七月 8 日 (週五) 將應臺北科技大學的邀請,在行動終端應用技術與趨勢研討會探討「Android 系統最佳化的迷思」的議題,相關議程資訊可參考 [
行事曆]。在這個議程中,我將簡要歸納兩年多來在 Android 系統層面的經驗,最早可溯及 2008 年底,開始在 Andes CPU 移植 Android,隨後就是在 [
0xlab] 接觸多種不同的 SoC 與多樣的裝置,而,不同於過往探討如何改善系統的效能,議程將點出若干「最佳化」的迷思,特別在 Android 平台上,還得考慮到非技術的商業因素。
議程暫定的提綱有:
- 從主流 CPU 架構與 SoC 平台的「亮點」,看 Android 的支援程度
- 最佳化 -- 另一個無法證明程度的詞彙,以及 Android 上面美麗的錯誤
- 由發展軌跡看 Android 的變革:2D, GPU, RenderScript, SMP, 眾多的 VM
- 破除迷思後的開發策略
另外,近期也將陸續發表 Android 系統層面的文件與實驗數據,希望有助於參考,期待您的指教,謝謝!
由 jserv 發表於
11:47 PM
|
迴響 (0)
小技巧:#include "/dev/stdin"
Susam Pal 有篇短文 [
Compiler taking input while compiling] 提到一個非常有趣的技巧,就是在 C 語言程式中去 #include "/dev/stdin" (UNIX) 或 #include "CON" (Windows),這樣就能在編譯時期,接受標準輸入作為新增的程式碼。那麼,實際的應用呢?筆者想到一種應用型態,試想,有許多成功的 open source 專案長年累積眾多開發者或貢獻者,會期望在 UI 顯示這些份清單,可能的作法有兩個:
- 讀取某個文件檔,如 AUTHORS
- 透過 Makefile 的修改,在編譯時期指定 -DAUTHOR_LIST="..." 之類的編譯參數
前者看來很有彈性,但可能小題大作了,不過只是字串,有必要因此開檔嗎?又,萬一多個版本共存於同一個環境,該怎麼辦呢?後者麻煩了一些,但絕對會運作,但這又額外的風險,因為我們不確定這份清單到底有多長、shell 是否能處理過長的字串。更麻煩的是,因為是編譯參數的修改,make 無法清楚得知確切的編譯時間變動,無法確保最終的字串輸出,因為即使將 'AUTHORS' 一類的檔案放入 Makefile target 的相依清單中,還是有可能面臨產生 C-style string 的方式改變而未能同步。
套用前述的技巧,則可簡潔的克服這樣的問題。以下是示範的程式碼 (list_authors.c)
#include <stdio.h>
int main() {
puts(
#include "/dev/stdin"
);
return 0;
}
假設貢獻者清單放在 ../AUTHORS 這個檔案中,那我們撰寫以下 Makefile:
all:
@awk '/@/{print " \"" $$_ "\\n\"" }' ../AUTHORS | \
gcc -o list_authors list_authors.c
./list_authors
嘗試去編譯並執行看看,以 [
libchewing] 為例:(忽略後方的 email)
./list_authors
Lu-chuan Kung
Kang-pen Chen
Jim Huang
Kan-Ru Chen
Yun-Ta Tsai
Kang-min Liu
Weizhong Yang
Kuang-che Wu
Shiva Huang
Jeff Chen
Hong Jen Yee (PCMan)
James Huang (Sea Monster)
Tiberius Teng
Andy Horng
Caius Chance
Ding-Yi Chen
簡單來說,就是把 awk 處理過的 C 字串透過 stdout,提供給需要 stdin 的 GCC,當我們編譯 list_authors.c 時,而且能確保每次編譯時,都提供最新的清單與格式 (我們當然希望這份列表能越來越長,期待更多熱血朋友的參與)。另一個潛在的好處是,目前的工作目錄中,不需要保有中間檔案,就可避免有人不慎將其放入版本控制系統中,這點非常重要,因為仍有部份版本控制系統無法有效偵測或排除新增檔案。
其他可能的應用:
- 內嵌 firmware 的 WLAN driver: 以 Broadcom WLAN driver 來說,原本得提供一份 firmware (可動態載入) 或另一份展開為 C header file 的 firmware 形式,現在經由 build system 的修改,只要提供一份 firmware 即可
- 編譯時期儘量包含 build host 的資訊: 不同於 Microsoft Visual Studio 系列,gcc 預設僅會將少數的資訊放入執行檔,但有時候我們會希望在 debug build 多包含一些資訊,特別是有助於 QA 分析使用
UNIX 的哲學之一: "Everything is file",再次獲得有趣的應用。
由 jserv 發表於
3:31 AM
|
迴響 (0)