May 31, 2012

軟體創作達人暑期成長營與新酷音輸入法改進項目

由成功大學主辦的 2012 軟體創作達人暑期成長營,目標為藉由教師們之專業意見與業界人士的指導,使專案更加快速開發完成,亦讓學生更易克服理論與實作之落差,在某種程度上,學習了 Google Summer of Code 的精神 。此次有個值得一書的項目為增添「現有開放軟體專案改善與其他應用軟體」,由產業機構和開放社群遞交題目,並經在校學生登記,一同來實現,詳情可見 [專案題目],目前已開放註冊,歡迎有興趣的同學參與!

去年 [新酷音輸入法計畫] 申請過 Google Summer of Code,不過似乎當時只要是國際化相關的題目均未入選,而過去在論壇上討論過的題目,終於可在此次活動派上用場,以下三個項目已通過:
  • 在新酷音輸入法引擎支援多個字典的動態使用
  • 分離新酷音輸入法引擎之中字典的索引以及內容
  • 提供針對新酷音輸入法客製化鍵盤排列的機制
歡迎在校學生或者有興趣一同改良新酷音輸入法的朋友們,嘗試提出申請或者討論。真正的工作量其實會比字面上的規範還多,畢竟我們是實地去改善像是中文輸入法一類每天都會使用的軟體,總有許多細節或者新想法是需要被妥善實現,才能造就好用的軟體。

期待您的參與,歡迎將此訊息傳遞給更多朋友知曉,謝謝!
由 jserv 發表於 4:29 PM | 迴響 (0)

May 30, 2012

演講:Implement Checkpointing for Android (FreedomHEC)

本月份,睽違多年未舉辦的 [FreedomHEC] 即將再次登場。[0xlab] 的 kito 與我將會此盛會發表新的開發成果。Freedom 硬體工程師研討會 (Freedom Hardware Engineer Conference, FreedomHEC) 是由國內 Open Source 開發人員與國外 Linux Kernel 社群開發者所合作籌畫的有關 Open Source 系統的硬體研討會。從中您將了解到讓硬體相容於開放原始碼的 Linux 作業系統有多容易。

透過 [FreedomHEC],硬體廠商可與國內外的 Linux 專家進行交流,從而協助其以非常低的成本開發出 Linux 驅動程式,讓硬體廠商可以主宰自己硬體的命運, 將硬體銷售到 Linux 市場;並且,國內廠商的 Linux 工程師亦可以藉此機會與國際 Linux 資深 Kernel 開發者交流,學習如何參與 Linux Kernel 社群,同時也可讓台灣廠商在 Linux Kernel 社群的協助下,順利開發出驅動程式並整合至上游 Linux 系統中,使台灣的產品得到即時的 Linux 支援。

[FreedomHEC] Taipei 2012 將於 6/12 (二) 至 6/13 (三) 在國科會科技大樓舉行,歷屆的 FreedomHEC Taipei 皆邀請來自世界各地的 Linux Kernel 開發者分享技術開發心得與經驗,同時介紹 Linux Kernel 現況以及如何與 Linux Kernel 社群合作。今年 FreedomHEC Taipei 2012 比較特別的主題是 Matthew Garrett 會談到 UEFI Secure Boot 對開源碼作業系統的重大影響,來自日本 Renesas 公司的 Hisao Munakata 則會介紹 Linux Foundation 所提出,由 NEC、Sony、Panasonic、Qualcomm、Toshiba、Renesas 及 Samsung 等大廠所支持,對消費者電子產業有相當影響的 Long Term Support Initiative (LTSI) 計畫,LTSI 計畫維護一個可提供長期支援修正的 Linux Kernel 版本。

kito 與我會討論 "Implement Checkpointing for Android to speed up boot time and development process" 這個題材,我們的著眼點為,將 cluster 系統行之有年的 checkpoint 技術移植到 Android 裝置中,這樣一來,不僅能縮減開機時間,還能作到在產品出貨後 (試產與樣品階段),全面地追蹤技術問題。此舉對於 Android 開發的優點有:
  • Restart/resume to stored snapshot for faster device boot time
  • Better product field trial experience due to regular snapshot
  • Deploy problematic snapshot for engineering analysis and debugging transparently
  • Q&A stress test purpose
在這個議程中,我們將探討如何調整現有的 checkpoint 實作,並針對 Android 系統的特性,提出完全 userspace 的新機制,涵蓋 Binder IPC, Ashmem, Logger 等一系列的支援,此外,我們的實作也採取有彈性的授權模式,屆時將在 Android 4.0 平台作技術展示與公佈開發細節,期待您的指教,謝謝!
由 jserv 發表於 3:06 PM | 迴響 (0)

May 29, 2012

演講:打造類似 Arduino 的開發環境 (MOSUT)

今年我做了生活方式的調整,之後在南部與若干 open source 的同好,搞了一個每兩週一次的例行性小型聚會 [MOSUT],取自 "Meeting of Open Source Users in Tainan" 之意, 初步想法大致為:
  • 南台灣的 open source 同好聚會
  • 提供大學院校、公司團體,以及個人作技術討論交流的機會
  • 使用或改善現有的軟體專案
  • 增加與北部地區的社群互動
