Android"掛逼"修煉之行---微信實(shí)現(xiàn)本地視頻發(fā)布到朋友圈功能

一、前言
前一篇文章已經(jīng)詳細(xì)介紹了如何使用Xposed框架編寫第一個(gè)微信插件:搖骰子和猜拳作弊器 本文繼續(xù)來(lái)介紹如何使用Xposed框架編寫第二個(gè)微信插件,可以將本地小視頻發(fā)布到朋友圈的功能。在這之前我們還是要有老套路,準(zhǔn)備工作要做好,這里還是使用微信6.3.9版本進(jìn)行操作,準(zhǔn)備工作:
1、使用apktool工具進(jìn)行反編譯,微信沒(méi)有做加固防護(hù),所以這個(gè)版本的微信包反編譯是沒(méi)有任何問(wèn)題的。
2、借助于可視化反編譯工具Jadx打開微信包,后續(xù)幾乎重要分析都是借助這個(gè)工具來(lái)操作的。

二、猜想與假設(shè)
做好上面這兩步之后,加上我們?cè)谥暗哪莻€(gè)編寫插件的基礎(chǔ)之上,我們本次操作就應(yīng)該非常簡(jiǎn)單了,還記得之前的插件的突破口是啥嗎?看過(guò)文章的同學(xué)應(yīng)該了解通過(guò)分析界面的控件來(lái)獲取到id值,然后全局搜索得到的突破口,那么本文其實(shí)可能不需要這個(gè)方式了,而是另外一種方式,下面來(lái)詳細(xì)介紹一下。在這之前我們先來(lái)看看微信正常的發(fā)布小視頻到朋友圈的方式,會(huì)跳轉(zhuǎn)到這個(gè)發(fā)布頁(yè)面:


那么我們又要開始大膽的猜想了:
首先這個(gè)頁(yè)面有的元素:標(biāo)題,小視頻,地理位置等信息,而這些信息應(yīng)該會(huì)在請(qǐng)求發(fā)布的時(shí)候攜帶到服務(wù)器上。這個(gè)有點(diǎn)類似于小文件的上傳功能。所以這個(gè)視頻的文件是如何得到的。那么可以得到的假設(shè):這個(gè)頁(yè)面是一個(gè)Activity頁(yè)面,可能從其他頁(yè)面跳轉(zhuǎn)過(guò)來(lái)的,同時(shí)會(huì)把這些元素信息通過(guò)intent攜帶過(guò)來(lái),而小視頻是個(gè)文件,所以應(yīng)該會(huì)攜帶文件的名稱。

三、逆向分析
有了這猜想之后,咋們就可以開始操作了,首先得到這個(gè)頁(yè)面的activity名稱,這個(gè)比較簡(jiǎn)單了,直接使用一個(gè)命令即可:adb shell dumpsys activity top


看到這個(gè)頁(yè)面的名稱是SightUploadUI,我們借助Jadx反編譯微信之后,找到這個(gè)類:

我們直接看onCreate方法中有沒(méi)有對(duì)intent參數(shù)解析操作,或者我們可以在這個(gè)類中全局搜一下getIntent字段,也可以快速得到解析的地方:

看到第一個(gè)字段Kdescription,從字段的名稱來(lái)看應(yīng)該是描述信息,而從下面的代碼setText調(diào)用更可以確認(rèn)了這個(gè)就是標(biāo)題信息。我們繼續(xù)查找:

又發(fā)現(xiàn)了一個(gè)字段KSightDraftEntrance,這塊代碼就有點(diǎn)多了,他是一個(gè)boolean類型,所以先不管了,因?yàn)楹竺婕词故菄L試的話也就兩次操作,一次false一次true。不礙事的!可是到這里我們?cè)谝菜巡坏狡渌侄瘟耍沁@個(gè)就和我們的預(yù)期不一樣了,還差幾個(gè)元素信息呢?最重要的視頻文件路徑?jīng)]有,所以這個(gè)就要想起在onCreate方法中有一個(gè)ae類初始化的時(shí)候把當(dāng)前activity傳遞進(jìn)去了,那么可能他內(nèi)部繼續(xù)進(jìn)行了參數(shù)解析,我們可以進(jìn)去查看一下:

