2011年11月14日 星期一

Android刪除首次登入的Google帳號


目前Android系統的手機非常的火紅,使用Android系統也一陣子了,記得第一次幫同事安裝新手機時,以自己的Gmail來設定並安裝market上應用程式,發現第一個登入Gmail的帳號無法刪除,真是糗大了,結果使用最原始的方法將手機回到出廠設定,但應用程式也都必須捲土重來,真是做了一次白工,於是從Google上找了許多方法,發現可利用Titanium Backup工具來刪除Google帳號,換句話說此方法的最基本條件必須要有 Root。

方法一 :


▼Gmail內的移除帳號是針對非第一個登入帳號才能刪除,若強制移除會出現如右圖藍色框內的訊息,此訊息竟告訴使用者到「設定」\「SD卡與手機儲存」\「恢復原廠設定」,天啊!那裡面安裝的軟體豈不是要重來嗎?簡直是晴天霹靂~~~~~,若你的手機有Root,可透過Titanium Backup來備份應用程式後,待回到原廠設定後,此時可以登入想更換的Gmail帳號,接下來再還原之的備份的應用程式。

tb15.jpg


方法二 :


▼首先將手機設定成「飛安模式」,利用Titanium Backup(鈦備份)來凍結Gmail相關程式,有Gmail、Google Backup Transport、Google Partner Setup與Google 服務架構等(藍色框內的程式)。

tb16.jpg

▼點選在想要凍結的程式(綠色框),右圖出現的畫面上點選紅色框內的「凍結」即可,將Gmail、Google Backup Transport、Google Partner Setup與Google 服務架構都凍結。

tb19.jpg

▼被凍結的程式會出現藍紫的背景色,接著再點選每個凍結的程式,結果畫面出現可解凍的圖示,代表此程式目前是被凍結中,按下紅色框內的「清除資料」,一樣必須將Gmail、Google Backup Transport、Google Partner Setup與Google 服務架構等程式內的歷史資料都清除,。

tb17.jpg

▼清除歷史資料都後,記得得幫剛凍結的程式解凍,不然是無法使用的,一一的點選綠色框內的程式,並在右圖中按下紅色框內的「解凍」即可,全部解凍後重新開機。

tb20.jpg

▼重新開機後將「飛航模式」取消,並進入Market或Gmail來重新設定第一個Gmail帳號,果然出現新增帳號的畫面。

tb18.jpg

在 iOS device 同步 google 連絡人



設定 ->電子郵件/通訊錄/行事曆->新增帳號


Microsoft Exchange

  電子郵件:填你的Gamil

  域名:空白

  用戶名:填你Gmail address


  密碼:Gmail密碼


  伺服器: m.google.com

2011年11月10日 星期四

監看網路封包程式設計概說


作者: 邵文琳

前一個禮拜花了不少時間在看網路封包方面的程式設計 ..覺得十分有興趣.
感謝charles 和 ellery 的幫助 . 讓我觀念比較清楚 ...
在這裡我把我這一個星期的學習心得寫下來.
讓大家以後若有機會寫到類似程式時, 可是事半功倍 ..
網路程式設計方面相關資料很多 . 但是都是對比較上層的tcp,或udp的應用在做介紹.
對於網路層和datalink層面則著墨較少 .
所以"對我而言" 學習起來比較困難. 希望寫下這個對大家會有幫助.

一個網路封包監看程式 . 說穿了 只有四個重點:

第一 . 開啟一個可接收raw packet 的socket .
一般我們開始socket接收tcp或udp的packet 時, 我們收到的內容就直接是資料內容 .
kernel 己經幫我們把ethernet header 和 ip 或 arp header 都拿掉了.
但是在寫網路封包程式時, 我們需要header . 因此我們在開啟socket 的時候,就可以針對我們要收集的封包總類做過濾. 要求接收到的資料裡要包涵完整的封包標頭檔...

第二 . 有條件的接收封包和無條件的接收封包.
網路卡只會接收到ethernet header 的target mac 是自己的mac 時, 或接收到TARGET MAC 為 ff:ff:ff:ff:ff 的封包, 或是multicasting 的封包(也就是target ip是224開頭的封包 . 這種情況叫做 nonPromiscuous . 當我們要監看網路封包時,希望收到的不只是broadcast 或是 multicasting 或是自己的封包時, 我就要把網路卡設定成 Promiscuous . 如此一來我們就可以接到實體網路上的所有封包了...

第三 . filter 的設定.
當我們把網路卡設成 Promiscuous , 而且看到了所有封包header 時, 我們就可以依照我們自己的意思去過濾出我們想要的封包 . 可是一個問題來了 .. 網路上的封包那麼多.我們全都要一個個的去把它的標頭打開, 看看是不是自己要看的封包. 這樣做花的時間太長.以致於後面進來的封包都塞在buffer 裡, 等你一個個的檢查..我們需要一個filter 建立在硬體層和聯結層中建立一個filter , 先過濾出我們要的封包,再交由程式處理 . 這就是filter的功用.這種filter 是由bpf code 寫出來的! 不會寫bpf code ? 沒關係. 我們還是有別的方法把它變出來 ,,,,,

第四 . multiplexing I/O (blocking VS noblocking)
就如我們所知道的當我們在receving packet 時. 如果沒有資料進來, 程式就會等在那裡 ,這種情況叫做blocking , 但是有時候我們不想要無止限的等在那裡時, 郤又沒法把break 出來時,怎麼辦呢?使用signal 嗎? 另一種解決方式就是把資料流做unblocking.但unblocking 郤不能完成解決我的需求, 於是我利用到了 multiplexing I/O.接下來我在對以上四項做詳細解釋和範例:

第一 socket .
要如何開一個可以接收raw_data 的socket呢 ?

int sock;

// 開一個接收所有走ip protocol 封包的完整封包
sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));

