高端大氣上檔次·玩轉微信搖色子
阿新 • • 發佈:2018-03-02
微信安全 搖色子 wechat
每次宅寢室一起點外賣,誰下去拿都是個大問題,所以小編寢室一般選擇微信色子,誰小誰去拿。但是小編運氣不太好,總是輸。所以尋思著能不能每次都讓色子是6點。果然找到了方法。
全局搜索調用這個函數的地方進行查找。
雙擊進入代碼查看,看到是SmileyGrid類型的控件。查看SmileyGrid定義。
對onItemClick中的方法一個一個分析,最後發現紅框中才是我們要找的方法。
查看a函數代碼,可以看到最下面兩個是toast,顯然不是。接下來就需要對剩下的分支進行查看。
查看之後我們知道是第一個也就是c c = ((com.tencent.mm.plugin.emoji.b.c) h.j(com.tencent.mm.plugin.emoji.b.c.class)).getEmojiMgr().c(cVar);
根據導入的包信息我們可以知道是com.tencent.mm.kernel.h並且類型是com.tencent.mm.plugin.emoji.b.c繼續看這幾處的代碼進行分析。
下面是h.j的代碼,返回是j。
下面是emoji.b.c的代碼,我們可以知道是一個接口。
在做到這裏的時候卡了好久沒什麽思路了,然後寫了一個簡單的xposed模塊hook了com.tencent.mm.kernel.h的j函數看看返回的類型是什麽。
將模塊裝安裝重啟後,打開weixin清空logcat然後點擊色子,看到了下面的輸出,可以知道輸入參數的類型是com.tencent.mm.plugin.emoji.b.c返回的類型是com.tencent.mm.plugin.emoji.PluginEmoji。然後看看PluginEmoji的代碼。
看到PluginEmoji包含了getEmojiMgr方法,重點看這個方法。
有了前面的經驗,這裏就在前面的那個模塊也hook了這個方法看看返回的具體是什麽。點擊之後在上面的提示出現了另一行。返回的具體是com.tencent.mm.plugin.emoji.e.g再去看emoji.e.g的代碼。
重點當然是分析emoji.e.g的c方法。代碼如下。通過yH.movToPosition(dM)知道dM才是關鍵,繼續追蹤bf.dM的代碼。通過導入的包可以知道來自com.tencent.mm.sdk.platformtools.bf。
看到這個Random函數還真是有點小激動啊。估摸應該是這裏了。同樣hook看一下輸入參數和返回的參數是什麽。
輸入的參數都是5和0,輸出的正好和點數相對應,3對應4點,1對應2點,1對應0點.
每次宅寢室一起點外賣,誰下去拿都是個大問題,所以小編寢室一般選擇微信色子,誰小誰去拿。但是小編運氣不太好,總是輸。所以尋思著能不能每次都讓色子是6點。果然找到了方法。
準備工作:
需要一臺已經root並且安裝了Hook神奇Xposed框架。在Hook過程中最重要的一點就是要找到Hook點這也是最難的部分。找到Hook點之後編寫Xposed模塊就比較簡單了。
本次實驗使用的weixin版本是6513。
猜想假設
我們先猜測微信搖色子是怎麽實現的。如果有簡單編程經驗的朋友肯定會猜測是random函數。其實我也是這麽猜的。
逆向分析
1. 反編譯apk
進行簡單的準備工作:使用apktool反編譯apk。使用Jadx打開微信的apk。微信較大,打開會比較慢。
2. 找到色子對應控件的id
這一步可以借助AndroidSDK提供的一個工具:uiautomatorviewer.bat。可以看到下面的界面。
可以看到色子控件對應的id是cph。然後在public.xml中找到cph對應的值為0x7f100d28。
最後用這個值去R類裏面找到真正使用的名稱為bfq
3. 查找Hook點
最難的部分就是查找hook點。在jadx中全局搜索bqf。顯然這個findViewById()才是我們要找的東西,雙擊點進去看代碼。如果有多個需要一個一個看。
上下查看這個類包含的內容。可以知道這是一個baseAdapter類。但是getView方法中沒有設置點擊事件。
全局搜索調用這個函數的地方進行查找。
雙擊進入代碼查看,看到是SmileyGrid類型的控件。查看SmileyGrid定義。
對onItemClick中的方法一個一個分析,最後發現紅框中才是我們要找的方法。
查看a函數代碼,可以看到最下面兩個是toast,顯然不是。接下來就需要對剩下的分支進行查看。
查看之後我們知道是第一個也就是c c = ((com.tencent.mm.plugin.emoji.b.c) h.j(com.tencent.mm.plugin.emoji.b.c.class)).getEmojiMgr().c(cVar);
根據導入的包信息我們可以知道是com.tencent.mm.kernel.h並且類型是com.tencent.mm.plugin.emoji.b.c繼續看這幾處的代碼進行分析。
下面是h.j的代碼,返回是j。
下面是emoji.b.c的代碼,我們可以知道是一個接口。
在做到這裏的時候卡了好久沒什麽思路了,然後寫了一個簡單的xposed模塊hook了com.tencent.mm.kernel.h的j函數看看返回的類型是什麽。
將模塊裝安裝重啟後,打開weixin清空logcat然後點擊色子,看到了下面的輸出,可以知道輸入參數的類型是com.tencent.mm.plugin.emoji.b.c返回的類型是com.tencent.mm.plugin.emoji.PluginEmoji。然後看看PluginEmoji的代碼。
看到PluginEmoji包含了getEmojiMgr方法,重點看這個方法。
有了前面的經驗,這裏就在前面的那個模塊也hook了這個方法看看返回的具體是什麽。點擊之後在上面的提示出現了另一行。返回的具體是com.tencent.mm.plugin.emoji.e.g再去看emoji.e.g的代碼。
重點當然是分析emoji.e.g的c方法。代碼如下。通過yH.movToPosition(dM)知道dM才是關鍵,繼續追蹤bf.dM的代碼。通過導入的包可以知道來自com.tencent.mm.sdk.platformtools.bf。
看到這個Random函數還真是有點小激動啊。估摸應該是這裏了。同樣hook看一下輸入參數和返回的參數是什麽。
輸入的參數都是5和0,輸出的正好和點數相對應,3對應4點,1對應2點,1對應0點.
編寫模塊
找到隨機數的返回點,接下來寫hook模塊就簡單了。還有一點要註意的是,石頭剪刀布也是用的這個隨機函數。所以寫的時候要註意一下。
最後體驗一下效果如何。
這下終於不用拿外賣了。
總結
1. 找id:對於控件的點擊事件可以用uiautomatorviewer定位到控件的id,然後通過public.xml和R類找到真正使用的類名和十六進制id。
2. 定位到關鍵代碼:接下來最難的就是定位到關鍵代碼,通常要花很多時間,多練習能夠提高速度。
3. 編寫xposed模塊:找到關鍵函數以後,編寫模塊就比較簡單了。有些app有分包的時候要註意一下。
高端大氣上檔次·玩轉微信搖色子