2011年2月22日 星期二

在 iPhone 3G, iOS 4.2.1, JB 安裝 libgcc 和 iphone 2.0 Toolchain

沒想到 JB 後,從 Cydia 更新到最新時,對於手上這台 iPhone 3G 來說,有些軟體不會顯示出來或無法安裝,之前還被強者主管說怎可能沒有 XD 花點時間仔細看看,有一些好用的工具都需要 libgcc ,但是預設沒有 libgcc 可以安裝,查看一些資訊可能是因為 iOS 版本不同會產生一些問題,因此軟體清單被過濾掉了吧?!總之,就是要花點力氣弄一下,我的目標是安裝 iphone 2.0 Toolchain ,更仔細來說是使用 otool 這種東西。


解法,就在 Cydia 作者網站: http://apt.saurik.com/debs/,上頭有 libgcc_4.2-20080410-1-6_iphoneos-arm.deb,只要透過 wget 抓到 iPhone 上面安裝就行了



  1. 透過 Cydia 安裝 OpenSSH, 別忘了登入後要改一下 root 密碼,以免被盜用

  2. 透過 Cydia 安裝 wget

  3. 手動安裝 libgcc

    • # cd /tmp

    • # wget http://apt.saurik.com/debs/libgcc_4.2-20080410-1-6_iphoneos-arm.deb

    • # dpkg -i libgcc_4.2-20080410-1-6_iphoneos-arm.deb




如此一來就可以透過 Cydia 安裝 iPhone 2.0 Toolchain 囉!


提一下額外的,其實我是要用 otool 這個工具,此工具可以用來查看軟體到底用了哪些 framework 囉,藉以研究實作上的方向,例如以 iPhoneApp 這套軟體來看,可以先從 /User/Applications 裡頭看到一些序號目錄,想辦法找到 ooxx 這套軟體,並切換進去:


# cd /User/Applications/xxxxxxxxxxxxxxxxxxxxxx
# ls 
Documents  Librarys   iPhoneApp.app  iTunesArtwork  iTunesMetadata.plist tmp
# cd iPhoneApp.app
# ls -la iPhoneApp
# otool -L iPhoneApp
iPhoneApp:
        /System/Library/Frameworks/CoreGraphics.framework/CoreGraphics (compatibility version 64.0.0, current version 359.16.0)
        /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 678.60.0)
        /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)
        /System/Library/Frameworks/QuartzCore.framework/QuartzCore (compatibility version 1.2.0, current version 1.6.0)
        /System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration (compatibility version 1.0.0, current version 289.0.0)
        /System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 1100.0.0)
        /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
        /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.1.0)
        /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
        /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 478.61.0)


可惜的,超強主管已離職了,在這之前我也被分配到作其他案子,也來不及去驗證某個程式是不是用某個方向實做的。當初我是以測資方向去驗證,例如用刪減法處理,餵特定資料給程式,看其結果來猜,馬上被主管唸了,說要更謹慎處理,才有上述使用 otool 的足跡啊,只不過上述問題用 otool 也還不能解掉。


另外,我也在 Ubuntu 把 ooxx 的 binary 檔進行反組譯,是啦,可以看到組語,但我更該珍惜時間 :P 所以沒有衝下去人腦分析,也順便記一下指令:


$ arm-elf-objcopy -I binary -O elf32-littlearm iPhoneApp out.elf && arm-elf-objdump -marm9 -D out.elf


iPhone/iPod 離線地圖,使用 xGPS 和 xGPS Manager


來源:xGPS官網 http://xgps.xwaves.net


去年老早就看到離線地圖的部分,但一直遲遲沒有使用 XD 現在終於來摸一下,在此在 iOS 設備上使用 xGPS 軟體,此軟體需要 JB 後才能安裝,我記得 App Store 上也有一些 Offline Map,有些不用錢,但往往要使用地圖或上傳地圖到軟體裡就要收費了!而 xGPS 是免費軟體,算是一個框架讓你擺離線地圖。


xGPS 官方網站:http://xgps.xwaves.net,上頭有 xGPS Manager 軟體,用來下載地圖用的,因此是使用 Java 寫的,所以算是跨平台,於是就在 Virtualbox 裡面跑了一下:


挑選要下載的地圖範圍:


xgps_manager_01


勾選要幾個 level ,在此僅用預設幾項:


xgps_manager_02


估算下載的地圖大小,此例是127MB:


xgps_manager_03


開始下載地圖:


xgps_manager_04


下載完返回畫面,此檔約 100MB,接著就是傳到 iPhone 上面,該軟體上頭的介面都是透過 wifi 來進行傳輸,也可以自行用 sftp 傳輸,而下載的地圖擺在 C:\Documents and Settings\user\My Documents\xGPS Manage\xGPS_map.db,把它擺進 iPhone 裡的 /var/mobile/Library 中即可,最好上傳到 iPhone 前先下載好 xGPS 以及執行一下再離開,如此一來就會發現 iPhone 裡 /var/mobile/Library 已有 xGPS_map.db,再把它移除改換成下載好的地圖:


xgps_manager_05


如此一來,沒有 3G 網路或 wifi 時,也可以看定位地圖,記得要去設定 GPS 為 iPhone 3G 模式,只是要做路線規畫時,這時還是需要網路的。這套軟體我猜 Android 上頭應該也有類似的吧!而網路上有人分享全台 1~17 的地圖,約 1.4 GB 大小。


除了這種很貼心的軟體外,最近看到越多越便利的軟體被開發出來,手機軟體市場慢慢飽和,但換個角度來說,會有越來越便利的程式出現,也不用自己寫,也是挺不錯的!未來應該會買隻 Android 手機吧!至少開發比較便利 :D


iPhone 3G, iOS 4.2.1, Jailbreak, redsn0w, VirtualBox, Windows XP @ Ubuntu 10.04

iphone status list


之前一直想透過 VirtualBox 進行 jailbreak,不過都卡在 USB 裝置的問題,也就是 iPhone 3G DFU Mode 無法在 Virtualbox 內使用。今天終於狠下心花點時間找一下,終於成功了。此篇測試目標是 iPhone 3G + iOS 4.2.1 使用 redsn0w 並在 VirtualBox 進行 JB,其他環境可能會有問題(如對象改成 iPod Touch 4)!另外,最新的 JB 方式是使用綠毒 GreenPois0n,可以完美 JB 新出的 iOS 設備,請避開使用 VirtualBox 進行 JB 並且請找其他文章參考


環境:



VirtualBox 卡關問題:


為何在 Virtualbox 裡的 Windows XP 無法啟用 USB 連結 iPhone DFU 模式(呈現灰色無法選取),主因是權限關係,請用 root 權限跑 Virtualbox 即可,在要留意的,使用 sudo Virtualbox 後,是透過 root 權限執行,只是必須重新新增 VM 等過程,有試著使用 sudo -u user 的方式執行,其結果還是不行,倒是在 sudo Virtualbox 模式下,掛載之前已建好的 VM 是沒問題的。


除了將 iPhone 弄成 DFU 模式會碰到這問題外,其實透過 iTunes 將 iPhone 裝置進行回復,等到要啟動 iPhone 設置時,也會碰到同樣的問題。


猜測 VirtualBox 這樣的設定是避免使用者不小心接到一些特定使用的 USB 裝置,例如不小心綁住了滑鼠等,而不小心綁住可以透過拔掉重插 USB 裝置來改善。


@ 2011/03/30:參考 gslin 文章 - Ubuntu 上跑 VirtualBox 連接 USB 裝置…,這的確是權限問題,但僅需將使用的帳號也加到 vboxusers 的群組裡,重開機後就可以解決。


$ sudo vim /etc/group
vboxusers:x:123:user


關於 jailbreak 前提:


關於 unlock 部份,iPhone 3G 現階段解鎖方式是透過把數據機韌體(Modem Firmware)升成 iPad 3.2.2 的版本,將產生 GPS 功能失效的問題,除此之外將導致未來無法透過 iTunes 進行更新。因此,若有鎖版的 iPhone 請自行評估,不要冒然往前衝 XD


流程 1 - 使用 root 執行 VirtualBox:


在 Ubuntu 10.04 的機器上安裝 VirtualBox 4.0.4 r70112 以及 VirtualBox 4.0.4 Oracle VM VirtualBox Extension Pack 後,還要安裝一個 Windows XP with SP3 的環境


以 root 權限執行:


$ sudo VirtualBox 