// 開一個接收所有走arp protocol 封包的完整封包
sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ARP));

// 開一個接收所有 protocol 封包的完整封包
sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_All));

// 在linux 下接收datalink 層的網路封包
sock = socket(PF_INET, SOCK_PACKET, htons(ETH+P_ALL));


PF_PACKET 支援兩個socket type:SOCK_RAW 和 SOCK_DGRAM, SOCK_RAW 會留下完整的 ethernet 標頭.SOCK_DGRAM 會去掉ETHERNET 標頭.但在linux 下使用PF_SOCK , SOCK_RAW 會有問題.最好是使用 PF_INET, SOCKET_PACKET 也可以留下完整的實體層的標頭.

第二 Promiscuous.
網路卡預設當然都是nonPromiscuous , 要變成 Promiscuous 必須對網卡做設定.在socket 己經open 下

#include
#include
struct ifreq ifrq;

strncpy(ethreq.ifr_name,"eth0",IFNAMSIZ);
ioctl(sock,SIOCGIFFLAGS,&ifrq);
ifrq.ifr_flags|=IFF_PROMISC;
ioctl(sock,SIOCSIFFLAGS,&ifrq);

若在打開之後,沒有在程式結束前關閉. 它就會一直打開哦 . 所以記得要關閉它.


strncpy(ethreq.ifr_name,"eth0",IFNAMSIZ);
ioctl(sock,SIOCGIFFLAGS,&ifrq);
ifrq.ifr_flags&=~IFF_PROMISC;
ioctl(sock,SIOCSIFFLAGS,&ifrq);


第三. 設filter
filter 的設定主要是使用在實體層和連接層中間 . 用一種近似組語的bpf code 組成.寫起來挺麻煩的 . 所以我們直接使用tcpdump -dd 來產生的binary code 來用 .

for example:
tcpdump -dd ip dst 172.16.0.3
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 3, 0x00000800 },
{ 0x20, 0, 0, 0x0000001e },
{ 0x15, 0, 1, 0xac100003 },
{ 0x6, 0, 0, 0x00000044 },
{ 0x6, 0, 0, 0x00000000 },
tcpdump -dd ip src 172.16.0.3
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 3, 0x00000800 },
{ 0x20, 0, 0, 0x0000001a },
{ 0x15, 0, 1, 0xac100003 },
{ 0x6, 0, 0, 0x00000044 },
{ 0x6, 0, 0, 0x00000000 },
tcpdump -dd arp dst 172.16.0.3
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 3, 0x00000806 },
{ 0x2 0, 0, 0, 0x00000026 },
{ 0x15, 0, 1, 0xac100003 },
{ 0x6, 0, 0, 0x00000044 },
{ 0x6, 0, 0, 0x00000000 },

其實這些code 的產生是有跡可找的..我就把下面程式碼的binary code 原始bpf pesude code 列出來,可以相對應比較看看

/*
udp and host 192.168.9.10 and src port 5000
(000) ldh [12]
(001) jeq #0x800 jt 2 jf 14
(002) ldb [23]
(003) jeq #0x11 jt 4 jf 14
(004) ld [26]
(005) jeq #0xc0a8090a jt 8 jf 6
(006) ld [30]
(007) jeq #0xc0a8090a jt 8 jf 14
(008) ldh [20]
(009) jset #0x1fff jt 14 jf 10
(010) ldxb 4*([14]&0xf)
(011) ldh [x + 14]
(012) jeq #0x1388 jt 13 jf 14
(013) ret #68
(014) ret #0
*/


我們可以依我們的需要去下command 給tcpdump -dd 幫我們產生binary code. tcpdump, 不但區分不同的protocol. 來源,目的地, even 標頭的第幾個byte,和要接收封包的大小, 都可以變化. 實在是太神奇了.

接下來我們要把code 整合到程式裡去 ...

第四 . blocking VS noblocking multiplexing I/O
unblocking 最重要的意思是當有資料流進來時立刻就傳回. 當沒有資料流進來時, 也傳回0.於是我們就可以利用unblocking 和loop 來控制我們要的時間.
以下是程式的寫法:

(fcntl(fd ,F_GETFL) & O_NONBLOCKING) // 1 成功 0 失敗


但是把資料一點一滴的傳進來也並不是我們要的 . 我們還是希望傳進來的資料是一個個block 過的資料,只是當沒有資料進來時, 能夠不要永遠的等在那而己.這就是multiplexing I/O 的概念.當我們read 和recvfrom 一個 file handle 時, 我們可以設定如何沒有資料進來時我要等多久,就能回到程式繼續執行我們要做的動作.
以下是程式的寫法:

#include "sys/time.h"
#include "sys/select.h"

int sock;
struct timeval tv;
fd_set readfds;

sock = socket(...);
tv.tv_sec=1;
tv.tv_usec=0;
FD_ZERO(&readfds); // 清空file handle set.
FD_SET(sock,&readfds); // 加入一個file handle 到file handle set
FD_SET(xxx,&readfds); // 如果還有別的file handle 也要加入同一個
set做控制的話 ..
select(sock+1,&readfds,NULL,NULL,&tv); // 對 file handle set 設
定時間控制
if(FD_ISSET(sock,&readfds)){ // 依readfds的設定來看是否為
true , 依我們的
例出來說,程式會在這裡等上一秒鐘. 如果在這一秒裡有data流進來,
傳回true, 再交給recvfrom把data 接下來, 否則一秒鐘後傳回false
!
// recvfrom(....)
}


基本上把握這幾個主要的重點, 要變化出自己的sniffer 不是問題..剩下來比較討厭的就是把ip 轉成network address to host address..大小印地安,和 inetaddr, inet_addr, inet_aton, inet_ntoa ...這些變來變去的死東西了.

2011年11月3日 星期四

Wireshark 遠端抓取封包功能









在Wireshark較新版本中新增了遠端抓取封包功能,至於遠端抓取封包的好處自然不用說了,可以實現跨地域、彌補缺乏技術支援等等。
本文的主要目的是Demo,如何使用Wireshark進行遠端抓取封包,以及抓取封包中使用到部分技術原理說明。
需要說明的是,WIRESHARK 之所以能夠遠端抓取封包,是因為在安裝WinPcap時,已經Default安裝了一個名為rpcapd的遠端抓取封包程式,位置在\Program Files\WinPcap>。
在本地和遠程機器都安裝完畢WS後,就可以開始遠端抓取封包了。
本例中,2台測試機IP分別是:192.168.10.2(local)和192.168.10.5(remote)。
  • 啟動遠端設備rpcapd
在遠端機器中,執行C:\Program Files\WinPcap>rpcapd.exe -n,如下圖
提示service已執行。其中,參數-n的意思是不驗證權限既可連接,更多rpcapd資訊請參照文後所附。
  • 連接遠端抓取封包程式
啟動local WIRESHARK,在Capture選項欄選擇Remote,跳出新窗口,要求輸入IP地址、端口及驗證訊息。
由於遠端機器無驗證要求,即匿名可連接,直接輸入IP 192.168.10.3,Port使用2002
 
  • 選擇遠端抓取封包網卡
成功連接後,Interface處會顯示遠端IP地址信息。
由於當前機器內通常會有多個網卡,這裡需要選擇正確的capture網卡。
  • 抓取封包
以上設置完成後,就可以抓取封包了。
心細的你,可能發現了一些可選設置的地方,即Remote Settings。如果沒有特殊要求或想追求性能的話,建議不要修改其中選擇。
接下來,“Start”即可。
 上圖是遠端抓取封包的測試內容。
另外,從WIRESHARK Title中亦可看出,當前正在遠端抓取封包
附:rpcapd參數
USAGE:
rpcapd [-b] [-p ] [-6] [-l ] [-a ]
[-n] [-v] [-d] [ -s ] [-f ]
-b
: the address to bind to (either numeric or literal).
Default: it binds to all local IPv4 addresses
-p : the port to bind to. Default: it binds to port 2002
-4: use only IPv4 (default both IPv4 and IPv6 waiting sockets are used)
-l : a file that keeps the list of the hosts which are allowed
to connect to this server ( if more than one, list them one per line).
We suggest to use literal names (instead of numeric ones) in order to
avoid problems with different address families
-n: permit NULL authentication (usually used with '-l')
-a : run in active mode when connecting to 'host' on port 'port'
In case 'port' is omitted, the default port (2003) is used
-v: run in active mode only (default: if ' -a' is specified, it accepts
passive connections as well
-d: run in daemon mode (UNIX only) or as a service (Win32 only)
Warning (Win32): this switch is provided automatically when the service
is started from the control panel
-s : save the current configuration to file
-f : load the current configuration from file; all the switches
specified from the command line are ignored
-h: print this help screen

How to use simple speedtest in RaspberryPi CLI

  pi@ChunchaiRPI2:/tmp $  wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py --2023-06-26 10:4...