作者归档:wingyue

Charles on Windows + Android 查看https封包

Capture Android Phone https packet with Charles on Windows

現在https當道,網站有沒有使用https,除了資安的議題以外,連Google搜尋的排名都會被影響

但使用了https,有時候會造成工程師們在開發時debug上的困難
最近也是有這個需求,爬了一下文,看大家都滿推薦Charles的,就花了一些時間研究了一下,寫成這篇文章跟大家分享

如果哪邊有不正確或是可以寫個更好的地方,歡迎不吝嗇告訴我,謝謝

正文開始啦

Charles Intro

Charles是一款跨三大平台的代理服務器,通過成為電腦或者瀏覽器的代理,截取應用程式送出的Request和Response的內容,達到解析封包的效果

這篇文章就是教大家怎麼使用Charles查看https的封包內容

不過Charles本身是付費軟體

免費試用版的話只能試用30天,而且30分鐘沒進行操作Charles會自動關閉
付費版的話,個人用戶是50鎂

同類型的工具還有Fiddler、 Wireshark、 mitmproy等等
下面的連結有對上述3款以及Charles進行簡單的整理,可以參考

需要擷取Android手機上的封包,你需要一台電腦,一台Wi-Fi AP,一台Android手機,而電腦與Android手機需要連到同一台AP才行

更正確地說, 手機和電腦必須是一個網段才可以


Step1.下載&安裝Charles

去官網下載對應平台的Charles,然後安裝
安裝就如同一般的應用,直接按「Next」或是「下一步」,這邊就不贅述了

Step2.付款/註冊/破解(!?)

由於免費版有些限制,覺得好用的朋友可以付費註冊使用
畢竟身為軟體開發者,支持正版才能促進良性循環

但是網路上稀奇古怪的東西這麼多,Google一下,破解版本還是有的…
只能說看大家良心了

Step3.確認Windows的防火牆暢通

在Windows上安裝Charles的時候,應該會出現下面這個詢問視窗(軟體不同,純示意圖)

基本上這邊應該要選「私人網路」接著按下「允許存取」。如果安裝時你勾選的是「公用網路」,由於安全性問題,Windows會把電腦外部想跟Charles建立連線的裝置或是封包擋下來,導致Android裝置無法從外面連入。

為了確保Android裝置能夠順利從連到主機上的Charles,我們要開啟防火牆檢查一下,開啟「控制台」中的「防火牆」(Win10控制台中,好像叫做Windows Denfender防火牆)

※不論你在之前是不是都選擇「私人網路」,都檢查一下比較好,不然到時候連不上又找不出原因就哭了QQ

控制台>防火牆

選擇左邊的「進階設定」

防火牆>進階設定

接著按照步驟讓「 ?」都變成打勾符號,當然,名稱是Charles的項目前方都沒有?就不需要任何操作

  1. 選擇「輸入規則」
  2. 選擇輸入規則中的名稱前面符號是「 ?」的「Charles.exe」
    (範例圖中只有一個,不過有超過一個就對各項目重複執行流程2~5)
  3. 選擇右邊的「內容」,會出現一個小視窗
  4. 小視窗內選擇「允許連線」
  5. 最後按下確定
setting Windows firewall for Charles

Step4.設定Charles,查看Android手機的http封包

該安裝的都安裝好啦,不過由於Charles預設不會啟用查看https封包的功能,我們先練習將Android手機的封包轉傳給電腦上的Charle,並查看http封包的內容,等到步驟熟悉之後再練習查看https封包。

開啟Charles吧!,Charles打開之後預設就會直接開始紀錄本機上進出的封包,你可以馬上看到你的電腦有哪些封包傳出跟傳入。

簡單講解一下

看到下圖左下方黃色底的網址,這是代表是有封包傳去或是有封包從該網址傳入

可以發現黃色底的https://1-edge-chat.facebook.com前面的icon是一個鎖,代表以https協定傳送,相對的,黃色底網址上面一列的藍色icon就代表是用未加密的http協定傳送

Charles UI intro example

由於等等我只要看Android手機上的封包,所以先不顯示本機端送出/傳入的封包

點選上方選項列的Proxy -> Windows Proxy,你會發現預設是勾選的,點一下該選項就能夠取消紀錄本地端的封包,如果要恢復的話就在點選一次同個選項

接著按左上角的清除按鈕,把現有的紀錄清掉

stop record local packet on windows

然後點選上方選項列的Help -> Local IP Address
Charles會列出正在使用的網卡名稱,以及連線對應所使用的ip
像是我這邊是只有使用無線網卡連著Wi-Fi,ip是192.168.0.12

find local ip address in Charles

找到網卡使用的ip之後,由於封包要轉傳給Charles,我們要知道Charles所建立的Proxy的Port是多少,才能將封包交給他

什麼是Port阿?

假設我們把電腦當作一棟大樓,那麼可以把電腦中的每個應用程式當作是一個人,每個人都住在同一棟大樓裡,不過一個人可能不會只有一戶,根據需求,有的人可能有2,3戶,甚至更多,像是有些人比較有錢,可能就會把整層好幾戶買下來打通之類的。而這邊比較特別的是,每個人都不會出門,都會待在家裡做自己的事情。

那麼今天如果有快遞要送包裹給大樓裡某個人,應該怎麼做呢?,首先,快遞會根據「大樓地址」找到大樓在哪,舉例來說像是「台北市天堂路二段384巷5號」,這邊的「大樓地址」對應到電腦上就是我們所謂的ip,而「包裹」就是被傳送的封包。

不過根據地址找到大樓之後,大樓裡面住了這麼多人,要怎麼把包裹交給正確的收件人呢?,答案也很直接,就是根據包裹上收件人的地址,收件人的地址理論上來說是「大樓地址」+「戶地址」所組成的,延續上面的例子,完整的收件人地址會像是「台北市天堂路二段384巷5號3樓之5」,快遞就能夠根據「3樓之5」這個戶地址來找到正確的收件人,然後把包裹交給他,這邊的「戶地址」對應到電腦中,就是我們所謂的port。

其實上面的例子就是我們一般寄包裹的流程,只是我們把現實生活中的流程跟電腦中的一些專有名詞做對應,讓大家比較好了解

ps.這邊只是以最簡單的例子做比喻告訴大家port的意義是什麼,關於port還有更多更深知識,有興趣的人就去Google一下吧

整理一下

  • 包裹:封包
  • 應用程式:收件者
  • 大樓地址:ip位址
  • 戶地址:port

打完之後發現好長XD,我們言歸正傳

在Charles裡面,我們可以在選項列Proxy->Proxy Setttings設定Proxy的Port號碼,預設應該是8888
除非8888 Port已經被其他應用程式使用了,理論上不需要更改
記下來這組數字即可,等等會用到

find default port in Charles

Step5.設定Android手機,將封包轉送給Charles

首先先到Wi-Fi設定頁面,連上與你使用中的電腦所連線的同個AP(Access Point,簡單來說就是Wi-Fi分享器或是路由器)

由於我是用HTC,就以HTC手機為例囉
長按已經連線的Wi-Fi,然後選擇「修改網路」(左圖)

