Android 微信搖骰子和猜拳作弊器原理解析
一、前言
在之前的一篇文章中我們已經(jīng)詳細介紹了Android中Hook工作的一款神器Xposed工具:Xposed框架原理解析和使用案例分析 在那一篇文章中我們介紹了如何安裝Xposed框架,以及如何使用Xposed庫編寫第一個模塊來做到修改系統(tǒng)方法功能的效果,同時也說到了一個非常重要的知識點就是:在Hook過程中最重要的一點就是如何找到Hook點,而對于這一點很多同學都會感覺到非常的困難,因為對于修改系統(tǒng)方法還好,因為可以簡單的去查看具體的Android源碼即可,但是如果說要去編寫一些應用和游戲的外掛的話,那么第一步就得先去破解對應的App找到指定Hook點,這一步是非常困難的。所以只能多嘗試多破解慢慢長點經(jīng)驗即可。
- 軟件名稱:
- 微信專用骰子插件下載
- 軟件功能:
- 控制骰子點數(shù)(單發(fā)或連發(fā))
- 適配機型: 安卓4.0以上和蘋果手機
- 立即下載
二、猜想假設
本文就借助之前的Xposed框架來介紹如何編寫微信的一個外掛功能,這個功能就是微信搖色子和剪刀石頭布的作弊器,我們用過微信這個功能都知道,是一個比較常用的功能,因為在一個群聊中會很無聊就來這種簡單的比賽,誰輸了發(fā)紅吧啥的。那么這個功能肯定伴有隨機性,而且我們應該相信這個隨機方法肯定是在微信代碼中的某個地方,所以如果我們找到這個方法了,那么就可以進行Hook他,然后攔截返回最大的數(shù)值即可,也就是我們想要得數(shù)值。
三、準備工作
上面大致分析了這個功能的原理使用,下面咋們就不多說了,直接進行操作,本文用了一個微信的老版本做測試的:微信6.3.9.apk ;那么第一步咋們得逆向微信,需要做兩個工作:
第一先使用apktools反編譯apk,這個不用多說了,微信沒有對應用進行加固,所以反編譯過程很正常。
第二需要借助可視化反編譯工具Jadx來打開微信apk,因為微信應用很大,所以得慢慢等待一會才可以打開。
四、逆向分析
下面在來冷靜分析一下如何我們該怎么入手?上面反編譯成功了之后,還得尋求入口,這個入口也很簡單的,因為我們想得到這個隨機函數(shù),那么在我們能看到的效果是色子,我們可以選擇一個微信聊天對話框,然后點擊一個色子功能:
看到了,我們點擊色子之后肯定會調用這個隨機函數(shù)獲取隨機值,那么這里就是我們的入口,所以第一步肯定先找到這個點擊事件,如果要找到點擊事件,那么就得先找到這個控件的定義,那么問題來了,如果能夠快速的找到這個控件的定義呢?這個技術在我之前的一篇文章中已經(jīng)介紹了,就是 微信的自動搶紅包功能 當時因為要找到那個紅包的點擊事件,所以就用同樣的方法來得到那個紅包的控件定義的地方,而這個方法就是借助AndroidSDK提供的一個工具:uiautomatorviewer.bat 這個工具位于SDK目錄的tools目錄下,我們可以點擊運行,然后就可以看到這個界面了:
我們把設備停在聊天對話框中,然后使用這個工具,點擊左上角那個按鈕,可以進行當前桌面的界面布局分析,分析結果我們可以看到,這個色子是一個自定義控件:com.tencent.mm.ui.MMImageView,然后他的id是ae7,而這個值非常關鍵,后面就是用這個值來進行一步一步的跟蹤,這里我們再多看一眼,就是這個表情區(qū)域的詳細布局:
猜也猜到了,表情區(qū)域外面應該是一個ViewPager控件可以進行滑動切換,然后是每一頁的控件用的是GridView進行卡片分割,那么這里就會給我們一個提醒了:后面的點擊事件要么是在GridView的適配器類的getView方法中對view進行setOnClickListener添加的,要么是對GridView添加onItemClick事件的。
好了下面繼續(xù)跟蹤,因為有了那個色子控件的id了,下面咋們可以直接用這個id去全局搜索這個值了,不過這里有個問題就是微信其實本身做了資源的混淆,而這個混淆一方面是加大安全工作,一方面是減小包的大小功能,我們可以使用解壓工具簡單的查看他的apk文件中的res目錄,會發(fā)現(xiàn)全是字母文件夾。而且從上面的id命名也可以看到,我相信微信工程師不可能會傻逼的把一個id命名成ae7了吧?到這里我們又要借助一個知識點了,而這個知識點在我之前的一篇文章中介紹了:Android中的應用攻防之戰(zhàn) 在這篇文章中介紹了,我們在反編譯apk之后,其實apk所有的資源id值都會保存在一個public.xml文件中,而這個文件是放在values目錄下的,這個文件主要存放的就是資源的id值和name,type之間的對應關系,而反編譯之后的代碼中一般不會用R.id.xxx這種樣式來訪問控件,而是用轉化之后的id值,這個值是十進制的,所以我們得先用上面那個ae7的id值去public.xml文件中找到對應的十六進制值:
注意:
這里在查找ae7的時候,會發(fā)現(xiàn)多個匹配項,而我們需要用額外的信息來作區(qū)分,那就是type字段了,type字段有很多種值,比如layout,drawable,string,attr,id等,我們這里因為是定義控件的所以type=id。
找到這個項之后,就把后面id的十六進制值轉化成對應的十進制值吧:0x7f07060e=2131166734
有了這個值,就好辦了,咋們直接在Jadx中打開的微信apk中全局搜索這個值:
哎,可惜的是沒有找到,所以到這里就開始蛋疼了,也是這次逆向的最大阻礙了,想了好長時間,最后才突然想起來以前 逆向微信的本地通訊錄信息 的時候發(fā)現(xiàn)微信采用了分包技術,也就是微信包太大,因為Android系統(tǒng)中有方法數(shù)的限制所以需要對apk進行拆包操作,具體可以查看這篇文章:Android中應用拆包技術詳解 那么我們會發(fā)現(xiàn)反編譯之后也沒有看到多個dex文件,所以這時候還要猜想他應該是存在本地目錄的,在應用啟動的時候主dex功能再去加載這個次dex文件,通過查看反編譯之后的目錄,結果在assets目錄下找到了他:
而這個是兩個從dex文件,這里他做了dex文件轉成jar文件的操作了,所以我們先用解壓工具解壓這個jar文件,得到對應的dex文件即可。然后咋們在開啟一個Jadx窗口打開這個從dex文件,然后在全局搜索上面的那個值:
看到了,終于找到了這個控件的定義的地方了,點擊第一個進去查看:
我們在往下面看這個類的信息,會發(fā)現(xiàn)到有一個getView方法:
看到這個就可以判定了,這個類其實是一個BaseAdapter類型了,而在getView中沒有看到控件的點擊事件,所以猜想應該是外部給GridView添加的onItemClick事件了,咋們繼續(xù)選中這個類名,然后右擊進行跟蹤這個類在哪些地方被調用了,這個功能的確很實用的:
點擊查找之后,會有很多地方調用:
這里從第一項的那個參數(shù)命令可以猜想到了應該就是GridView類型,而到這里我們貌似看到了勝利的曙光了:
然后查看這個smileyGrid變量的定義:
這里是一個SmileyGrid類型的,咋們可以全局搜索這個類,看看他的定義:
果然不出所料,這里是一個GridView類型,然后也看到了我們非常期待的onItemClick方法了,下面就開始分析這個onItemClick方法的邏輯了:
這里我沒有找到一個好的辦法,也不想去深入跟蹤了,因為這里的判斷分之不是很多,所以就順序的嘗試了每個方法,結果找到了最后一個a方法,然后點進去查看邏輯:
這里我們就需要多想點了,從我們點擊色子之后的效果看,沒有對話框和toast提示,那么這里就只有兩個分支是最有可能執(zhí)行的了,通過順序嘗試之后,發(fā)現(xiàn)是第一處分支的邏輯了,也就是h.a.aMZ.b()這個方法執(zhí)行了,通過import導入的類,得到這個類的路徑定義:
但是在這個dex中沒有找到這個類,所以猜想應該是在主dex中,果然找到了這個類定義,然后進入這個類進行想詳細查看:
繼續(xù)進入看看b方法的定義:
擦,這里的b方法盡然返回的是null,那么到這里就要思考了,如果返回null的話,之前的點擊事件肯定是無效的,而這個又不符合實際情況,所以猜想還有哪個地方對這個iop進行賦值操作了。我們看看這個iop定義:
從定義上可以看到,極大可能在其他地方進行了賦值操作,所以咋們?nèi)炙阉鬟@個變量值iop:
發(fā)現(xiàn)搜索結果還是我們剛剛看到的返回null的代碼,所以咋們又得繼續(xù)去另外一個dex中進行搜索了:
這里搜到了一個賦值操作,立馬點擊進入查看:
然后查看PD方法的定義:
繼續(xù)查看這個g類定義:
看到他的b方法,這里有一個bb.pu這個方法比較可疑,因為最終返回的值都是和他相關的,而這個方法在這個dex中又沒有找到,所以咋們看一下他的import找到全局定義路徑,然后去另外一個dex中查看定義:
到這里,就會非常激動了,因為我們看到了勝利了,這個非常明顯的隨機方法終于找到了,而通過這個隨機公式可以看到,這個方法的功能是返回一個0-i之間的隨機值,而對于色子應該是0-6之間的值,猜拳是0-3之間的值。所以這個方法百分百是用于隨機功能的。
五、掌握逆向技能
到這里我們就成功的找到了我們想要Hook的地方了,從上面的逆向過程會發(fā)現(xiàn)微信的工程非常龐大,而對于我們逆向來說工作是非常艱難的,但是還好我們有一些強大的工具可以快速的定位問題,下面就來總結本文逆向收獲的知識:
第一、對于逆向中想得到控件點擊事件入口,可以通過以下步驟來進行
1、使用界面分析工具得到指定控件的id名稱
2、通過id名稱去反編譯之后的values/public.xml中查找到指定的值,轉化成十進制
3、通過Jadx自帶的全局所有功能,查找這個十進制值即可
對于這個步驟將適用于想得到一個應用中某個控件的點擊事件邏輯入口是非常有效的,而且也是通用的方法。
第二、對于微信來說,因為工程的龐大,所以肯定會存在拆包現(xiàn)象,所以他不止一個dex文件??隙ㄊ前鄠€dex文件的,所以后面還需繼續(xù)寫微信的外掛,到時候分析都是要注意這一點。
第三、對于Jadx的強大工具在本文中起到了非常重要的功能:跟蹤方法的調用,全局查找功能。
額外說明:
在本文中我們會發(fā)現(xiàn)有一個難受的地方就是多個dex文件之間查找相應的方法的地方,所以其實我們可以這么干,我們?nèi)绻玫搅藨盟械膁ex文件之后,可以將其先轉化成對應的java類,然后進行類合并,這里我們可以使用Beyond Compare比較工具將多個不同文件夾合并到一起:
合并之后咋們在用工具將其轉化成一個dex文件,也就完成了多個dex文件合并工作了。在這個工程中,我們可以非常巧妙的借助Jadx的另外一個強大功能,就是可以把反編譯之后的內(nèi)容保存到本地:
他有個好處就是,把apk中的dex保存成java文件,資源全部解碼保存指定xml文件,而最終的保存樣式是一個gradle工程,而這個工程咋們就可以直接導入到一個開發(fā)工具中了非常方便了。特別是資源文件,我們在之前會發(fā)現(xiàn)apktools工具并沒有反編譯xml文件出來。而在這里就可以了。
六、開始攔截操作
下面咋們就來進行Hook操作了,上面已經(jīng)得到了這個隨機函數(shù)的名稱了:
com.tencent.mm.sdk.platformtools.bb.pu(int i)
Hook工作就非常簡單了,咋們攔截這個方法之后根據(jù)傳入的值做一次判斷是搖骰子還是猜拳操作:
首先咋們得做一次過濾操作,就是只會Hook微信應用,然后到攔截操作中,通過傳遞的參數(shù)做判斷是搖色子還是猜拳,如果是搖色子就返回一點,猜拳就返回剪刀。
編寫成功之后,就進行編譯成模塊,然后重啟設備生效,點開微信打開一個聊天框,開始搖色子:
通過打印值可以看到,我們的猜想是正確的,看一下實際效果:
哈哈哈,所有的操作都在掌控之中,到這里我們也成功的編寫了一個微信外掛功能,而這個外掛可能有的同學感覺用途不是那么大,而現(xiàn)在主流的外掛是可以防止撤銷功能,分享視頻到朋友圈,不過這些功能都會慢慢講解的,不要著急,而對于本文以及后續(xù)的外掛內(nèi)容文章,我想表達的是,結果并不重要,重要的是整個逆向過程,在每次一逆向之后我們學到了什么,是否漲了逆向經(jīng)驗,這才是我們需要得到的。
補充說明:
第一點:有的同學會發(fā)現(xiàn)咋們上面得到的那個方法貌似是混淆之后的,也就說如果哪天微信改了混淆機制,那么這個Hook就失效了,本文中用到的是微信6.3.9的版本,對于其他版本我想這個方法類名應該是變了,也就說如果微信每次出一個版本咋們都得去逆向一次得到方法名,但是這個都不是難事,以為本文已經(jīng)將整個逆向過程講解了,所以以后只要按照這個步驟來,查找方法也是分分鐘的事!
第二點:本文的用意是分享逆向技巧知識點,所以也請各位同學能夠知道結果不重要,重要的是整個逆向的過程,也就是如何尋找到Hook點
嚴重聲明:本文介紹的知識點完全是從一個技術分享角度出發(fā),絕非用于任何商業(yè)活動和用途,如果涉及到任何法律問題將由操作者本人負責。本文作者將不負責任何法律責任!也請各位同學秉著技術角度出發(fā)的原則,切勿用于商業(yè)中!
七、總結
本文主要介紹了一個微信的簡單外掛功能,就是搖色子和猜拳作弊器功能,而在整個過程中,我們可以看到找到Hook點才是最關鍵的,而最難的也是找到這個點。一般都是需要進行逆向分析微信應用找到這個點。在這個過程中我們又學習到了一些新的逆向應用技巧知識點,后續(xù)將會繼續(xù)帶大家一起分享其他的外掛功能知識點,敬請期待,同時也要多多支持擴散分享啦,也要多多點贊呢?寫這篇文章實屬不易呀,因為逆向的我頭都炸了!
相關文章
android編程獲取和設置系統(tǒng)鈴聲和音量大小的方法
這篇文章主要介紹了android編程獲取和設置系統(tǒng)鈴聲和音量大小的方法,實例分析了Android針對音頻的相關操作技巧,需要的朋友可以參考下2017-06-06Android 使用SwipeRefreshLayout控件仿抖音做的視頻下拉刷新效果
這篇文章主要介紹了Android 使用SwipeRefreshLayout控件仿抖音做的視頻下拉刷新效果,需要的朋友可以參考下2018-05-05Android自定義狀態(tài)欄顏色與應用標題欄顏色一致
看IOS上的應用,應用中狀態(tài)欄的顏色總能與應用標題欄顏色保持一致,用戶體驗很不錯,對于這種效果怎么實現(xiàn)的呢?下面小編給大家分享android自定義狀態(tài)欄顏色與應用標題欄顏色一致的實現(xiàn)方法,一起看看吧2016-09-09Android開發(fā)RecyclerView單獨刷新使用技巧
本篇文章主要是分享下RecyclerView中子item如何單獨刷新以及子item的某一部分內(nèi)容如何實現(xiàn)單獨刷新,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09