流程 2 - 接下來的動作都在 Windows XP :



  1. 從 DevTeam 官網上下載 Windows 環境的 redsn0w 軟體,在此使用 redsn0w_win_0.9.6rc8

  2. 確認 iPhone 3G 是 iOS 4.2.1 版本,若不是可透過 iTunes 更新。取得 iPhone1,2_4.2.1_8C148_Restore.ipsw 檔案

  3. 使用 redsn0w_win_0.9.6rc8 ,執行裡頭的 redsn0w.exe 檔案並依照其流程進行


初次執行,會要求你驗證 IPSW 檔案,此例就是:iPhone1,2_4.2.1_8C148_Restore.ipsw


01


驗證過程:


02-1


驗證完訊息:


02


挑選 jailbreak 項目,在此僅用預設項目,也是自己開發會玩得東西,其他像 unlock 等東西不選取:


03


接著要將 iPhone 弄成 DFU 模式:


04


簡單的教學,如果已經是 DFU 模式,則會跳過此步:


05


接下來是才是重頭戲,由於過程很多且快速,在此僅截圖幾張,記住有個關鍵的技巧,當畫面卡在 wait for reboot 或一直沒反應時,可以透過 VirtualBox 右下角的 USB 設備,將 Apple Computer Inc. USB DFU Device 進行 unmount 或 mount 動作,即可解決:


20


21


22


23


24


25


整個流程會看到 iPhone 3G 的畫面有變化,也進行開機、安裝東西,甚至出現一隻鳳梨人,沒多久就重新開機了,最後就可以看到 Cydia 在畫面囉!


2011年2月21日 星期一

使用 Python 處理 XML 資料

範例:


<?xml version="1.0" encoding="UTF-8"?>
<TagName AttributeIntName="1" AttributeStringName="test">
<SubTagName AttributeIntName="2" AttributeStringName="example"/>
</TagName>


程式碼:


from xml.dom import minidom

raw_data = """<?xml version="1.0" encoding="UTF-8"?>
<TagName AttributeIntName="1" AttributeStringName="test">
<SubTagName AttributeIntName="2" AttributeStringName="example"/>
</TagName>
"""

if raw_data <> None:
xmldoc = minidom.parseString( raw_data )
for tagInfo in xmldoc.getElementsByTagName('TagName'):
#print tagInfo
_attributeIntValue = tagInfo.getAttribute('AttributeIntName')
_attributeStringValue = tagInfo.getAttribute('AttributeStringName').strip().encode('utf8')
                
               print _attributeIntValue, _attributeStringValue

for subInfo in tagInfo.getElementsByTagName('SubTagName'):
_subAttributeIntValue = subInfo.getAttribute('AttributeIntName')
_subAttributeStringValue = subInfo.getAttribute('AttributeStringName').strip().encode('utf8')
   
                        print _subAttributeIntValue , _subAttributeStringValue


執行結果:


# python t.py
1 test
2 example


 


2011年2月20日 星期日

[Unix] 使用 Tarball 簡易安裝 Squid Proxy Server @ FreeBSD

兩年前曾寫過一篇是安裝在 Windows XP 的,當時只是無聊試完 SSH Tunnel 後找的樂趣。直到出國後,才又回想起 Proxy 的重要性,在台灣太習慣順順的網路以及沒有限制的瀏覽。


去年底在 FreeBSD 8 的環境下,使用 tarball 方式架了 squid ,也不用 root 權限就可以跑在指定的 port 囉,唯一的限制應該是此台機器要有 public ip 以及沒有防火牆的問題,在此筆記一下,此例僅使用 IP 作為使用服務的管控:



  1. 在官網 http://www.squid-cache.org/ 下載 Squid ,在此使用 squid-3.1.11.tar.gz

    • # cd ~/ && mkdir tmp && cd ~/ && wget http://www.squid-cache.org/Versions/v3/3.1/squid-3.1.11.tar.gz



  2. 解壓縮在 ~/tmp 

    • # tar -xvf squid-3.1.11.tar.gz



  3. 編譯並指定安裝在 ~/tarball (此以 /home/user/tarball 為例)

    • # cd ~/tmp/squid-3.1.11 --prefix=/home/user/tarball 

    • # make && make install



  4. 運行

    • # cd ~/tarball

    • # ./sbin/squid -z  (Create swap directories)

    • # ./sbin/squid




接著可以用 ps -aux | grep squid 來查看有沒跑起來:


user    6329  ...   12:49上午   0:00.00 ./sbin/squid
user    6331  ...   12:49上午   0:00.04 (squid) (squid)
user    6354  ...   12:50上午   0:00.00 grep squid


預設使用 3128 port 並且僅允許 localhost 使用,透過 telnet 連一下:


# telnet localhost 3128
Trying 127.0.0.1...
Connected to localhost.domain.
Escape character is '^]'.


透過 sockstat 查看,會有類似訊息:


# sockstat | grep squid
user    squid      6331  6  udp4 6 *:49340               *:*
user    squid      6331  7  udp4   *:49936               *:*
user    squid      6331  13 tcp4 6 *:3128                *:*
user    squid      6329  5  dgram  -> /var/run/log


上述算是簡單跑了起來,但是根本還不太能用,因為此服務僅限 localhost ,假設以 123.124.125.126 此 IP 以及 123.125.0.0 此網域為例:


# vim ~/tarball/etc/squid.conf

acl MyIP 123.124.125.126
acl MyNet 123.125.0.0/16

# ...

http_access allow MyIP
http_access allow MyNet

# And finally deny all other access to this proxy
http_access deny all


設定重新讀取設定檔即可:


# ~/tarball/sbin/squid -k reconfigure


別忘了可透過 ~/tarball/sbin/squid -h 查看有什麼功能可用


其他部分,大概就是改變運行的 port 等用法,在去 squid.conf 裡找 http_port 資訊吧


最後,在 squid 進行服務時,也有一些 logs 檔案可用來監控或查看服務狀態:


# cd ~/tarball/var/logs
# ls -l
-rw-r-----  1 user  group    92  2 21 00:54 access.log
-rw-r-----  1 user  group  2133  2 21 00:54 cache.log


# tail -f access.log
可以看到一些存取記錄 


剩下的有空再來摸摸,例如透過帳密來限制存取 proxy 服務或是寫支 script 分析 access.log 等。另外,由於這次我是架在某長輩管的機器,因為人從國外連回來,讓他看到奇怪的 IP 緊張了一下,特別又是跑了一些網路服務。透過他的分享,原來是平時就保持好習慣,常常透過 last 和 sockstat 來查看系統狀況,真的還不錯喔!偉哉長輩啊。至於我使用 Squid 部分,由於是架給國外親友使用,目前還透過 crontab 定期跑 /home/user/tarball/sbin/squid 哩,因為 squid 預設是 daemon 狀態,所以還滿 ok 啦


補充 - 使用帳密管控 @ 2011/02/21 


在此使用 ncsa_auth 方式,好處是帳密跟原先 proxy server 分開,以免 proxy 帳密遺失導致系統被入侵,其他方式可以查詢 Features/Authentication - Squid Web Proxy Wiki



  1. 確認系統可以是用 ncsa_auth 方式

    • # ls -l ~/tarball/libexec/ncsa_auth
       /home/user/tarball/libexec/ncsa_auth

    • # which htpasswd 
      /usr/local/sbin/htpasswd



  2. 建立 ncsa_auth 帳密檔

    • 暫時擺在 ~/tarball/etc/passwd.ncsa,可以用 touch ~/tarball/etc/passwd.ncsa 或 htpasswd -c 的方式建立

    • # htpasswd /home/user/tarball/etc/passwd.ncsa proxy_user
      New password: 
      Re-type new password: 
      Adding password for user proxy_user



  3. 更新 squid.conf 檔案

    • 透過 IP 和帳密管控可以同時進行,唯一要得留意的是設定檔的順序,要記得把 IP 管控寫在帳密管控的前面,這樣使用 IP 的就不需要輸入帳密

    • # vim ~/tarball/etc/squid.conf


      #
      # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
      #


      auth_param basic program /home/user/tarball/libexec/ncsa_auth /home/user/tarball/etc/passwd.ncsa
      auth_param basic children 5
      auth_param basic realm Squid proxy-caching web server
      auth_param basic credentialsttl 2 hours
      auth_param basic casesensitive off 

      acl my_ip src 123.234.123.123
      acl pass_by_auth proxy_auth REQUIRED

      # 留意順序
      http_access allow my_ip
      http_access allow pass_by_auth

    • 重新讀取設定檔就行了! ~/tarball/sbin/squid -k recofigure