xposed安卓分析源码破解视频APP的原画特权
???????? 本文主要目的是交流學習Xposed的使用技巧,以及給大家分享一下分析問題的思路。
???????? 有一天在用某視頻APP看視頻的時候,發現“高清”的清晰度也很糊,看得腦闊痛,就想選擇更高的清晰度,結果告訴我需要激活特權
。
???????? 可是要軟妹幣啊,本來人就窮,沒辦法,只有自己動手去搞一波。
???????? 因為準備使用xposed去修改代碼執行邏輯,所以得需要知道原先的代碼是怎樣的。首先,準備好jadx用于反編譯APK文件,開開心心選擇安裝包。結果
?用了360加固,瞬間懵逼。只得google一下:https://blog.csdn.net/u014476720/article/details/83383659,一番折騰后,終于拿到了它的dex源碼
?
?????? 現在拿到了dex源碼,jadx也準備就緒,得先掐住它的七寸,知道它的關鍵代碼在哪里。
???????? 我的方法是利用Android studio 的Layout Inspector,隨便打開一個項目
這樣就能知道是哪個Activity,而且在后面分析頁面上的控件時用處也很大。
現在打開TVIJKPlayNewActivity:由于是多dex文件,這個Activity可能需要一個一個地用jadx反編譯dex才能找到,反編譯完成后通過jadx File->Save as cradle project,保存下來(我們的安裝包.apk也要執行一下此操作,因為dex不包含資源文件,我們后面要使用到這些資源),后面再用Android Studio打開會方便使用。PS:后面在TVIJKPlayNewActivity查找關鍵方法失敗了,在此記錄下查找過程。
將dex反編譯保存完成后,我們還需要再次jadx反編譯安裝包.apk,
雙擊resources.arsc,把里面的內容全選復制,另外保存到文本中,這里面包含了布局文件、viewId、drawable等元素的id,后面用文本編輯工具可以方便地進行查找,用id查找文件名,或用文件名查找對應的id。
現在準備工作完成,可以繼續下一步。
前面說到,播放頁面是在TVIJKPlayNewActivity,那么我們打開之后,又找不到從何下手,不知道如何才會觸發到切換清晰度的方法。我的做法是繼續Layout Inspector生成手機屏幕快照,
可以看到id/tv_projector_video_quality,那我們打開剛剛的記事本,查找tv_projector_video_quality,可以看到記錄是? 0x7f110355 (2131821397) = id.tv_projector_video_quality: false,括號里面的2131821397就是我們需要的真實id,
由此就能知道在這個點擊事件里面有點東西
繼續找到myMediaController,去尋找它的showQualityLayout()方法。從字面意思就知道,這個方法是展示清晰度的布局,繼續跟進。
看到2052行的view.setVisibility(0),0是代表顯示,那猜測this.llQuality就是清晰度在的地方。
找到它被初始化的地方
反推出這個控件的布局id就是2130969697
去記事本查找2130969697,找到? 0x7f040461 (2130969697) = layout.player_controller_full: res/layout/player_controller_full.xml,知道它的布局文件名為player_controller_full。這個布局文件里面的mediacontroller_ll_quality就是包含清晰度的控件( 查找2131823211, 0x7f110a6b (2131823211) = id.mediacontroller_ll_quality: false)
?胡亂都能猜測出mediacontroller_tv_quality_super是原畫的控件。
知道是這個控件后,回到IjkMediaController,找到這個控件的點擊? 0x7f110a6c (2131823212) = id.mediacontroller_tv_quality_super: false,id為2131823212,
找到點擊事件為qualitySuperListener,在
分析在365行,進入PlayerAction查看
,但是后面的d.b
是阿里的啥代碼,反復查找都找不到相關的邏輯處理
?結果都是
溜了溜了。
剛才通過播放頁面去查找關鍵代碼的方式失敗,轉變思維,想一想它不僅在播放的時候可以切換清晰度,在緩存的時候同樣也可以切換清晰度,那么我們就從緩存去下手。
繼續用屏幕快照,
打開這個Activity
總代碼不到200行,分析也會方便很多。
一眼就找到關鍵字tv_quality:清晰度,似乎這個就是選擇清晰度的控件了
映入眼簾的@BindView,這似乎是ButterKnife的風格,而且它的可見修飾符是default,那么在同級包下肯定有東西會訪問到這個控件。
果不其然,有一個ViewBinder的類,繼續打開往下分析:
一眼就看到了showSelectDialog()有點東西,那么繼續回到DownloadDramaActivity,去尋找這個方法
繼續往下
到這里就有點東西了,一看就能猜出來點擊清晰度后執行的方法是boolean a(int i)。跟進SelectDialogFragment
并找到關鍵代碼
Boolean a(int i)返回 true就切換成功,反之就切換失敗,那回到showSelectQualityDialog,
?看到在118行,mPresenter.a(i)還會執行操作,繼續跟進。發現mPresenter被強轉為b類型,那我們就還要找到這個b,
進入b類并找到a()方法
似乎b(i)返回true后,整個方法塊也就返回true了,繼續找到b(i)
看來還要繼續往前跟進到utils.b類的e()方法
到此處似乎足夠了,已經看到了原畫的影子,如果繼續走到d里面,那下面的f還會受到影響。先到此處不要走動。我們去寫Xposed把這個方法修改一下返回值試試。
?
開始編寫Xposed模塊
由于安裝包.apk是使用過360加固過的,要注意它的classLoader不能直接使用https://blog.csdn.net/qq_21051503/article/details/53870621,需要從Application中獲取,我這里是通過?ˋ(context)方法去拿到context,再通過context.getClassLoader()取到classLoader,完整代碼如下
安裝到手機上,打勾生效重啟手機。
發現播放可以選擇原畫了
從下載頁去比較,
這是高清畫質的文件大小
?這是原畫畫質的文件大小
原畫選擇還是成功的。
總結
以上是生活随笔為你收集整理的xposed安卓分析源码破解视频APP的原画特权的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wxpython使用实例_wxPytho
- 下一篇: 网站导航学习