果然在他內(nèi)部還有三個(gè)字段解析,分別是:KSightThumbPath,KSightPath,sight_md5;而從字段命名上來(lái)看猜想這個(gè)應(yīng)該就是和視頻信息相關(guān)的字段了。這里只要有Android開發(fā)經(jīng)驗(yàn)的同學(xué)應(yīng)該可以猜想:KSightPath字段是短視頻路徑,KSightThumbPath是短視頻的默認(rèn)封面圖,sight_md5是短視頻的校驗(yàn)值。到這里其實(shí)我們已經(jīng)感覺快成功了,得到了這五個(gè)參數(shù),那么我們可以直接嘗試了操作了:
在本地存放一個(gè)短視頻,封面圖片,然后計(jì)算短視頻的md5碼,最后通過(guò)intent來(lái)啟動(dòng)這個(gè)頁(yè)面即可。先不管后面的上傳過(guò)程了,咋們可以先試驗(yàn)?zāi)艹晒μD(zhuǎn)到這個(gè)頁(yè)面展示本地小視頻功能。

可惜到這里我們有一個(gè)問(wèn)題,就是怎么獲取這個(gè)啟動(dòng)頁(yè)面的activity呢?也就是用哪個(gè)activity來(lái)啟動(dòng)他呢?有的同學(xué)可能這么干?直接簡(jiǎn)單明了的編寫一個(gè)小程序,然后用小程序的activity啟動(dòng)這個(gè)頁(yè)面。這個(gè)猜想是可以的,不過(guò)我沒(méi)嘗試,因?yàn)槲蚁胛⑿抛隽薬ctivity啟動(dòng)安全防護(hù)的,不可能在其他應(yīng)用中可以啟動(dòng)微信中的任意一個(gè)頁(yè)面。所以這里我就沒(méi)費(fèi)那勁了。而是想到用微信自己的頁(yè)面來(lái)啟動(dòng)他,那么如何獲取到微信的一個(gè)其他頁(yè)面呢?這個(gè)也簡(jiǎn)單。咋們可以打開一個(gè)聊天頁(yè)面,繼續(xù)使用adb shell dumpsys activity top 命令查看頁(yè)面:


好了,就是這個(gè)LauncherUI頁(yè)面了,那么知道這個(gè)頁(yè)面下面怎么獲取這個(gè)對(duì)象呢?這時(shí)候就需要借助Xposed框架進(jìn)行Hook了,代碼如下:

看到了吧,代碼很簡(jiǎn)單的,我們hook頁(yè)面的onResume方法,因?yàn)檫@時(shí)候頁(yè)面已經(jīng)初始化完成了是整個(gè)Activity生命周期中的比較晚的一個(gè)方法了,所以攔截他就可以了。然后在攔截回調(diào)用使用MethodHookParam的thisObject屬性就可以得到這個(gè)方法所屬的對(duì)象了,也就是LauncherUI類型了。
好了既然現(xiàn)在微信啟動(dòng)頁(yè)面也有了,下面就簡(jiǎn)單了,直接構(gòu)造上面的五個(gè)參數(shù)得到intent直接啟動(dòng):

代碼很簡(jiǎn)單,咋們直接運(yùn)行模塊,然后重啟設(shè)備生效,然后打開微信界面瞬間看到效果了:

果然跳轉(zhuǎn)到這個(gè)頁(yè)面了,也就是說(shuō)我們的猜想對(duì)了,下面我們點(diǎn)擊發(fā)送,會(huì)發(fā)現(xiàn)發(fā)送失敗了:

原因可能有兩個(gè):
1、沒(méi)有弄對(duì)視頻文件的MD5碼
2、視頻格式不符合服務(wù)器接受的要求:視頻的長(zhǎng)度和視頻的大小
關(guān)于第二個(gè)原因,其實(shí)網(wǎng)上有答案,就是微信這個(gè)發(fā)布的小視頻長(zhǎng)度不能超過(guò)15s,大小不能超過(guò)1M。所以這里我就把本地視頻做成了符合這兩個(gè)標(biāo)準(zhǔn)的,再次操作依然是這樣的失敗效果。那么就有可能猜想是視頻的MD5碼校驗(yàn)出問(wèn)題了,上面看到代碼中我傳入的MD5碼是aaa,我是為了方便沒(méi)去弄。但是這里就必須寫了。獲取文件的MD5碼這里就不多解釋了,不過(guò)可惜的是,MD5弄成文件的還是失敗。那么這時(shí)候就猜想他或許不是真正意義上的MD5值了,可能加上了他自己的一個(gè)算法了。所以又來(lái)了一個(gè)問(wèn)題,如何得到這個(gè)算法呢?
這時(shí)候就需要跟蹤代碼看看其他頁(yè)面跳轉(zhuǎn)到這個(gè)頁(yè)面攜帶過(guò)來(lái)的MD5碼是什么呢?我們可以這么干就是全局搜索那五個(gè)字段中的任意一個(gè)即可,這里在Jadx中全局搜索:sight_md5

