Wednesday, May 18, 2016

Android 应用签名提权方法

轉自:
http://hubeihuyanwei.blog.163.com/blog/static/28205284201321432453596/


使用android自带的签名工具signapk.jar 以及源码中的platform.x509.pem,platform.pk8 对apk进行重新签名。

   执行:java -jar signapk.jar  platform.x509.pem platform.pk8 old.apk new.apk 执行后new.apk即为签名后的文件。

   (注:执行命令时所有文件这里放在同一目录下,如果不在同一目录请修改路径)。

  文件platform.x509.pem和platform.pk8我们可以在源码的 build/target/product/security中找到。signapk.jar 可以编译build/tools/signapk/ 得到。

5.签名后就可以安装使用了

====================
platform.x509.pem和platform.pk8的用处

很多网友可能需要访问一些系统敏感的设置信息,如果没有Root权限如何解决呢? platform.x509.pem和platform.pk8可以让你获得系统权限,Android在系统账户安全中使用了Linux的ACL控制方式,通过在每个App中使用sharedUserId设置即可共享系统账户权限,比如android:sharedUserId="android.uid.system" 这样就是用了system这个uid了。

  platform.x509.pem和platform.pk8我们可以在platform/build/target/product/security中找到,如果你的固件使用的Android官方标准的key编译的,可以通过signapk.jar来使用这个系统key/cer来签名的你的apk。使用方法比较简单java -jar SignApk.jar platform.x509.pem platform.pk8 cwj.apk cwj_signed.apk 这行就代表,将cwj.apk签名,签名后的cwj_signed.apk就是拥有系统权限的apk了。如果网友找不到signapk.jar,Android123提示大家可以在/platform/build/tools/signapk/下编译即可。

  当然Android开发网提示如果部分开发者在编译系统时使用的并非GIT源码中的platform.x509.pem platform.pk8可能造成在该目标固件中无法正确安装,当然了这两个文件就是我们普通的key/cert而已,只是作为平台名称有些改变。


Tuesday, May 17, 2016

人生之不知所云

生命是很奇妙的東西
逆境與夢想都是有時都是生命的一部份
知道自己的夢與自己在此刻的角色
那麼便算是不虛此生了吧~~
---
如果發現人生的短暫
  就愈要使它更有深度
更加充實!

[debug] rr 全名是 record and replay

以下轉自:
https://m.facebook.com/story.php?story_fbid=10204658121093179&id=1840131181

今天突然想到我似乎沒發文推廣過 rr 這個神級的 debug 工具(又稱軟體工程師的時光機),這麼好用的東西不能只有我知道
rr 全名是 record and replay,只要你的程式跑在 Linux 上,可以用 gdb debug(例如 C/C++/Rust 寫的程式),都可以用 rr 把程式的執行結果錄下來,再反覆的用 rr 重播,並用 gdb debug。這能完全改寫你除錯程式的經驗,它有以下特色:
1. 在這個 record 中,記憶體位址是不變的,所以可以反覆用 gdb 去看程式資料的變化。你也不必怕 gdb 當掉,毀掉你辛苦重製的環境,而你在筆記本記的 memory address 都泡湯)
2. 因為你在 debug 錄下來的程式執行過程,所以你甚至可以「倒著」執行程式。 一般 gdb 的必用的指令如 step、continue,rr 都提供了的反向版的 reverse-step、reverse-continue。
以常見的 debug null pointer crash 為例,通常都是某個物件被某個不知道在哪的函式 F 放掉了,但你執行到程式 crash 時,不知名的 F 不知道在 crash 前多早就執行了。如果這個 crash 很難重製,程式又不是你寫的,你就只能慢慢熟悉程式,印 log,找出可以穩定重製的步驟…然後自求多福(超花時間)。
如果用了 rr,你就只要重製出 crash 一次,再 replay。等到程式 crash,設定個 watch point 在被設成 null 的變數,下 reverse-continue 倒著執行程式回去。馬上抓到兇手!多的時間就可以開始研究程式的邏輯了。
rr 在我 debug Firefox 這麼複雜的程式時真的幫我很多忙,一堆 ref-counted 的物件加上 event 飛來飛去,程式邏輯真的不會照你想的運作。
如果你開發的程式在 Linux 上,不妨試試。如果有老師在教學生用 gdb,也不妨也告訴學生有 rr 這個工具,讓學生的程式生涯輕鬆一點。