modify Wifi setting for charles in android phone

接著按照右圖的步驟

  1. 打開進階選項
  2. Proxy:選擇「手動」
  3. Proxy主機名稱:填入上面在Charles Help->Local Address IP中找到的ip位址
  4. Proxy通訊埠:填入上面在Proxy->Proxy Setttings中找到的port號碼
  5. 儲存!

設定完成之後,如果該裝置是第一次連線,Charles會跳出出現對話視窗,詢問你是否要讓某個ip進行連線,按下Allow即可

ps.如果之後要移除該ip的話,可以在Proxy -> Access Control Settings中設定

check connection in Charles

如果沒有出現這對話視窗的話代表有哪邊設定不對,或是防火牆有問題等等…

有個可以試試看方法:在Proxy -> Access Control Settings中加入Android裝置所使用的ip地址

真的不行就只能請大家自己Google了,或是官網也有提供一些問題的解答
最下面的Reference的部分我也有放一些有關解決問題的資源
尤其是投影片後面有幾頁有指出到連不上Charles的可能原因跟怎麼檢查

接著用Android手機隨便瀏覽一些網站,就可以看到在Charles中出現許多記錄啦~

Step6.來吧,https,讓我看看 (android 7.0以下適用)

基本的紀錄&查看http封包流程學會了之後,接著我們要來處理https的封包啦

不過醜話要說在前頭
以下的方法從Android7.0 開始就無法使用了,

原因是Google希望如果你要debug,你就自己看自己apk的封包就好了,不要看到別人的,所以自己安裝憑證的方式似乎不能使用了

SDK 24 以上要用 charles proxy debug 自己的 app 就要在 manifast 中加入 networkSecurityConfig

詳細的解說可以在下方Charles文件連結中找Android 的部份查看,而我手邊目前沒有7.0的裝置,需要試試看在補充給大家

如果你手機的系統是Android 7.0以下,Let’s Go~

在Charles內,透過Man-In-The-Middle攻擊查看https封包內容的功能是預設關閉的,我們要設定一下開啟這功能,

首先,需要在電腦上安裝Charles 的CA 證書
安裝方式很簡單,只要按下Help -> SSL Proxying -> Install Charles Root Certificate

接著會跳出有關該憑證的資訊視窗(左圖),有興趣可以看看(!?),然後按下「安裝憑證」

Windows會開啟憑證匯入精靈(右圖),這邊就跟你平常安裝軟體一樣(!?),使用預設值,一直按下一步,當然設定上有需要可以自己更改,最後沒問題的話,憑證就安裝成功啦

電腦這邊設定好了,那就換設定Android手機啦,手機也需要安裝同一個憑證~

在Android設備上開啟這個網址,下載憑證

這邊一樣是以HTC手機為範例,設定介面應該大同小異~

接著選擇設定->安全性->從儲存裝置安裝

how to install CA with settings UI

找到下載資料夾,選擇charles-proxy-ssl-proxying-certificate.pem這個檔案(左圖),接著輸入憑證名稱(右圖),名稱這邊沒有什麼限制,輸入能清楚辨認用途的名稱即可,或是可以跟我一樣打Charles-SSL-CA

下面的認證使用的部分選擇「VPN及應用程式」
最後按下確定,基本上就完成啦

select CA and install on Android Phone

如果你要確定憑證已經安裝完成了,你可以在設定->從安全性->信任的憑證裏頭找到(左圖),HTC有區分系統跟使用者的憑證,可以輕易在使用者的部分發現剛剛安裝的憑證

另外,手機應該會彈出通知,告知你「網路可能會受到監控」,這邊只是純告知,不用理會這通知哈哈(右圖)

find CA info / network observed notification

好了~憑證都安裝好了,該弄得的都弄好了
不過奇怪!Charles裡面的https紀錄還是看不到封包內容阿

這是因為Charles預設就是不會去解析https的封包給你看啦
如果你想對截取某個網站上的所有https封包,要在網址上點右鍵->Enable SSL Proxying,這樣就可以看到未來透過該網域傳送的封包的內容了

另外可以看到,選擇Enable SSL Proxying之後,下圖紅色框框內的icon就變成原本是http才會出現的icon,代表封包內容在Charles內可以以明碼的方式查看

Step7.Charles進階功能

Charles除了接收跟紀錄封包之外,還擁有更改封包內容、根據關鍵字過濾封包、模擬弱網路環境、進行壓力測試…等等好用的功能

大家可以參考下面的連結,雖然是Mac的介面,不過用相同的方式操作Windows版本的Charles也是沒有問題的,只是介面不一樣,文字內容都是相符的

打完收工~ The End

[Android] 使用Retrofit如何避免Man in the middle攻擊

前幾天看到朋友寫如何用Charles Proxy來debug REST API, 突然就想到了這個問題, Charles Proxy是一個不錯的工具, 我自己也蠻常用的 , 除了可以用來debug HTTP以外, 其實HTTPS也可以(參照SSL proxying) , 只要在手機上安裝好它的SSL certificate即可

不過這不是這篇要講的重點, 這種debugging的方式原理即是用Proxy作為一個中間人來紀錄HTTP/HTTPS的傳輸內容 , 這也帶來一個問題, 也就是你的資料是可以這樣簡單的暴露出去, 這種即是所謂的MITM (Man in the middle) 中間人攻擊

graph LR; Client–>Proxy[Proxy – Middle man]; Proxy[Proxy – Middle man]–>Client; Proxy[Proxy – Middle man]–>Server; Server–>Proxy[Proxy – Middle man];

一般來說, 用了SSL/HTTPS後, 也不是那麼容易安插一個中間人的 ,像Charles Proxy這樣的東西, 還是需要使用者自己去手機上的安全性設定裝信任憑證(trusted certificate), 一般常見的問題反而來自於開發者本身 , 很多人常以為走了HTTPS就安全了, 卻常常為了debug方便, 或是省錢用Self-signed certificate 而去覆寫了系統預設的 X509TrustManager, 以至於整個檢查機制被跳過, 真的漏洞都來自於人的惰性, 更多資訊可以參考:

  1. 窃听风暴: Android平台https嗅探劫持漏洞
  2. Android安全之Https中间人攻击漏洞
  3. Android HTTPS中间人劫持漏洞浅析
  4. Android客户端安全 -> HTTPS敏感数据劫持漏洞
  5. Android App 安全的HTTPS 通信
  6. 手機應用程式開發上被忽略的 SSL 處理
  7. How To: Use mitmproxy to read and modify HTTPS traffic
  8. INTERCEPTING ANDROID SSL / HTTPS TRAFFIC

該避免去寫的, 就該避掉, 以免產生不必要的漏洞, 但不過也有可能碰到使用者的手機被(有意/無意)安裝了攻擊者的憑證到系統的信任憑證中, 那麼碰到這種, 應用程式本身該如何保護自己?

這邊有兩個方式可以採用 –

  1. certificate pinning
  2. 在程式中寫死certificate

