有時候咱們想抓取一些app的數據用做商業用途,或者是獲取到該app中某一個技術點的實現方式,或者是想得到其中的重要邏輯,目的的話不一樣人不同。可是有些app就是不讓你獲取接口數據,搞了各類各樣的加密,這裏其實也是攻守關係,魔高一尺道高一丈,雙方彼此在競爭中成長,推進着技術的進步。html
今天給你們帶來一個百萬級日活的主流app-連尚讀書的接口數據破解,這但是獨家博客首更哈,網上不可能搜到的乾貨。看官大大們都繫好安全帶,扶好扶手,立刻開車。若是有連尚官方的兄弟但願也別生氣,我其實也不太想公開來着,可是後面想了想反編譯的大佬多了去了,若是像我這種小菜鳥都能破解,那說明早就有不少其餘人已經破解過了。下面貼出連尚讀書的app截圖,界面中規中矩,顏值仍是不錯的呢!程序員
廢話少說,看完了就開幹。破解接口數據,首當其衝固然是抓包,我這裏貼個圖,抓到包了可是是加密後的字符串,徹底看不出來這是什麼東東啊,連尚的兄弟們也是夠狠的。算法
因爲是破解接口,固然是從url入手啊,首先複製host到反編譯工具中進行搜索,結果以下圖:json
你以爲這些搜索結果裏你對哪一個更感興趣?固然是最後兩個,由於最後2個使用了Retrofit這網絡框架明明白白地就擺在那裏,坐等你上去點,你能不感興趣嘛?OK,那應該點哪一個方法呢?問得好,固然是點a()方法啊,首先一看混淆了的就知道有鬼,其次前面部分確定是Retrofit的基本使用,無外乎就是根據url來獲取數據,固然有空的話點進去學習一下也無所謂啦!這裏咱們直接點進去a()方法,結果以下圖:數組
看到沒,這段代碼已經很明顯了安全
String string = responseBody.string();
網絡
這百分百是從response裏面獲取到前面那串亂碼啊,接下來將這串亂碼調用了一個decryptN方法之後,獲取到了一個值。這個值是什麼呢,咱們能夠根據它的使用處來猜想一下。首先這個值是傳給str,那str是給a.a()做爲參數,重點是str的默認值,看到沒,str默認值是一個json,那麼既然string是賦值給str的,那string是否是應該也是個json呢?這是固然,因此string就是最終解碼之後得到的json數據了。架構
如今形勢就很明朗了,從服務端獲取到了一個加密的responseBody,而後調用Rsa.decryptN方法進行了解密獲取到了最終可供客戶端使用的正常json數據。那麼問題來了,這個解密算法是什麼呢,咱們火燒眉毛地點進去看:app
點進去發現是調用了一個nativeDecryptAD方法獲取到Byte[],最後將這個byte[]轉換成的json,因此這裏重點就是這個nativeDecryptAD方法了。點擊這個方法,定位到上面定義處,發現是個native標識的方法,也就是jni的方法。這也是正常的,既然要作加密,使用c那再正常不過了。框架
俗話說得好,神擋殺神,佛擋殺佛,怎麼能輕易被jni給擋住?碰到使用jni的地方,第一個想到的就應該是看下這個方法是放在哪一個so下面。注意看上面的靜態方法
static {
System.loadLibrary("ck");
}
這麼直接地告訴你是在ck這個so下面,那我固然就得去拜訪一下咯。修改apk的後綴後,很容易就獲取到了這個so包,優哉遊哉地打開,以下圖
剛剛那個加密方法是在Rsa類中,叫作nativeDecryptAD方法。咱們掃一眼全部的方法,一眼就找到了,固然得點開來好好研究一把,畢竟連尚的碼農爲了作加密確定也是費了很多功夫的,不研究一把就對不住人家。程序員自己就已經很不容易了,要互相懂得尊重。廢話少說,直接打開這個方法,實現以下:
咱們看該方法是由v9賦值而成,而v9是由v8轉成byte[],因此關鍵就是v8了。v8是調用了另外一個c的方法,咱們點進去看下
裏面都是亂七八糟的代碼,看到v1 v2一直到v20就頭痛。不過這代碼就不是讓你看的,你有發現什麼規律沒,基本全部的變量都包含xxtea開頭,這意味這個方法極可能就是第三方的一個叫xxtea的類庫,否則若是你本身寫代碼你會都用xxtea開頭不?
到這裏咱們去網上搜索一下xxtea,果真是一個加密框架,確認過眼神,你就是對的人。知道了加密框架之後你就能夠去搜索解密方式了,這種百度操做網上一搜一大把,確定難不倒你們吧。我這裏就隨便貼個百度搜索到的連接吧,解密算法圖也貼一個:www.cnblogs.com/frogblog/p/…
OK,解密算法有了,咱們能夠看到這個算法是須要傳入2個參數,咱們再回頭看看以前的c方法是否是有傳入這些參數。首先從Java那邊傳入的數組是input,這個input轉變成ret_len傳入了算法,其次傳入了一個pub_key_ad,看名字結合場景不用猜都知道這個確定就是解密須要的Key了。
可是上面並無對這個pub_key_ad賦值,因此這個確定是在以前就賦值了的變量。咱們點進去
看到沒,果真一個複雜的key哇,惋惜仍是露出了它的真面目。這裏打了個helloworld只是爲了讓它不那麼害羞,給穿個三點衣吧,讓它有點安全感。那麼Key是否是就是這個,能夠直接複製過去使用呢?答案是否認的,你須要注意的是在c的代碼中對這個key進行過修改哦,粗心的同窗不當心就會拜倒在這裏,這應該是連尚的當心機吧,哈哈。
看到沒,第6個數要改爲48才能夠,否則折騰了半天沒看到這裏也是白搭。把key複製出來,而後修改key中下標爲6的數,也就是第7個數爲十進制的48(由於這裏沒用0x因此不是16進制)。而後就能夠收穫成果了,這麼有名的app中關鍵數據毫無保留地出如今你面前,是否是滿滿的成就感?
總結:本次表演結束,我給你們總結一下破解接口的方法。我以前還破解過手淘的接口,後面有空也給你們分享一下。固然,根據個人經驗,破解接口數據的步驟總共分爲如下幾點:
1.是否有網頁版或者網頁客戶端
若是某個軟件有網頁版,那麼破解的難度的就下降不少,就算有js混淆,可是至少代碼都是可見的,不像客戶端各類混淆加密加固機制,動不動就是jni。能夠這麼說吧,若是有網頁版,就優先對網頁版進行破解。
2.使用抓包工具進行抓包
這一步沒什麼好說的,破解接口固然是得抓包了。固然這裏須要注意看下抓到的數據有什麼加密參數,或者是得到的數據是不是加密過的亂碼,後面好針對性的進行破解
3.找到app中的網絡框架
根據抓到的host搜索網絡框架代碼,裏面無非就兩種,加密的sign參數,或者是解密前的responseBody,反正你關心的一切在裏面確定有。
4.順藤摸瓜,找到加密方法
找到加密數據的具體實現,其中有可能在Java中,也有可能在c中。不論在哪裏,細心分析代碼,哪怕它被混淆得面目全非也要保持有耐心。
5.認真研究加密方法,不要放過一絲一線
最後
破解app就像走鋼絲,有時候前面走得都很順利,一個不細心將前功盡棄一無所得,因此必定要細心,查了一個字母或者大小寫不同都不行。這確定不是一件簡單的事情,否則你當人家的架構師都是白搭的麼。另外須要具有必定的聯想能力,通常人家要加密,常常會出現聰明反被聰明誤的狀況,關鍵代碼混淆一下,因此你就專找混淆後的代碼看。另外,須要對經常使用的加密方式瞭解,以便看到代碼就能聯想到解密的方法。
最後,但願連尚的兄弟們不要記恨我哈,互聯網就是這樣,有攻防才能促進技術的進步。就算我不去破解,我不寫博客,也會有其餘人會去作,還不如早點讓你看到這帖子早點對本身加密方式進行優化,哈哈是否是頗有道理!
大家有破解什麼app,其中用到了什麼樣的加密方式呢,歡迎小夥伴們一塊兒來探討,共同進步哦!