我們進行的方式為,每次聚會先安排特定主題的心得分享,然後由成員作討論並相互認識。南部較少科技類別的聚會,但不表示就沒有相關的需求。事實上,無論是生根於南部的中小企業公司行號或者學校機構,對資訊技術的需求都非常多元,從資料庫系統、驅動程式開發、自動控制,到網路應用程式都有。個人對 [MOSUT] 沒有太高的期待,只希望能因此多認識南部的同好,期待大家的參與及討論。

在 6 月 2 日下午,我將會以「打造類似 Arduino 的開發環境」為題,跟參加 [MOSUT] 聚會的朋友分享以一位工程師的角度,嘗試延伸 [Arduino] 的想法,用若干微處理器打造簡易的平台,並製作一些有趣的應用,比方說步行機器人。這些成果陸續從最核心的部份,慢慢擴展到之上的應用,希望能建立一個類似 [Arduino] 的開發環境。關於該活動的資訊,請參見 [報名網頁],地點在國立臺南大學。

Arduino 是個採用開放授權釋出的互動開發平台,包含一塊擁有簡單輸入、輸出 (I/O) 的開放原始碼電路板, 以及實作 Processing 語言,使得眾多初學者經過短暫的學習後, 就能開始製造互動裝置。也因此,許多設計師及藝術家們,藉由 Arduino 很快習得電子和感測器的基本知識,以相對極小的開銷,就能製作設計作品的原型。而我關注的地方在於,這是體驗一個具體而微系統開發的好機會,能夠從硬體、底層軟體系統,到上層應用都徹底掌握。資訊技術的提出,無非就是解決人類面臨的問題,並且運用有限的資源,給人類帶來福祉,倘若學習資訊技術,只是一味追逐新標的,卻忘了自己能藉由豐富資源而手工打造出有趣的專案,該有多可惜呢?我預計將在今年九月份,於國立成功大學資訊工程系開一堂系統實做課程,讓學生體會到「雙手萬能」的可貴,藉由改良系統軟體,開發出小而美的嵌入式系統雛型出來,這也是啟蒙於 Arduino 的影響。

對南部的 open source 技術交流有興趣的朋友,歡迎經由 [MOSUT] 的討論區作進一步的交流與分享:[Google Groups: Meeting of Open Source Users in Tainan]。
由 jserv 發表於 2:24 PM | 迴響 (0)

May 12, 2012

在 Python 中執行 shellcode

其實這不是什麼新技巧,只是剛好最近研究 [PyPy],思考到若干低階處理的細節,就順道把這個在 Python 中執行 shellcode 的技巧分享出來,本文的實驗平台為 GNU/Linux x86/32-bit,採用 CPython 2.7.3,目的為實踐前文 [SM 版 Hello World] 中具備自我修改能力的程式 (self-modifying code)。

借助 [ctypes] 套件,我們很容易就能打造以下骨幹程式碼:
from ctypes import *

libc = CDLL('libc.so.6')
mprotect = libc.mprotect
getpagesize = libc.getpagesize

codes = (c_ubyte * 32)(
    # (omitted) machine code
)
p = addressof(codes) & ~(getpagesize() - 1)
mprotect(p, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC)
my_func = CFUNCTYPE(c_int, c_int, c_int)(addressof(codes))
在此,我們呼叫了 POSIX mprotect(),使得目標機械碼所在的 page 標注為可讀 + 可寫 + 可執行。接著,就來填補上方機械碼即可。以簡單的 C 語言加法處理函式為例,觀察其機械碼:
$ echo "int add(int a, int b) { return a + b; }" > add.c
$ gcc -Os -c add.c
$ objdump -d add.o
其中 .text 為:
00000000 <add>:
   0:	55                   	push   %ebp
   1:	89 e5                	mov    %esp,%ebp
   3:	8b 45 0c             	mov    0xc(%ebp),%eax
   6:	03 45 08             	add    0x8(%ebp),%eax
   9:	5d                   	pop    %ebp
   a:	c3                   	ret
只差臨門一腳了,以下是整合好的 Python 程式碼:(smc.py)
from ctypes import *

libc = CDLL('libc.so.6')
mprotect = libc.mprotect
getpagesize = libc.getpagesize

PROT_READ = 0x1
PROT_WRITE = 0x2
PROT_EXEC = 0x4

codes = (c_ubyte * 32)(
    0x55,		# push   %ebp
    0x89, 0xe5,		# mov    %esp,%ebp
    0x8b, 0x45, 0x0c,	# mov    0xc(%ebp),%eax
    0x8b, 0x55, 0x08,	# mov    0x8(%ebp),%edx
    0x01, 0xd0,		# add    %edx,%eax
    0x5d,		# pop    %ebp
    0xc3		# ret    
)

p = addressof(codes) & ~(getpagesize() - 1)
mprotect(p, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC)
add_func = CFUNCTYPE(c_int, c_int, c_int)(addressof(codes))

print "add(99, 1) = %d" % add_func(99, 1)
咱們來測試看看:
$ python smc.py 
add(99, 1) = 100
果然符合預期,呼叫了 add_func 所指向的 shellcode,得到 99 + 1 = 100 的執行結果。不過, 這雖然驗證了概念,但距離完整的 shellcode 還有些一段路要走,得借助於 [qsort 與 shellcode] 一文提到的技巧,並在 CPython 找到可銜接的部份。
由 jserv 發表於 10:32 PM | 迴響 (0)