Java 破解騰訊微信跳一跳(幾乎每次命中中心點,目前最高 19844 分)

burningcl發表於2019-03-03

執行起來的同學,歡迎在評論區裡,貼出自己現在中心點的命中率。

如果有同學對Android無障礙服務熟悉並且有時間有精力,可以實現一個基於Android無障礙服務的外掛,那樣就不需要連線ADB與電腦了。


我沒有想到有那麼多同學問我如何匯入專案。主要的問題在於:

  • 如何匯入專案?
  • 為什麼不上傳wechat_jump_hack.iml檔案?

點選此處,檢視詳細教程

程式控制小人自動跳,幾乎每次命中中心點。

為了更好的展示執行效果,我貼一個剛剛錄製的視訊。v.youku.com/v_show/id_X…

如果你的執行效果,不像這個視訊中所示,請一定要認真閱讀“溫馨提示”這個章節。

附上 GitHub 地址: github.com/burningcl/w… 歡迎大家與我交流意見。破解過程,總共花了3個小時,不斷地調整演算法與引數,因此程式碼比較亂,還請見諒。

2018/01/04優化

根據同學們的反饋,我今天午休時,抽了20分鐘,優化了一下演算法。

  1. 提高瓶子的識別率。

    由於瓶子的顏色比較接近,新實現了一種演算法用於瓶子的瓶蓋的識別。效果如下:

  2. 提高出現特殊盒子時,下步的計算。

    特殊盒子,例如留聲機,他的動效時間很長,而且很大,對下一步的識別產生干擾。因此,改進了一下演算法,減少干擾的影響。效果如下:

  3. 新增加了HackTest.java檔案。大家在執行Hack.java後,會在wechat_jump_hack/out/production/wechat_jump_hack/imgs/input/目錄下存放截圖檔案。執行Hack.java結束後,再執行HackTest.java,會在wechat_jump_hack/out/production/wechat_jump_hack/imgs/output/下生成input目錄中的截圖的位置標記。

    • 紅點表示玩家位置;
    • 綠點表示下一個盒子的邊界點;
    • 藍點表示下一個盒子的中心點;

    如果覺得跳得不準的同學,請執行HackTest.java檔案,觀察標記的位置是否準確。如果準確的話,請自行調整彈跳係數。筆者無法做到我所用的彈跳係數適用於所有的裝置。

  4. 新增對命中中心點的統計

    screenshot, file: /Users/chenliang/SkylineProjects/wechat_jump_hack_1/out/production/wechat_jump_hack_1/imgs/input/1092.png
    438, 364
    pos, x: 404, y: 1104
    find myPos, succ, (404, 1104)
    191, 217, 194
    232, 258, 266
    top, x: 732, y: 803
    true
    left, x: 599, y: 880
    right, x: 868, y: 880
    whitePoint: 752, 715, 887, 866
    find whitePoint, succ, (733, 876), centerHit: 901, total: 1093
    find nextCenter, succ, (733, 876)
    distance: 554
    /Users/chenliang/Library/Android/sdk/platform-tools/adb shell input swipe 400 400 400 400 554
    複製程式碼

    根據我的執行結果,命中中心點的概率,大約為82%~85%。因為微信也在改進,命中中心點的難度也在提高

  5. 對於最後的成績無法提交

微信已經做了遮蔽措施,判定作弊無法上傳資料。      

感謝@imvin軍的經驗,在迫近最高分的時候拔掉資料線,手動操作幾步,實測步數越多成功率越好。

一. 效果展示

二. 實現原理

具體識別的演算法,我現在沒有時間總結了(以後有時間我可以去總結一下),大家可以先看原始碼。原始碼中部分引數是在筆者的手機上進行除錯的(解析度為1080),大家可以根據自己手機,進行相應修改。

主要步驟

  1. 識別玩家位置

    如下圖中白色空心方格所示:

  2. 識別目標方塊位置

    如下圖中紅色實心方格所示,識別最上面的頂點,最左邊的點,與最右邊的點,從而計算出中心點:

  3. 識別目標方塊中心圓點的位置

    如果你前一次踩中中心點,會有下一個中心點的提示(一個白色的圓點)。

流程

  1. 通過ADB截圖;
  2. 通過ADB將截圖儲存到電腦;
  3. 識別玩家位置;
  4. 識別目標方塊位置;
  5. 識別目標方塊中心圓點的位置;
  6. 如果第5步成功,則取第5步的中心點為下一步的位置;否則,取第4步的中心點為下一步的位置;
  7. 計算玩家位置與下一步的位置,乘以一定的係數,得到長按的時間;
  8. 通過ADB,觸發長按;

三. 執行條件

  1. 準備Java執行與編譯環境,使用Java8以上,IDE推薦使用Intellij;
  2. 安裝Android SDK;
  3. 使用 git工具clone專案,地址為 github.com/burningcl/w… ;
  4. 使用IDE(筆者使用Intellij)import該專案;
  5. 準備好一部已經開啟開發者模式的Android手機;
  6. 請確認是否adb已經聯接上你的手機;如果adb連線失敗,則會導致截圖與拉取截圖失敗,提示“find myPos, fail”或者找不到檔案“1.png (No such file or directory) ”;如果連著多個Android裝置的話,最好關到只有一個;
  7. 開啟開發者選項,找到“USB除錯(安全設定)允許通過USB除錯修改許可權或者模擬點選”(在mui上是這樣的,在其他手機上,應該也是差不多這樣)這個開關,開啟它;如果這個許可權沒有授予,則不能正常觸發彈跳;
  8. 修改com.skyline.wxjumphack.Hack中ADB_PATH,將其改為你自己的ADB位置;
  9. 開啟微信,開啟跳一跳遊戲,並點選開始;
  10. 執行程式(Hack.java中的main方法)吧,騷年,觀察它自動跳動;

四. 溫馨提示

  1. 有些同學反饋,程式報錯,提示找不到檔案或者“find myPos, fail”。請確認是否adb已經聯接上你的手機;如果adb連線失敗,則會導致截圖與拉取截圖失敗。
  2. 有些同學反饋,位置都計算出來了,但是沒有觸發彈跳。開啟開發者選項,找到“USB除錯(安全設定)允許通過USB除錯修改許可權或者模擬點選”(在mui上是這樣的,在其他手機上,應該也是差不多這樣)這個開關,開啟它。
  3. 這個小遊戲,後來騰訊好像加了一些干擾的動效,會干擾位置計算。後期可以優化。
  4. 因為我總共才花了3小時去破解,主要的時間都花了前期的識別演算法的優化上。程式碼中,還有很多魔法值什麼的,程式碼也比較亂。如果要閱讀的話,還請見諒。
  5. 至於位置計算,請執行MyPosFinder.java與NextCenterFinder.java中的main方法,觀察生成檔案,檢視標記的位置是否正確。

相關文章