關于微信公衆号《雲爬蟲技術研究筆記》可以看到更多哦!
背景
最近發現搜狗微信在2019.10.29号的時候悄然下線了一個功能,也就是不能在搜狗搜索中指定公衆号的名稱,如下圖
很多媒體以及社區也在讨論相關的話題
這樣的話,我們就沒有辦法準确的搜索到某個公衆号的最新的文章了,所以我們要是想要去實時追蹤到某個公衆号的最新文章的話,就不能通過搜狗這個渠道來爬取了。
于是,我整理了一下截止目前的微信公衆号的爬取方式
實戰
實戰方面參考了四哥的文章做了些改進,下面我們開始邊分析邊實戰
講一個常識,像微信這種社交類的App,我們和對方在發消息的過程中的聊天記錄都是會保存在我們本地,所以我們通常都能看到我們的聊天記錄,也可以清理他們,所以如果我們想要攔截微信的消息的話,就得Hook微信的Insert方法,也就是他們插入數據庫的方法。
那我們該從哪裡入手呢?相信大家百度搜索Hook微信的時候都會搜到一類内容,就是如何解密微信本地的數據庫,而微信在我們手機上的存儲位置又有一個關鍵詞--EnMicromsg.db,這個就是我們的入口,我們需要在微信源碼中全文搜索這個詞,我們使用的微信是6.5.3,工具是Jadx,實際操作如下
我們搜索出EnMicroMsg.db之後就要每個結果去分析看哪個是比較有“眼緣”的結果。我們可以看到,第三條名字是onSQLExecuted,嗯?有點像,跟進去看看。
主要看最後一條,引用了另一個方法進行存儲,再跟進去
看到了涉及數據庫的Help類,我們猜測這個類應該是一個輔助類,那麼Insert方法應該在這個類下面,我們在這個類中搜索
好的,我們跟到這裡能夠看到很直觀的Sql語句拼接的過程,那麼這個方法的參數應該是我們收到的消息的值,隻要Hook這個方法,我們就可以去拿到插入數據庫時的值了。
代碼片段就是這個樣子,下面我們把這個代碼打包成Apk,勾選,重啟Xposed,下面可以發送消息測試看看效果了。
我們首先先用另一個微信号給我們自己發送普通的消息
看到這裡,Content的字段,值就是我們發送的1
接着我們再用另一個微信号給我們發送公衆号文章
可以看到一大段代碼,我們看到Reversed字段是由很多亂碼和字段以及值組成的,那麼我猜測微信内部實現了一個解碼工具,如果我們能夠Hook到這個解碼工具,是不是就可以獲取到解碼之後的正确數據了呢?說到解碼,根據微信以往的數據傳輸來看,這些數據很有可能是以XML的格式進行傳輸的,既然涉及到xml,那就一定是鍵值對的形式,我們去到的數據中除了有亂七八糟的小方塊,還有諸如“.msg.appmsg.category.item”這類看起來有用的内容。
我們在全文搜索一下
奇怪?我們并沒有發現什麼值得的東西?怎麼回事,回想一下是不是我們發送的消息有問題?對!我們應該拿的是微信公衆号的推送,而不是别人向我們推的公衆号文章,那我就用我的公衆号給我自己推一個預覽消息,結果如下
我們再根據剛才的邏輯,全文搜索msg.appmsg.mmreader.category.item,之後我們一個個分析,看到下面這個部分,跟進去
我們查看這一段代碼,看到下面這個部分有我們之前攔截到的消息的參數
我們發現我們需要的字段的值都來自于Yd,而Yd來自于az.Yd,那很可能這個就是我們想要Hook的解密器,我們跟進去看看
這段代碼看起來很像是解碼的,話不多說,Hook試試!
不出我們的猜想,這個方法果然是,我們再進行解析,得到如圖的效果。總結
這次Hook算是比較簡單的案例,主要是尋找Hook方法的思路,把微信公衆号的推送當成一個消息,我們去Hook這個消息存入數據庫的過程從而得到原生數據,再找到原生數據解密的地方,從而通過Hook原生數據解密的方法得到正确的解碼數據,最後完成我們的實時獲取微信公衆号推送的目的。
坑點
注意: 項目已經完成,想要獲得源碼可以關注下面的微信号,回複“hook微信公衆号”即可獲得項目地址以及現成的Apk
号主介紹
震驚 | 隻需3分鐘!極速部署個人Docker雲平台
深入理解Python的TLS機制和Threading.local()
我為什麼不建議你使用Python3.7.3?
下一代容器架構已出,Docker何去何處?看看這裡的6問6答!!
公衆号内回複“私藏資料”即可領取爬蟲高級逆向教學視頻以及多平台的中文數據集
免責聲明: 本文章僅限用于學習和研究目的;不得将上述内容用于商業或者非法用途,否則,一切後果請讀者自負。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!