以下的範例以Android最紅, 常被使用的Retrofit為範例(雖說是Retrofit, 但其實是在okhttp動的手腳)

Certificate Pinning

或叫HTTP Public Key Pinning (HPKP), 簡單的說, 就是在程式內綁定Certificate的public key, 如果今天中間人存在, certificate不同了, 連接就不會成功

先來看範例

OkHttpClient client = new OkHttpClient.Builder()
        .certificatePinner(new CertificatePinner.Builder().add("cdn.rawgit.com", "sha256/p0962nIqD0mv1APQ1mgmRiuwrhZXBuj+t6dey/Adk0U=").build())
        .build();
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://cdn.rawgit.com/julianshen/cpblschedule/")
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build();

這邊所動的手腳(跟Retrofit沒啥鳥關係)是在OkHttpClient上加上一個CertificatePinner, 利用了certificate pinner加上了一個host name跟public key的對應, 以這例子來說: “sha256/p0962nIqD0mv1APQ1mgmRiuwrhZXBuj+t6dey/Adk0U=” 這個public key對應的是 “cdn.rawgit.com” , 因此碰到”cdn.rawgit.com”來的url, 會檢查public key是否符合, 這邊public key的參數字串是要以”sha1/”或”sha256/”開始的, 依使用的演算法而不同

但又要怎取得這串”天書”呢?

很簡單, 首先確認你的電腦裡面有沒安裝openssl , 有的話就用以下的指令:

openssl s_client -connect cdn.rawgit.com:443 -servername cdn.rawgit.com | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der | openssl
dgst -sha256 -binary | openssl enc -base64

最後產生的內容如下

depth=2 /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
verify error:num=20:unable to get local issuer certificate
verify return:0
writing RSA key
p0962nIqD0mv1APQ1mgmRiuwrhZXBuj+t6dey/Adk0U=

所以我們要填的參數就是 “sha256/p0962nIqD0mv1APQ1mgmRiuwrhZXBuj+t6dey/Adk0U=”

關於HPKP的openssl相關的指令可以參考Public Key Pinning

如果你用Charles Proxy當中間人來測試這段程式的話, 你會得到下面這樣的exception

javax.net.ssl.SSLPeerUnverifiedException: Certificate pinning failure!
                                            Peer certificate chain:
                                            sha256/ENlqFHtfARof3AK50Hbc1sj47M5hWhc5kQ5Z2vyfxq4=: CN=rawgit.com,OU=PositiveSSL Multi-Domain,OU=Domain Control Validated
                                            sha256/mXmLzo8k5ANwi11PlLSW/b4OC/Anjw1OeACDyZxD/WM=: C=NZ,ST=Auckland,L=Auckland,O=XK72 Ltd,OU=http://charlesproxy.com/ssl,CN=Charles Proxy Custom Root Certificate (built on Jlnmbp-retina.local\, 11 十二月 2015)
                                            Pinned certificates for cdn.rawgit.com:
                                            sha256/p0962nIqD0mv1APQ1mgmRiuwrhZXBuj+t6dey/Adk0U=

在程式中寫死certificate

這方法聽起來暴力了一點, 但原理其實跟前一個沒啥太大差別, 只是一個寫死public key一個寫死certificate

一樣先來看個範例:

String cert = ""
        +"-----BEGIN CERTIFICATE-----\n"
        +"MIIFdjCCBF6gAwIBAgIRAPbTBHdHHseM4hArA7n6uREwDQYJKoZIhvcNAQELBQAw\n"
        +"gZAxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO\n"
        +"BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTYwNAYD\n"
        +"VQQDEy1DT01PRE8gUlNBIERvbWFpbiBWYWxpZGF0aW9uIFNlY3VyZSBTZXJ2ZXIg\n"
        +"Q0EwHhcNMTYwMTAxMDAwMDAwWhcNMTcwMTEzMjM1OTU5WjBbMSEwHwYDVQQLExhE\n"
        +"b21haW4gQ29udHJvbCBWYWxpZGF0ZWQxITAfBgNVBAsTGFBvc2l0aXZlU1NMIE11\n"
        +"bHRpLURvbWFpbjETMBEGA1UEAxMKcmF3Z2l0LmNvbTCCASIwDQYJKoZIhvcNAQEB\n"
        +"BQADggEPADCCAQoCggEBALD2sUNSYp2R+mSEMF2qKvMS780qTkltvqP4rwEGKOLV\n"
        +"rR5QQWo8vzSlgZvxVsguRHi0pPBtVAH794L43tD+IuyQlDlNU2qc1aMqBkn3S2wN\n"
        +"Way8BS9w80pgeFnObZiFJtPI9pdwcB72Bgq8Nlc25oVrDVWr/Q8nLIKS/9FkNs+C\n"
        +"MPU00vGFZSFbR7s15ORj9+qPCskWZcHpQ+m9EKmZD3IVKj3QQyBD17cBoVkYoIpj\n"
        +"I8/r+NfVfKetlsB7Pcv8P3yLFVFC4+PGrnW9TLZK9aRtbDTvjElXwCQIPK5B2fKw\n"
        +"SJK26IJPDX0r1JkeuR53Afr509iEx3xAHcRz/kR5uo8CAwEAAaOCAf0wggH5MB8G\n"
        +"A1UdIwQYMBaAFJCvajqUWgvYkOoSVnPfQ7Q6KNrnMB0GA1UdDgQWBBSI83Kqafo7\n"
        +"kg9cmyT1vnceH4fAUjAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADAdBgNV\n"
        +"HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwTwYDVR0gBEgwRjA6BgsrBgEEAbIx\n"
        +"AQICBzArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5jb21vZG8uY29tL0NQ\n"
        +"UzAIBgZngQwBAgEwVAYDVR0fBE0wSzBJoEegRYZDaHR0cDovL2NybC5jb21vZG9j\n"
        +"YS5jb20vQ09NT0RPUlNBRG9tYWluVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNy\n"
        +"bDCBhQYIKwYBBQUHAQEEeTB3ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LmNvbW9k\n"
        +"b2NhLmNvbS9DT01PRE9SU0FEb21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0Eu\n"
        +"Y3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wSwYDVR0R\n"
        +"BEQwQoIKcmF3Z2l0LmNvbYIVY2RuLW9yaWdpbi5yYXdnaXQuY29tgg5jZG4ucmF3\n"
        +"Z2l0LmNvbYINcmF3Z2l0aHViLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEASx3e6y9e\n"
        +"9F67N5NIDausDHDL+/fz6uj2DDNJdaQvALAYDV8hKpz7+QGotlQfI042U2i83J7m\n"
        +"DGZiKDpzaXa7IFfGiq6PFPUjntElHoU2E4vRb5LApg1sJ5YueYmRd3X7x0/jPYg6\n"
        +"TiTtHyXOnlMuqL2FUYJM0BP7cMfOppvUF0R2zHUVA0rVHuLrSStg8bMg8aVUIkKg\n"
        +"n3NS+eg4ofo95jaMRVykhLnylkYBk9dWBM6B19Yw7LgQd94MZSa+Xix4HxeFgvAM\n"
        +"BF+oeDMaY7mEN4Xm5hnrIS1FElRDq/ckpDV8JVpR4SQqB+tzSZPPIiep8EvgRDzd\n"
        +"2EkL187FF3MQ+w==\n"
        +"-----END CERTIFICATE-----\n";