我們點(diǎn)擊進(jìn)入查看方法:

繼續(xù)查找這個(gè)方法在哪被調(diào)用了:

咋們繼續(xù)點(diǎn)擊進(jìn)入查看:

這里看到了倒數(shù)第二個(gè)參數(shù)就是那個(gè)MD5碼值,我們?cè)谌炙岩幌逻@個(gè)變量在哪里被使用到了:

看到這里有賦值的地方,點(diǎn)擊進(jìn)入查看:

然后查看這個(gè)kbVar變量,在上面的代碼中:

這里我們可以先看看這個(gè)kb類的定義:

這里的aFL就是那個(gè)MD5碼值了,我們繼續(xù)上面的那個(gè)a方法查看哪些地方調(diào)用了,不過(guò)查找是沒(méi)有效果的,因?yàn)檫@個(gè)方法可能是抽象的,所以咋們得找到他抽象定義的地方,在上面就是一個(gè)抽象類c:

然后進(jìn)入c類查看抽象方法a:

然后查找a方法調(diào)用的地方:

繼續(xù)查看這個(gè)方法的調(diào)用地方:

這時(shí)候我們多看一下,這個(gè)方法所屬的類是個(gè)單例:

那么繼續(xù)查看這個(gè)g方法被調(diào)用的地方,或者全局搜一下jJA這個(gè)變量的使用也可以的:

又回到了剛剛的那個(gè)MainSightContainerView類了,這里看到了賦值的地方了,而且是給aFL字段賦值的,這個(gè)就是上面看到kb類中的字段值,這里依然調(diào)用了一個(gè)方法計(jì)算MD5碼值,而且傳入的參數(shù)是視頻路徑:

這里首先判斷當(dāng)前視頻文件是否存在,然后在進(jìn)行文件操作:

真正加密算法是在a方法中,這里也可以看到因?yàn)橛?jì)算文件的MD5碼是耗時(shí)的,所以這里做了一個(gè)優(yōu)化,只會(huì)計(jì)算文件的前100KB數(shù)據(jù):

哎,到這里終于真相大白了,看到他的確是用了MD5算法,只是在后面自己又高了一個(gè)簡(jiǎn)單的算法。所以這里我們?yōu)榱撕?jiǎn)單,可以直接把這三個(gè)方法拷貝到我們的Xposed模塊代碼中:

然后在把之前的intent中的sight_md5字段值替換一下:

這時(shí)候咋們?cè)谥暗臄r截的onResume方法中再次調(diào)用,然后重啟設(shè)備生效,點(diǎn)擊發(fā)送:

哈哈,到這里可以看到,發(fā)送成功啦啦,好興奮呀。終于實(shí)現(xiàn)了這個(gè)功能。以后可以盡情的裝逼了。
注意:在上面我們定位一個(gè)方法在哪些地方被調(diào)用,有時(shí)候可能找不到,但是不代表這個(gè)方法真的沒(méi)有被調(diào)用,而是因?yàn)檫@個(gè)方法是抽象的,直接跟蹤可能沒(méi)有效果,這時(shí)候就需要去抽象方法的定義地方去全局搜索就可以了。

四、添加發(fā)布事件
但是到這里我們是否就結(jié)束了本次操作了,其實(shí)并沒(méi)有,因?yàn)橛械耐瑢W(xué)在上面的實(shí)踐中會(huì)發(fā)現(xiàn),有時(shí)候微信會(huì)打不開,一打開就閃退,其實(shí)這個(gè)原因是我們雖然攔截了LauncherUI頁(yè)面的onResume方法,但是這個(gè)頁(yè)面比較獨(dú)特的是微信中的首頁(yè)也是他,所以這就有可能出現(xiàn)你剛剛要打開微信頁(yè)面,有些初始化操作沒(méi)做完,而這時(shí)候你就立馬跳轉(zhuǎn)到SightUploadUI頁(yè)面去發(fā)布視頻會(huì)出現(xiàn)問(wèn)題。所以這里就存在一個(gè)發(fā)布視頻的觸發(fā)時(shí)機(jī),為了更好的體驗(yàn)效果,我們決定做到更人性化,就是添加一個(gè)菜單可以點(diǎn)擊的時(shí)候再去觸發(fā)發(fā)布視頻邏輯。那么又來(lái)了一個(gè)問(wèn)題就是如何在微信中添加一個(gè)我們自己想要的菜單?這個(gè)我覺得比上面那個(gè)還簡(jiǎn)單點(diǎn),我們準(zhǔn)備在聊天界面中選中一條消息之后彈出的菜單中加一項(xiàng)子菜單:


就是在這里,我們加一項(xiàng),有的同學(xué)覺得這個(gè)可能會(huì)比較麻煩,其實(shí)很簡(jiǎn)單,我們只要找到這個(gè)菜單定義的地方即可。直接看看步驟:想得到這個(gè)菜單定義地方很簡(jiǎn)單,咋們先去反編譯之后的values/strings.xml文件中找到這個(gè)字符串的定義:

得到他的id值是ne,然后在Jadx中全局搜索:R.string.ne

注意:這里可能有的同學(xué)會(huì)好奇,在之前一篇文章中不是得去public.xml中找到ne對(duì)應(yīng)的id整型值,然后全局搜索嗎?這里可能和微信做了資源混淆工作有關(guān),開始的時(shí)候通過(guò)整型值死活沒(méi)找到,最后無(wú)意間用了這種方式找到了。所以以后我們可以先用標(biāo)準(zhǔn)方案去public.xml中找到id對(duì)應(yīng)的整型值,如果沒(méi)找到,在使用這種方式進(jìn)行查找即可。

上面找到這個(gè)字符串定義的地方,直接點(diǎn)擊進(jìn)入即可:


這里可以看到了,使用了系統(tǒng)提供的ContextMenu類進(jìn)行菜單定義的,這里就需要你對(duì)這個(gè)類了解了。后面添加菜單就必須用add方法來(lái)進(jìn)行添加了,不過(guò)這個(gè)方法還是比較簡(jiǎn)單的,參數(shù)都比較好理解主要是菜單組的id值,菜單自身的id值,菜單名稱,然后在設(shè)置點(diǎn)擊事件即可。下面我們繼續(xù)看這個(gè)方法在哪里被調(diào)用了:

不過(guò)這個(gè)方法跟蹤沒(méi)有結(jié)果,猜想他可能是一個(gè)抽象方法,所以就去他定義的地方進(jìn)行查看y類:

果然是一個(gè)抽象方法,這里在跟蹤就可以了:

點(diǎn)擊查找結(jié)果:

繼續(xù)看這段代碼之前的方法和類定義:

這里有一個(gè)變量fHr,也就是菜單創(chuàng)建的回調(diào)接口,在往上面查看:

到這里就看明白了,在ChattingUI有一個(gè)內(nèi)部靜態(tài)類a,在這個(gè)類內(nèi)部開始創(chuàng)建菜單,然后定義一個(gè)fHr變量代表菜單創(chuàng)建的回調(diào)接口類型,然后在onCreateContextMenu回調(diào)方法中進(jìn)行子菜單添加工作。

好了上面就分析了菜單的創(chuàng)建代碼,下面咋們就開始操練了,還是得借助Xposed進(jìn)行攔截了,這次攔截哪個(gè)呢?咋們可以攔截ChattingUI這個(gè)類的靜態(tài)內(nèi)部類a,然后我們自己在定義一個(gè)創(chuàng)建菜單的接口,去替換fHr變量的值,最后我們只要在我們的回調(diào)接口中操作即可:



這里攔截代碼也是比較簡(jiǎn)單的,主要是定義我們自己的回調(diào)接口,然后在替換fHr值即可,再來(lái)看看接口定義:



這里才是最關(guān)鍵的代碼了,在onCreateContextMenu回調(diào)方法中創(chuàng)建一個(gè)菜單,但是這里有一個(gè)問(wèn)題就是怎么獲取到菜單組的id值,這個(gè)我們還得回到開始的那個(gè)添加菜單代碼:

看到,這里他是先通過(guò)view的tag得到dd對(duì)象,然后在調(diào)用position屬性即可,那么我們操作也就簡(jiǎn)單了,繼續(xù)使用反射機(jī)制就可以得到這個(gè)值了。代碼如上。
代碼編寫完之后再次運(yùn)行之后,重啟設(shè)備生效,打開一個(gè)聊天室然后選中一條消息:



哈哈看到這個(gè)菜單選項(xiàng)了,咋們點(diǎn)擊之后就可以跳轉(zhuǎn)到發(fā)布頁(yè)面了:

五、知識(shí)概要與技巧總結(jié)
好了到這里我們就完成了本文提到的如何將本地小視頻發(fā)布到朋友圈功能實(shí)現(xiàn),下面來(lái)總結(jié)一下本文的實(shí)現(xiàn)步驟以及能夠?qū)W習(xí)到的逆向技巧:
1、首先猜想微信發(fā)布視頻的頁(yè)面中的幾個(gè)重要元素信息:標(biāo)題,視頻信息,地理位置等,然后這些信息可能在其他頁(yè)面通過(guò)intent傳遞過(guò)來(lái)的,那么應(yīng)該不可能傳遞整個(gè)視頻數(shù)據(jù),而是視頻路徑。
2、帶著猜想就去實(shí)踐,使用命令找到發(fā)布視頻的頁(yè)面activity名稱,然后去jadx中找到這個(gè)類分析intent中的字段,果然能夠得到五個(gè)重要的參數(shù)信息:Kdescription,KSightDraftEntrance,KSightThumbPath,KSightPath,sight_md5。
3、然后有了這五個(gè)字段再次猜想每個(gè)字段的含義,然后就直接做了一個(gè)簡(jiǎn)單的實(shí)驗(yàn),在本地存放視頻和封面圖,然后在代碼中構(gòu)造一個(gè)intent,啟動(dòng)即可。
4、但是在啟動(dòng)頁(yè)面的時(shí)候發(fā)現(xiàn)有一個(gè)問(wèn)題就是微信應(yīng)該做了頁(yè)面啟動(dòng)的安全檢查,有些頁(yè)面只能在應(yīng)用中其他頁(yè)面啟動(dòng),所以這里還需要得到微信中的一個(gè)頁(yè)面。這里就用了聊天界面,依然使用adb命令獲取聊天頁(yè)面類名稱,然后借助Xposed進(jìn)行這個(gè)頁(yè)面的onResume方法攔截,然后在攔截之后啟動(dòng)發(fā)布視頻頁(yè)面。
5、實(shí)驗(yàn)之后發(fā)現(xiàn)既然可以直接調(diào)用起來(lái),說(shuō)明上面的第一步猜想對(duì)了,那幾個(gè)字段我們也猜對(duì)了,但是這時(shí)候發(fā)現(xiàn)點(diǎn)擊發(fā)送的時(shí)候出現(xiàn)了失敗現(xiàn)象。然后分析失敗的原因有兩個(gè):一個(gè)是微信服務(wù)器對(duì)發(fā)布的視頻做了時(shí)長(zhǎng)和大小限制,還有一個(gè)原因是視頻的MD5碼計(jì)算錯(cuò)了。我們通過(guò)修改本地視頻的大小和時(shí)長(zhǎng)之后再次實(shí)驗(yàn)發(fā)現(xiàn)還是失敗,所以可以猜想應(yīng)該是視頻的MD5碼計(jì)算錯(cuò)誤了,微信自己有一個(gè)算法,所以得找到這個(gè)算法邏輯。
6、下面就是常規(guī)路線借助Jadx的查找方法調(diào)用功能進(jìn)行跟蹤,在這個(gè)過(guò)程中學(xué)到一個(gè)技巧就是如果發(fā)現(xiàn)一個(gè)方法沒(méi)有被調(diào)用有可能是因?yàn)檫@個(gè)方法是抽象的,具體得去抽象類中定義的地方繼續(xù)跟蹤才有結(jié)果。
7、最終跟蹤到了MD5碼的算法,我們?yōu)榱撕?jiǎn)單,直接把那幾個(gè)方法拷貝出來(lái)改一下直接使用,計(jì)算視頻的MD5碼,再次實(shí)驗(yàn)之后發(fā)現(xiàn)發(fā)送成功了。
8、在最后發(fā)現(xiàn)一個(gè)問(wèn)題,就是微信的很多頁(yè)面都叫做LauncherUI,所以如果攔截這個(gè)方法的onResume方法然后就發(fā)送視頻的話會(huì)出現(xiàn)問(wèn)題,導(dǎo)致微信啟動(dòng)失敗。所以這里就想弄一個(gè)事件來(lái)控制發(fā)送操作。
9、在聊天頁(yè)面中選中一條消息之后可以彈出一個(gè)菜單選項(xiàng),決定在這里添加一項(xiàng)來(lái)觸發(fā)發(fā)送操作,這里定位到菜單的創(chuàng)建過(guò)程中,用到了前一篇文章中提到的查找資源id方法,但是這里需要注意的是可能微信自己做了資源混淆策略導(dǎo)致這個(gè)方法查找id值是失敗的,最后直接使用R.string.xxx這種方式找到了。