rr網站:
http://rr-project.org/

MQTT(一)簡介

轉自:
http://blog.maxkit.com.tw/2014/01/mqtt.html


前言

會知道MQTT協定,要先回憶起兩年前,當初想找找Android的Push Notification的解決方案,先是找到了當時GCM的前身C2DM,以為Google已經提供了此服務,測試了一下code也蠻容易上手的,結果發現到他有quota限制,不適合拿來當成產品,因此就放棄它,改找別的解決方案,最後找到了兩種不同的實作方式,一種透過XMPP協定來完成,另一種也就是今天要提到的,透過MQTT來完成。

所以MQTT是什麼?

MQTT的全名為 Message Queuing Telemetry Transport,為IBM和Eurotech共同製定出來的protocol,在MQTT的官網可以看到一開始它對MQTT的介紹:
MQTT is a machine-to-machine (M2M)/"Internet of Things" connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport.
簡單來說,它是為了物聯網而設計的protocol,並且它是透過publish/subscribe的方式來做訊息傳送。由於是為了物聯網而設計的協定,因此它所需要的網路頻寬是很低的,而所需要的硬體資源也是低的。

Publish/Subscribe:

在看MQTT之前,最好要先知道Publish/Subscribe的訊息傳送機制為何,這樣之後在看其協定時,才會更快上手。Publish/Subscribe有三種主要的組成元件,分別為Publisher、Subscriber以及Topic。

Publisher為訊息的來源,它會將訊息發送給Topic,而Subscriber向Topic註冊,表示他們想要接收此Topic的訊息;因此當有某個Publisher對Topic發送訊息時,只要是有對此Topic註冊的Subscriber,都會收到此則訊息。
它們的關係如下圖:


MQTT特性:

了解了Publish/Subscribe的機制之後,讓我們來看看MQTT有哪些特性:
  1. Publish/Subscribe的訊息傳送模式,來提供一對多的訊息分配。
  2. 使用TCP/IP來提供基本的網路連結。
  3. 三種訊息傳送服務的qualities:
    • "At most once",最多一次,訊息遺失或是重複發送的狀況可能會發生;這種quality適合應用在環境感測,不在意資料是否會遺失,因為下一次的資料取樣很快就會被published出來。
    • "At least once",至少一次,這種quality保證訊息會送達,只是可能會發生重複發送訊息的狀況。
    • "Exactly once",確定一次,確認訊息只會送到一次。這種quality適合用在計費系統,系統只要有重複收到資料、或是資料遺失狀況發生,就會造成系統錯誤。
  4. 由於他的header固定長度為2byte,因此可以減少封包傳送時的額外負載,並減少所需的網路頻寬。
  5. 當異常斷線發生時,會使用最後遺囑(Last Will and Testament)的機制,通知各個感興趣的client。

MQTT現況:

MQTT現階段並不是一個標準化的Protocol,還在持續改進中,目前為MQTT V3.1。不過IBM已於2013年已經將它交給OASIS進行標準化了,並且一直以來IBM對此協定採開放、免授權費的方式讓它能夠被散佈,因此相信不久的將來會成為一個主流的Protocol。

而目前支援MQTT的Client API,有Eclipse Phno Project有對MQTT client支援,其支援C、Java、Javascript、C++等等的語言,可說是支援度很高的Project。而目已經在應用MQTT的,最知名的應該就是Facebook Message App了吧,可以參考此篇文章文章

小結:

上面提到的,低頻寬、低硬體需求的特性,訊息傳遞為Publish/Subscribe的方式,正好可以用來實現Push Notification的機制,並且能達到手持裝置省電的需求,接下來會先從其Protocol開始了解,並用Client Api跑些範例來應用此Protocol。

參考:

MQTT v3.1 specification

Introducing AWS IoT

Introducing AWS IoT:
https://www.youtube.com/watch?v=N3-Az0OH5WM