X509TrustManager trustManager = null;
SSLSocketFactory sslSocketFactory = null;

try {
    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
    Collection<? extends Certificate> certificates = certificateFactory.generateCertificates(new Buffer().writeUtf8(cert).inputStream());
    if (certificates.isEmpty()) {
        throw new IllegalArgumentException("expected non-empty set of trusted certificates");
    } else {
        char[] password = "password".toCharArray(); // Any password will work.
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(null, password);

        int index = 0;
        for (Certificate certificate : certificates) {
            String certificateAlias = Integer.toString(index++);
            keyStore.setCertificateEntry(certificateAlias, certificate);
        }

        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);

        TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
        if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
            throw new IllegalStateException("Unexpected default trust managers:"
                    + Arrays.toString(trustManagers));
        }
        trustManager = (X509TrustManager) trustManagers[0];

        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, new TrustManager[] { trustManager }, null);
        sslSocketFactory = sslContext.getSocketFactory();
    }
} catch (CertificateException e) {
    e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
} catch (KeyStoreException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} catch (KeyManagementException e) {
    e.printStackTrace();
}

OkHttpClient client = new OkHttpClient.Builder()
        .sslSocketFactory(sslSocketFactory, trustManager)
        .build();

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://cdn.rawgit.com/julianshen/cpblschedule/")
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build();

看到這麼長的東西大概就不會想看了吧?(老實說我也寫的很懶, 這邊要特別提到有用到一個Class叫做Buffer,這是來自於okio, 蠻方便的東西), 跟前一個不同的地方在於, 前一個利用了CertificatePinner, 而這一個則是改了sslSocketFactory的TrustManager(喂!!!前面不是隱約有提到這樣不太好?!), 這個TrustManager全部也只信任這一個certifcate, 如果碰到其他的, 就會發生以下的exception:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
        at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:328)

那, 上面那一大坨憑證資料是怎樣取得的? 方法其實差不多:

openssl s_client -connect cdn.rawgit.com:443 -showcerts

會得到這樣的結果:

CONNECTED(00000003)
depth=2 /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/OU=Domain Control Validated/OU=PositiveSSL Multi-Domain/CN=rawgit.com
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA
 1 s:/OU=Domain Control Validated/OU=PositiveSSL Multi-Domain/CN=rawgit.com
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA
 2 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
 3 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
   i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFdjCCBF6gAwIBAgIRAPbTBHdHHseM4hArA7n6uREwDQYJKoZIhvcNAQELBQAw
gZAxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTYwNAYD
VQQDEy1DT01PRE8gUlNBIERvbWFpbiBWYWxpZGF0aW9uIFNlY3VyZSBTZXJ2ZXIg
Q0EwHhcNMTYwMTAxMDAwMDAwWhcNMTcwMTEzMjM1OTU5WjBbMSEwHwYDVQQLExhE
b21haW4gQ29udHJvbCBWYWxpZGF0ZWQxITAfBgNVBAsTGFBvc2l0aXZlU1NMIE11
bHRpLURvbWFpbjETMBEGA1UEAxMKcmF3Z2l0LmNvbTCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBALD2sUNSYp2R+mSEMF2qKvMS780qTkltvqP4rwEGKOLV
rR5QQWo8vzSlgZvxVsguRHi0pPBtVAH794L43tD+IuyQlDlNU2qc1aMqBkn3S2wN
Way8BS9w80pgeFnObZiFJtPI9pdwcB72Bgq8Nlc25oVrDVWr/Q8nLIKS/9FkNs+C
MPU00vGFZSFbR7s15ORj9+qPCskWZcHpQ+m9EKmZD3IVKj3QQyBD17cBoVkYoIpj
I8/r+NfVfKetlsB7Pcv8P3yLFVFC4+PGrnW9TLZK9aRtbDTvjElXwCQIPK5B2fKw
SJK26IJPDX0r1JkeuR53Afr509iEx3xAHcRz/kR5uo8CAwEAAaOCAf0wggH5MB8G
A1UdIwQYMBaAFJCvajqUWgvYkOoSVnPfQ7Q6KNrnMB0GA1UdDgQWBBSI83Kqafo7
kg9cmyT1vnceH4fAUjAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADAdBgNV
HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwTwYDVR0gBEgwRjA6BgsrBgEEAbIx
AQICBzArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5jb21vZG8uY29tL0NQ
UzAIBgZngQwBAgEwVAYDVR0fBE0wSzBJoEegRYZDaHR0cDovL2NybC5jb21vZG9j
YS5jb20vQ09NT0RPUlNBRG9tYWluVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNy
bDCBhQYIKwYBBQUHAQEEeTB3ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LmNvbW9k
b2NhLmNvbS9DT01PRE9SU0FEb21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0Eu
Y3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wSwYDVR0R
BEQwQoIKcmF3Z2l0LmNvbYIVY2RuLW9yaWdpbi5yYXdnaXQuY29tgg5jZG4ucmF3
Z2l0LmNvbYINcmF3Z2l0aHViLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEASx3e6y9e
9F67N5NIDausDHDL+/fz6uj2DDNJdaQvALAYDV8hKpz7+QGotlQfI042U2i83J7m
DGZiKDpzaXa7IFfGiq6PFPUjntElHoU2E4vRb5LApg1sJ5YueYmRd3X7x0/jPYg6
TiTtHyXOnlMuqL2FUYJM0BP7cMfOppvUF0R2zHUVA0rVHuLrSStg8bMg8aVUIkKg
n3NS+eg4ofo95jaMRVykhLnylkYBk9dWBM6B19Yw7LgQd94MZSa+Xix4HxeFgvAM
BF+oeDMaY7mEN4Xm5hnrIS1FElRDq/ckpDV8JVpR4SQqB+tzSZPPIiep8EvgRDzd
2EkL187FF3MQ+w==
-----END CERTIFICATE-----
subject=/OU=Domain Control Validated/OU=PositiveSSL Multi-Domain/CN=rawgit.com
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA
---
No client certificate CA names sent
---
SSL handshake has read 6716 bytes and written 456 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: ACFED5197F4B5F64DBAAC97A47380CD9283EFD1797E27EF43A215B06982698F4
    Session-ID-ctx: 
    Master-Key: 856DFB81C863F461FE75EE11E633EA5CAB3CD6683563F597F406EF19AB37CD3F45B4FE659AB8726F9291360CBE856F48
    Key-Arg   : None
    Start Time: 1475223830
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

BEGIN到END那段剪貼下來即是

缺點

這兩個方法有一個極大的缺點, 如果沒有解決方案還是最好別用(啊講那麼多, 最後不能用?!) , 這缺點就是SSL Certificate是有時效性的, 因此server端的憑證是會換會改變的, 只要server端一換, 就可能造成client端的失效, 所以如果要使用這兩個方法, 前提必須先解決的是如何更新Client端要檢查的public key或certificate, 這邊就不討論這部份的機制了, 這應該有很多方法可以來作才對