學(xué)習(xí)到的技巧:
1、新的逆向突破口,快速定位頁(yè)面,使用adb shell dumpsys activity top命令即可。
2、使用Jadx進(jìn)行方法跟蹤時(shí)候如果發(fā)現(xiàn)沒(méi)有結(jié)果,可能這個(gè)方法是抽象的,需要找到這個(gè)抽象方法最原始的定義的地方繼續(xù)跟蹤即可。
3、微信可能做了資源混淆(或者以后遇到做了資源混淆的apk)的時(shí)候,如果發(fā)現(xiàn)通過(guò)public.xml中的id值查找不到結(jié)果,可以直接使用R.xxx.xxx進(jìn)行查找id值。

六、說(shuō)明
1、其實(shí)本文還可以做一個(gè)效果,就是上面在看到聊天界面選中一個(gè)消息的時(shí)候彈出一個(gè)我們自己定義的菜單,可以獲取到這個(gè)消息的類型(視頻,文字,圖片,表情等),以及具體信息,直接發(fā)送分享。而這個(gè)就需要解析選中之后的消息內(nèi)容了,當(dāng)然這個(gè)是在本文的項(xiàng)目代碼中已經(jīng)做了。這里我就不做分析了。
2、因?yàn)楸疚氖褂昧宋⑿?.3.9版本,所以這里進(jìn)行攔截的方法有:
com.tencent.mm.ui.LauncherUI的onResume方法。
com.tencent.mm.ui.chatting.ChattingUI.a的構(gòu)造方法,替換fHr變量值。
對(duì)于每一個(gè)版本混淆之后的類名會(huì)發(fā)生變化,所以不要一味的用本文提到的代碼去實(shí)踐,要先看懂所有的逆向流程,具體版本具體分析才是王道。

嚴(yán)重聲明
本文的目的只有一個(gè),分享更多逆向知識(shí)以及逆向技巧,沒(méi)有任何商業(yè)目的操作,如果有人利用本文知識(shí)實(shí)現(xiàn)任何商業(yè)目的帶來(lái)的一切法律責(zé)任將由操作者本身負(fù)責(zé)。與本文和作者沒(méi)有任何關(guān)系。也由衷的希望每位讀者能夠秉著技術(shù)學(xué)習(xí)的態(tài)度閱讀。

七、總結(jié)
本文就詳細(xì)介紹完了利用Xposed框架實(shí)現(xiàn)微信發(fā)送本地小視頻的功能,對(duì)于這個(gè)功能個(gè)人認(rèn)為還是有用的,但是對(duì)于有些人可能并沒(méi)有那么用,因?yàn)楝F(xiàn)在在朋友圈中發(fā)布視頻的人會(huì)很少,因?yàn)榧词拱l(fā)布了由于流量的限制不會(huì)有什么效果的。然后就是其實(shí)微信對(duì)于小視頻做了還是有很多限制的,而這些限制都是在服務(wù)端進(jìn)行的,比如視頻的校驗(yàn),時(shí)長(zhǎng),大小等。這也就粉碎了小編想發(fā)布一個(gè)幾G的電影到朋友圈的夢(mèng)想。最后當(dāng)然還是希望每位讀者能夠從本文學(xué)習(xí)到更多的逆向技巧,小編沒(méi)寫這樣逆向文章就會(huì)很累,感覺自己被掏空了一樣,所以大家看完一定要記得多多點(diǎn)贊啦,如果有打賞就更好了!

更多內(nèi)容:點(diǎn)擊這里

關(guān)注微信公眾號(hào),最新技術(shù)干貨實(shí)時(shí)推送


[圖片上傳中。。。(48)]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,520評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,541評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,896評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,062評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,608評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,356評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,555評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,769評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,289評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,516評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,737評(píng)論 25 708
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,853評(píng)論 0 15
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,173評(píng)論 4 61
  • 相關(guān)文章Java并發(fā)編程(一)線程定義、狀態(tài)和屬性 Java并發(fā)編程(二)同步Java并發(fā)編程(三)volatil...
    劉望舒閱讀 5,249評(píng)論 1 31
  • 總是問(wèn)我,指著右手上的“裝備”,“媽媽,這是什么?”,“這是……這是奧特曼的拳頭,大拳頭,可以嗖地一下就飛上天空!...
    燃燒吧少年閱讀 221評(píng)論 0 0