#好久沒寫關於Android的內容了

抓包神器之Charles,常用功能都在这里了

       我们在开发网站项目的时候,我们可以通过浏览器的debug模式来看request以及response的数据,那么如果我们开发移动端项目没有网页呢?如何抓取数据呢?

前几天有个做服务端的师弟跟我说他不用抓包工具,遇到问题直接debug代码,那我问他,如果线上服务的话,你怎么调?在实际项目中,没有遇到跟客户端相互扯皮的事情吗?我觉得很正常啊,客户端说他没问题,服务端也说他没问题,到底谁有问题?这时候没必要相互推脱,拿数据出来说话才是王道。抓包工具做了什么?它把客户端的请求数据,以及服务端返回的数据完完整整的抓取下来,供攻城狮分析问题。所以首先分析问题才是最重要的,而不是一上来就跟踪代码debug。

Charles

是一个HTTP代理服务器,HTTP监视器,反转代理服务器,当程序连接Charles的代理访问互联网时,Charles可以监控这个程序发送和接收的所有数据。它允许一个开发者查看所有连接互联网的HTTP通信,这些包括request, response和HTTP headers (包含cookies与caching信息)。

Charles主要功能:

1. 支持SSL代理。可以截取分析SSL的请求。

2. 支持流量控制。可以模拟慢速网络以及等待时间(latency)较长的请求。

3. 支持AJAX调试。可以自动将json或xml数据格式化,方便查看。

4. 支持AMF调试。可以将Flash Remoting 或 Flex Remoting信息格式化,方便查看。

5. 支持重发网络请求,方便后端调试。

6. 支持修改网络请求参数。

7. 支持网络请求的截获并动态修改。

8. 检查HTML,CSS和RSS内容是否符合W3C标准。

Charles安装:

去Charles的官方网站(http://www.charlesproxy.com)下载最新版的相应操作系统的Charles安装包安装即可。

Charles是收费软件,可以免费试用30天。试用期过后,未付费的用户仍然可以继续使用,但是每次使用时间不能超过30分钟,并且启动时将会有10秒种的延时。

因此,该付费方案对广大用户还是相当友好的,即使你长期不付费,也能使用完整的软件功能。只是当你需要长时间进行封包调试时,会因为Charles强制关闭而遇到影响。(偷偷告诉你,公众号回复“Charles”获取破解版下载链接)

Charles的功能很强大,我们这里只介绍几个常用的并且非常实用的功能:

1. 将Charles设置成系统代理

2. 截取移动设备上的网络请求包

2.1手动重复请求(Repeat,Advanced  Repeat)

2.2手动模拟请求(Compose)

2.3修改网络请求内容(Compose)

3. 过滤网络请求

4. 代理转发

5. 支持https请求抓包(如果配置了还是抓不到,下面有解决方案)

Charles 主要提供两种查看封包的视图,分别名为 “Structure” 和 “Sequence”。

1. Structure 视图将网络请求按访问的域名分类。

2. Sequence 视图将网络请求按访问的时间排序。

下面将一一介绍这些如何配置和使用

一. 将Charles设置成系统代理

Charles 是通过将自己设置成代理服务器来完成抓包的,勾选系统代理后,系统本地发出去的请求都能被截取下来。如果只抓取APP的包的话,可关闭此配置,这样不会出现太多的数据看着比较乱。

Mac

Windows:

需要注意的是,Chrome 和 Firefox 浏览器默认并不使用系统的代理服务器设置,而 Charles 是通过将自己设置成代理服务器来完成封包截取的,所以在默认情况下无法截取 Chrome 和 Firefox 浏览器的网络通讯内容。如果你需要截取的话,在 Chrome 中设置成使用系统的代理服务器设置即可,或者直接将代理服务器设置成 127.0.0.1:8888 也可达到相同效果。

二. 截取移动设备上的网络请求包

我们在调试移动APP时,需要抓取APP发送的数据包,首先进行设置,Proxy -> Proxy Settings默认端口是8888,根据实际情况可修改。

查看本机IP地址:Help -> Local IP Addresses

然后配置手机代理:

IOS和Android配置差不多

打开要调试的APP,请求就会先发送到Charles,然后验证是否允许访问。

当点击允许后,可以在Proxy -> Access Control Settings里看到可以访问此代理服务器列表

注意

如果不小心点击了拒绝,可以手动添加手机IP/Mac地址到允许访问列表,或者重启Charles,手机再次访问,会再次提示选择。

如果不想每换一个手机都要进行验证,可以配置允许所有手机访问,加入

0.0.0.0/0(IPv4)或::/0(IPv6)

现在就可以抓包了,拿一款我们公司开发的乐视车联APP来做测试:

三. 过滤网络请求

通常情况下,网络请求是非常大量的,从几十个请求里找到我们需要的观察的某个请求比较费时,那么我们就需要对网络请求进行过滤,只监控向指定目录服务器上发送的请求。有两种方法:

1. 在Sequence界面的中部的Filter栏中填入需要过滤出来的关键字。例如我们的服务器的地址是:*.leautolink.com,那么只需要在Filter栏中填入leautolink即可。(一般用于临时过滤)

2. 在Charles的菜单栏选择”Proxy”->”Recording Settings”,然后选择Include栏,选择添加一个项目,然后填入需要监控的协议,主机地址,端口号。这样就可以只截取目标网站的封包了。如下图所示:(固定过滤地址)

四. 代理转发

实际开发时,有这样的场景,服务端线上版本有bug,你在本地修改程序后,需要模拟实际的线上环境,来验证程序的正确性,最笨的方法就是让客户端修改一下APP的调用地址到你本机,然后重新打一个版本供你模拟测试,这样虽然可以,但每次遇到bug都要这么做的话,那效率极其低下,然而Charles为我们解决了这个问题。

请求转发,把调用方调用的地址转发到你本机地址的程序进行执行。

右键 -> Map Remote …

并且配置Tools -> Map Romote

运行APP

五. Https请求抓包

默认我们是看不到https的请求数据的。我们需要安装证书。

Mac:

双击打开Charles Proxy CA

手机配置完代理(必须的操作)后,浏览器打开http://chls.pro/ssl

然后配置Proxy -> SSL Proxying Settings… 添加要抓取的https请求

然后再次请求:

如果不再使用Charles,想删除手机里的证书文件怎么删除呢?

设置->通用->描述文件与设备管理,删除指定的证书即可

Windows:

下一步

然后继续下一步直到导入成功。

剩下的配置与Max下配置相同

SSL的问题:

最近iPhone系统更新到ios 10.3后,用Charles抓包竟然出现了一些问题,https的请求都会失败,提示错误信息为Failure SSLHandshake: Received fatal alert: unknown_ca 和You may need to configure your browser or application to trust the Charles Root Certificate. 然而之前任何问题都没有,并且相关设置都正确:电脑上安装了Charles的根证书,并且设置了始终信任,然后手机上也登录了http://chls.pro/ssl安装了描述文件,一切都按正常程序走的,但是错误始终无法解决.

原因:

虽然charles的根证书已经在安装列表中显示,但它是被关闭的。在iOS 10.3之前,当你将安装一个自定义证书,iOS会默认信任,不需要进一步的设置。而iOS 10.3之后,安装新的自定义证书默认是不受信任的。如果要信任已安装的自定义证书,需要手动打开开关以信任证书。

解决:

设置->通用->关于本机->证书信任设置-> 找到charles proxy custom root certificate然后信任该证书即可.

Windows系统无法上网的问题

在windows下,如果Charles没有正常关闭,或者系统重启后无法上网的问题,因为Charles做了系统代理,当上网的时候,首先先访问代理服务器,然后代理再去链接网络,这时候Charles是非正常关闭的,只要重新打开Charles即可上网正常,正常关闭Charles后同样没问题。

写给测试人员的

另外抓包工具不只是开发人员独享的,任何一个参与项目的人都可以使用,测试工程师,运维,产品经理等等任何对技术感兴趣的人,尤其是测试工程师,在测试的过程中遇到问题,不是简单的bug记录员,而要做到问题的分析员,这才是真正的“工程师”,当bug真正的到开发这的时候,他拿到的是不仅仅是bug,包含了分析过程,分析的数据,甚至是解决方案。我觉得这才是标准工作方式。

举个例子,现在是移动互联网时代,那么我们开发的客户端必然包括Android和IOS版本,同样的功能必然在不同的客户端都有实现,比如同样的功能Android能用,而IOS不能用,这时候对于测试人员来说,他可以简单的提个bug说某个功能Android能用,ISO不能用,请开发人员解决。这个问题应该给谁呢?IOS开发,是IOS缺少请求参数?服务端开发,是服务端缺少对IOS的兼容吗?为了能让问题解决,可能要写两个相同的bug发给不同的人, 那我们开发看到这样的问题,首先重现问题,那么肯定要跟测试人再次沟通,问问当时的测试过程,然后模拟同样的数据进行复现。

那么如果我们的测试工程师换一种工作方式呢?当遇到问题的时候,用抓包工具把数据抓下来,首先比较Android和IOS发送请求参数有什么不同,比较一下返回的数据有什么不同,如果请求参数不同,那么测试人员通过模拟工具,把缺少的参数加上,那么返回的数据是不是就正确了呢?如果参数相同,返回的数据不同,或者是参数相同,返回的数据相同,这样的话,问题就显而易见了,测试人员可以把抓取的数据提交给相应的开发人员,而开发人员完全可以去debug了。提高测试人员的自身技能,而又提高了解决问题的效率,何乐而不为?

作者:互扯程序
链接:https://www.jianshu.com/p/993bc794138d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

[转]《教我兄弟学Android逆向04 动态调试smali代码 》

上一篇《教我兄弟学逆向03 破解第一个Android游戏》我带你用另一种方式破解了切水果游戏 我布置的课后作业你也完成了 并且自己又独立破解了另外几款游戏  很不错 在这里表扬一下-旭 ! 希望其他同学都能向旭同学学习  努力提高自己的逆向技术!

要么学!要么不学!学和不学之间没有中间值 不学就放弃,学就要去认真的学!    –致选择

在开始本节课之前我有个问题 为什么要学习动态调试smali 也就是为什么要学习本节课?


答: 因为我在招聘网站上面看到很多招逆向的公司都要求要会动态调试smali代码 因为《教我兄弟学逆向》系列课程就是为找工作而生的 并且有些东西通过静态分析是分析不出来的 要动静结合分析出来的东西才能更加全面。

那么本节课要教你的是用AndroidStudio动态调试smali 下面开始今天的教程

既然这节课我要教你的是用AndroidStudio动态调试smali 那么在开始动态调试smali之前 首先要把要调试的apk反编译成smali文件然后导入到用AndroidStudio中 对不对?
那么把怎么把这个apk反编译成smali文件呢?


你回答:我以前都是直接把apk拉到Androidkiller这个软件中 然后AndroidKiller自动就会把apk反编译成smali文件了

回答正确 可以啊兄弟! 用现在流行的一句话说 给你打call !

那么我现在给你演示这种方式

一.用AndroidKiller把apk反编译成smali文件

apk链接:https://pan.baidu.com/s/1smNIrST 密码:uzsa

1. 首先把apk拉到AndroidKiller中 点工程管理器 点smali目录右键 打开方式-打开文件路径

2.在E盘新建一个jwx02文件夹 然后把打开文件路径目录里的smali文件夹复制到E盘并改名为src 然后就可以用AndroidStudio导入src了

二  要用AndroidStudio动态调试smali代码 首先要安装ideasmali插件
1.打开AndroidStudio
2. 安装ideasmali插件,File->Settings->Plugins,下载安装ideasmali插件。

ideasmali下载链接:
链接:https://pan.baidu.com/s/1htl26qS 密码:0pre

三. 打开Android Device Monitor

四. 找到要调试APK的包名和入口的Activity

1.用AndroidKiller打开要调试的APK 这里是jwx02.apk

2.记住包名hfdcxy.com.myapplication 和入口的Activity名 hfdcxy.com.myapplication.MainActivity

3.这里要注意一下 在application标签里面要有 android:debuggable=”true” 这句代码,没有是不能调试apk的  现在调试的这个例子默认是有这句代码的 有的apk中没有这句代码要自行添加上

五 把自己要调试的APK安装到手机中 并用数据线连接手机 打开USB调试模式

六 打开命令行 输入命令 adb shell am start -D -n hfdcxy.com.myapplication/hfdcxy.com.myapplication.MainActivity  对apk进行动态调试 这条命令运行后手机屏幕将会进入到调试界面(如果手机屏幕没有进入到调试界面说明USB没有连接好手机 或者USB调试模式 没有打开 或者其他原因)

七.查看Android Device Monitor 记住下图圈起来的两个值 然后把Android Device Monitor关掉(这里一定要关掉,因为它会占用8700端口 导致后面转发端口失败)

八.打开命令行窗口 输入命令 adb forward tcp:8700 jdwp:19509    转发8700 端口 (这里 jdwp是自己Android Device Monitor中要调试app的Online值 )

九. 导入jwx02文件
1.用AndroidStudio导入jwx02

2.然后一路Next 最后点Finsh

十 点击Android选择Project 对之前反编译的 jwx02/src文件夹右键–>Make Directory As —>Source Root

十一 配置远程调试的选项,选择Run–>Edit Configurations 并增加一个Remote调试的调试选项,端口选择:8700

十二 选择File–>Project Structure 配置JDK

十三 在Smali中下好断点 断点的意思是程序运行到下断点的那行代码就会断下来

十四 下好断点之后Run–>Debug’smali’,这里的smali是我们之前配置好的调试选项

十五 此时手机会进入程序 在手机上输入用户名和密码 点登陆 程序会断在我下的断点处

十六 在自己关心的语句前面下断点按F8执行下一步 F9运行程序 可以看到程序执行的逻辑 Watches窗口中可以点+按钮添加自己想看的寄存器的名字 就可以看到这个寄存器的值了

结束
本节课给你讲了用Android动态调试smali代码 当然教程讲的并没有这么详细 破解过程中遇到不懂得自己去百度 再不懂的就来问我 学习逆向就是这样 学不会就会感觉迷茫 但是不用怕 记住多迷茫几次就都学会了 本节课的例子一定要多练习 多跟着课程做几遍 自己多下断点看程序的执行逻辑 每节课布置的课后作业一定要完成 课后作业都不做的话 那我的帖子你也不用继续跟了 学而不思则罔,思而不学则殆 ,不仅要完成还要能理解 那么本节课教程到此结束 下节课我将教你在smali中代码中插入log 。

课后作业:
把本节课的例子动态调试三遍 尝试在不同位置下断点 多下断点 多看寄存器的值 分析程序执行的逻辑

诺顿杀毒软件2018激活密钥最新提取方法

诺顿激活密钥最新提取方法:

首先,下载诺顿杀毒软件90天OEM版(点击这里下载)

1.安装后,创建帐户(新建账号)。

2.注册:输入邮箱、Norton密码、姓名、手机号码,单击“创建帐户”。

3.Norton成功激活,可以看到订购状态:剩余90天。

4.打开官网 https://my.norton.com/ 登陆刚才注册的账号。

5.复制产品序列号。

6.把此链接复制粘贴到浏览器上面 http://updatecenter.norton.com/product-update?PROD=Norton&PLANG=eng&PRODID=00000131&PSN=
然后在 = 号后面加上产品序列号,按回车键。

7.点击Continue(继续)。

8. 拉到浏览器地址栏最后面,把 inject%3Dfalse%26LNG%3Deng-USA 删除 然后按回车键。

9.右键复制客户端链接。

10.在刚才复制的链接最后面,把false修改成true,然后按回车键。

11.新建一个TXT文本文件,然后打开刚才下载的NISBetaDownloader.exe,通过“编辑 → 查找,查找内容,输入 key ”,点击“查找下一个”,下面那个标记起来的就是激活码了!

 

SS网络加速方法(破解版锐速 serverspeeder)

首先强调锐速不支持Openvz!!!锐速不支持Openvz!!!锐速不支持Openvz!!!

一、锐速破解版安装方法:

用putty通过ssh登陆你的vps

 

执行一键安装锐速命令

wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder-all.sh && bash serverspeeder-all.sh

执行命令后可能会不成功,提示需要更换内核,CentOS7 内核更换为: 3.10.0-229.1.2.el7.x86_64,这时执行更换内核命令

rpm -ivh http://soft.91yun.org/ISO/Linux/CentOS/kernel/kernel-3.10.0-229.1.2.el7.x86_64.rpm --force

执行过程有些缓慢,请耐心等待,貌似不动其实后台在运行


当再次出现root#vultr就执行完了,这时执行reboot重启vps,会弹出一下提示框,用putty重新登录vps


登陆后再次执行安装锐速命令

wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder-all.sh && bash serverspeeder-all.sh

选择1

这里就安装好了

二、锐速卸载方法

chattr -i /serverspeeder/etc/apx* && /serverspeeder/bin/serverSpeeder.sh uninstall -f

三、锐速相关命令

几个相关指令
service serverSpeeder status 查看serverSpeeder的状态
service serverSpeeder start | stop | restart 停止暂停重启锐速

如何在Linode VPS安装锐速ServerSpeeder

Linode VPS是老牌的VPS销售商,今年推出了1核1G内存的起步机器,只需要5美元(35元/月),而且VPS性能很好,1核1G内存的VPS能跑1200多分,目前蜗牛正在使用的1核2G内存的阿里云服务器跑分也就是在1000徘徊。机器好不好,自己体验了才知道,现在注册Linode账号,首次信用卡充值验证可以获赠20美元,相当于可以免费使用4个月。

  • Linode VPS购买、系统安装、VPS删除等详细管理教程
  • 老牌Linode VPS账号注册、国内信用卡验证及获取10-20美元充值奖励教程
  • Linode VPS日本东京机房和美国弗里特朗机房性能测试

上面讲了很多题外话,现在进入主题。如何在Linode VPS安装锐速ServerSpeeder,提示服务器带宽使用率,网络连接稳定性、降低访问失败率。

1、首先更换Linode VPS内核为4.4.0-x86_64-linode63,因为锐速免费版Linux一键自动安装包只支持Linode的4.4.0-x86_64-linode63版本。详细修改内核教程可以参照:Linode VPS如何在管理页面更换内核。

2、执行下面命令安装锐速免费版。安装过程中提示没有匹配的版本,然后给出了一个接近的版本,请输入“1”选择。详细安装教程请查看:锐速ServerSpeeder无限带宽免费版Linux一键自动安装包安装教程。

wget -N --no-check-certificate https://raw.githubusercontent.com/wn789/serverspeeder/master/serverspeeder.sh
bash serverspeeder-all.sh #执行脚本安装

3、最后显示如下页面表示安装完成。

VpsServer – 新上新加坡节点 KVM , 7天免费试用 1核 1GB 25GB SSD

官网:

VpsSserver官网: 立即前往

优惠码:

免费7天优惠码:7daytrialSG 。

优惠套餐

     1024MB KVM Special  

  • 核心:1核CPU
  • 内存:1024MB
  • 硬盘:25GB SSD
  • 流量:1000GB
  • IP:1独立IP/无限IPv6
  • 端口:1Gbps
  • 架构:KVM
  • 系统:Linux
  • 节点:新加坡
  • 价格:4.99美元/月
  • 购买:立即购买
  • 特色:7天免费使用
    2GB KVM Special  

  • 核心:1核CPU
  • 内存:2GB
  • 硬盘:50GB SSD
  • 流量:3000GB
  • IP:1独立IP/ 无限IPv6
  • 端口:1Gbps
  • 架构:KVM
  • 系统:Linux
  • 节点:新加坡
  • 价格:9.99美元/月
  • 传送:购买链接
  • 特色:7天免费使用

付款方式:PayPal、信用卡、比特币。

官网免费7天推荐邮件:

Try Singapore now, 7-day trial!

We are thrilled to announce our new Singapore location! After we launched our first Asia location in Hong Kong we noticed there is a high demand for Cloud services in and from Asia.

Order your new VPS:
https://service.vpsserver.com/servers/add/

Get started for free!
Try our services in Singapore for 7 days! Use coupon: 7daytrialSG
This coupon is only valid in April!Use on: https://service.vpsserver.com/redeem-promo-code/

常用国内/国外VPS推荐

国外篇(排名不分先后根据使用前后排序)

一、Vultr

数据中心:日本、洛杉矶、英国、法国、德国、荷兰、澳大利亚等15个机房
套餐价格:KVM 512MB 20GB SSD 500GB月流量 $2.5/月
简单介绍:Vultr作为全球最大的游戏主机提供商背景之一,上线之后以高质的性价比、15个数据中心,以及新注册账户赠送5美金的账户使用金优惠促销,吸引广大的用户。作为我们用户,日本、洛杉矶等数据中心速度较好,如果有需要海外其他机房也可以在其12个数据中心中选择到适合自己的。
官方网站:http://www.vultr.com/(每个用户仅限开设2台最低配置VPS)

备注说明:目前VULTR取消注册赠送余额,当前充值赠送活动页面还有在继续(最多充值100送100,仅限新注册用户

二、SugarHosts

数据中心:洛杉矶、德国、香港(新增)
套餐价格:1024M 30GB流量 39元/月
简单介绍:提供Sata和SSD两种硬盘VPS,且有WINDOWS VPS方案,洛杉矶MC数据中心对国内线路优化过,平均PING在160左右,支持支付宝付款,有中文客服,如果是需要稳定建站的,这款机器还是不错的。2016年10月新增香港SSD VPS,月付最低47.5元+50元带宽起步。
官方网站:http://www.sugarhosts.com/(直接购买无优惠码)

三、Linode

数据中心:日本、佛里蒙特、达拉斯、亚特兰大、伦敦
套餐价格:1G内存 1核心 20GB SSD固态硬盘 1T流量 5美元/月
简单介绍:Linode当初属于高富帅VPS产品,从加量不加价升级以来,可谓是影响到整个VPS行业的降价风;1G方案5美元的价格从土豪拥有扩展到平民也可以拥有,唯一的缺点是只能信用卡付款。
官方网站:http://www.linode.com/(Linode性能评测/Linode新账户赠送$10余额优惠码技巧)

四、VPS.NET

数据中心:洛杉矶、多伦多、英国等18个数据中心
套餐价格:CPU1核、内存512MB、硬盘10G、流量1000G,5美元/月
简单介绍:老牌海外VPS主机提供商,全部采用OnAPP架构,拥有日本、美国等18个数据中心,日本线路优秀,客服响应及时。
官方网站:http://www.vps.net/(新注册账户需要较为严格的资料提交审核 – 参考这里

五、BandwagonHost(搬瓦工VPS)

数据中心:美国西雅图、佛罗里达、洛杉矶、荷兰、佛利蒙
套餐价格:目前年付低至19.99美金,5机房可选/切换
简单介绍:IT7官方旗下的低价VPS主机产品,拥有速度较好的西岸亚利桑那州机房,最低年付仅需3.99美元(目前无货),我们可以用来学习、工作项目演示。拥有5个数据中心,而且可以自由切换IP,更换不同的IP,尤其是适合新手学习Linux系统和建站使用,初学者必备,可支付宝付款

  • CPU:1核心CPU
  • 内存:512MB
  • 硬盘:10GB SSD
  • 流量:1000GB
  • 端口:1Gbps
  • 架构:OpenVZ+KiwiVM面板
  • IP数:1独立IP
  • 系统:Linux
  • 价格:$19.99/年(洛杉矶)
  • CPU:1核心CPU
  • 内存:1024MB
  • 硬盘:20GB SSD
  • 流量:2000GB
  • 端口:1Gbps
  • 架构:OpenVZ+KiwiVM面板
  • IP数:1独立IP
  • 系统:Linux
  • 价格:$39.99/年(洛杉矶)
  • CPU:1核心CPU
  • 内存:256MB
  • 硬盘:10GB SSD
  • 流量:500GB
  • 端口:1Gbps
  • 架构:OpenVZ+KiwiVM面板
  • IP数:1独立IP
  • 系统:Linux
  • 价格:$19.99/年(8个机房)
  • CPU:2核心CPU
  • 内存:512MB
  • 硬盘:20GB SSD
  • 流量:1000GB
  • 端口:1Gbps
  • 架构:OpenVZ+KiwiVM面板
  • IP数:1独立IP
  • 系统:Linux
  • 价格:$4.99/月(8个机房)
  • CPU:1核心
  • 内存:512MB
  • 硬盘:10GB SSD
  • 流量:1000GB
  • 端口:1Gbps
  • 架构:OpenVZ+KiwiVM面板
  • IP数:1独立IP
  • 系统:Linux
  • 价格:$19.99/年(佛利蒙)
  • CPU:1核心
  • 内存:512MB
  • 硬盘:10GB SSD(实际11GB)
  • 流量:500GB(实际550GB)
  • 带宽:1Gbit
  • 架构:KVM+KiwiVM面板
  • IP数:1独立IP
  • 系统:Linux
  • 价格:$2.88/月(6机房KVM)

目前,搬瓦工拥有佛利蒙、洛杉矶、凤凰城、佛罗里达、以及荷兰8个数据中心,最低年付使用优惠码只需要19.00美金。IAMSMART5EL5BMIAMSMART5TDT48(目前优惠力度最大的5.08%)优惠码,如果点击看到是OUT OF STOCK就表示无货。

六、DigitalOcean

数据中心:旧金山、纽约、伦敦、法兰克福、新加坡等8个机房
套餐价格:CPU1核、内存512MB、硬盘20G、流量1000G,5美元/月
简单介绍:DigitalOcean有点类似Vultr商家,云主机产品,按照小时付款,可选8个机房,速度上可能对于中文用户不是太好,但是比如多机房用户,以及海外项目用户,性价比还算可以。
官方网站:http://www.DigitalOcean.com/(新注册用户赠送10美金参考教程)

国内篇(国内云主机商)

一、腾讯云(CVM)

数据中心:广州、北京、上海、香港、新加坡等
套餐价格:1024M 1核心 20GB硬盘 65元/月
简单介绍:腾讯云服务器CVM肯定也不会示弱,别人有的产品他们肯定也必须有,腾讯云服务器用户也比较多,相对而言价格比阿里云便宜,也有国内、国外多个机房。
官方网站:http://www.qcloud.com/

二、阿里云(ECS)

数据中心:青岛、杭州、北京、香港、深圳、香港、美国等
套餐价格:1024M 1核心 40GB硬盘 93元/月
简单介绍:如果准备使用国内的云VPS主机,阿里云VPS产品的品牌地位、稳定性、速度还是比较好的,但我们的网站是需要备/案才可以,但是如果你准备长久的稳定的使用,国内VPS还是值得选择。随着阿里云的拓展,机房也在增加,目前已经有多个机房。
官方网站:http://www.aliyun.com/(阿里云主机购买教程及评测)

三、景安快云VPS/服务器

数据中心:郑州、北京、香港(快云服务器)
套餐价格:1024M 1核心 70GB硬盘 49元/月
简单介绍:景安快云VPS、服务器虽然背景不如阿里云和腾讯云,但是其商家在国内还算是做的比较大的,尤其是配置上和促销活动比较多,经常有一些买一年送一年,或者半价活动。比如在买一年赠送一年活动中,基础的年付快云VPS方案500元左右可以用2年(具体还要看实际活动)。
官方网站:http://www.kuaiyun.cn/

VPS选择和使用总结

便宜VPS主机我们可以用来学习、测试演练项目,也可以用来搭建网站,不管我们用哪款VPS,最好是定期备份数据,以免出现不测。相对而言,便宜VPS主机我们更加需要注意这些问题。