吾愛破解 - LCG - LSG |安卓破解|病毒分析|破解軟件|jn-dxmm.com

 找回密碼
 注冊[Register]

QQ登錄

广西快三只需一步,快速開始

搜索
查看: 4005|回復: 82

[Android 原創] 記一次基于frida的手游透視實現

  [復制鏈接]
樓主
從0開始的小小怪 發表于 2020-3-25 15:46 回帖獎勵
本帖最后由 從0開始的小小怪 于 2020-3-25 15:59 編輯

0x0 前言

​                之前在接觸到frIDA广西快三之后就對這個工具印象特別深刻, 雖說每次調試都得需要電腦的輔助調控, 但是勝在輕量級且不用總是重啟, 接口的使用也比較方便. 因為在之前見過有人使用gg修改器配合軟件的繪制來進行對鵝腸的某款moba手游進行方框透視, 所有突然來了靈感, 嘗試使用frida讀取內存, 并且實現同時對讀取的數據用python繪制.


                在這里我對所有敏感的特征碼進行了刪減處理, 只進行技術的交流, 不傳播腳本的使用.

0x1 工具的使用

​                frida的使用基于python, 所以在開始前先安裝好最新版的python.然后執行pip install fridapip install frida-tools广西快三, 就安裝好frida了. 此外還需要有adb工具, 具體的基礎使用不在這里贅述, 百度上有很多. 在frida的官網下載frida-server并且使用adb push命令將其置于data/local/tmp目錄下, 并且賦予777權限.

​                工具準備就緒后如圖依次輸入指令adb shell,su, ./data/local/tmp/frida-server命令運行frida-server:

​                                                                                                                                        圖1: 啟動frida-server

广西快三​                之后將該窗口最小化, 開啟另一個窗口輸入frida-ps -U命令檢測模塊是否正常連接, 如圖所示則一切正常:

​                                                                                                                                        圖2: 檢測連接情況

​                我們在這里主要使用frida的內存操作指令, 而不使用攔截器. 首先我們配合gg修改器附加一個進程進行指令的測試, 我們選用一個進程, 我挑的進程的pid為10080,使用frida -p 10080 -U附加或者查看該進程的包名使用frida -n xxx -U附加, 附加后我們用gg修改器選一個地址, 修改為一個數字, frida讀取驗證一下:

​                Memory.readInt()指令是讀取指針所指的地址取int類型的值, ptr(0xc404bf30)广西快三的意思是將0xc404bf30轉化為native指針, 在frida的內存操作都是基于這個native指針來進行的. 上面兩圖我們可以看到工具能夠正常工作.

​                我們的繪圖操作使用python的tkinter包. 相關的參考資料可以如下:

0x2 js代碼對數據讀取

​                主要的js代碼如下:

//js code
function readP(firstAddr,pos){//設置偏移并且讀取數據
    for(var i=0;i<=9;i++){//十名玩家
        var base = ptr(firstAddr[i]);
        pos[2*i] = Memory.readInt(base.add(xOffset));//讀取x軸
        pos[2*i+1] = Memory.readInt(base.add(yOffset));//讀取y軸
    }
}

var pattern = 'xx';//特征匹配
var base = ptr(0x7f000000);//掃描起點 
var firstAddr = [];
Memory.scan(base,0x10000000,pattern,{
    onMatch: function(address,size){//匹配之后執行的回調函數
        var vJudg = Memory.readInt(ptr(address).add(xOffset));//讀取判斷
        if(vJudg>redMin&&vJudg<redMax)
            firstAddr.push(address);
        if(vJudg>blueMin&&vJudg<blueMax)
            firstAddr.push(address);
    },
    onComplete:function(){//
        console.log('scan finish');
    }
});
Thread.sleep(2)//一定要等待掃描線程結束后才繼續往下,否則報錯
var pos = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
var time;//需要設置腳本運行時間,否則報傳輸錯誤,未知原因
while(time--){
    Thread.sleep(0.2);
    readP(firstAddr,pos);
    send(pos.toString());//傳送數據
}

广西快三​                js代碼主要的流程是先掃描特征碼, 然后基于特征碼偏移找到玩家的坐標數據, 之后將讀取的坐標數據以字符串的形式傳遞給python代碼. 首先特征碼的查找是必要的, 其次對于內存的讀取有一個坑, 玩家要不斷點擊移動按鈕內存才會刷新, 倘若拖動搖桿則會造成內存無法刷新的問題, 具體解決方案我查了很多資料也沒有找到原因. 希望有大佬可以指點一下.

0x3 python接收js數據并完成繪圖

​                我對python的功能進行了分類, 主要的原因在于無論采用多線程還是多進程, tkinter在繪圖的過程中要么畫不出圖像, 要么報main thread is not in main loop的錯誤, 所以我索性將繪圖另外放置一個腳本之中,開兩個shell進行工作, 數據的傳輸使用socket進行傳輸. 接收數據的服務端代碼如下:

#file1.py
import frida
import sys
import socket

server = socket.socket()
server.bind(('192.168.0.104',8900))#局域網ip地址
server.listen(1)
serObj,address = server.accept()

package_id = 'com.xxx' # 游戲包名
device = frida.get_usb_device(timeout=10)#我的電腦要設置timeout,否則連接不上,原因未知
session = device.attach(package_id)
scr = """
/*****************/
"""
def on_message(message ,data):
    serObj.send(message['payload'].encode('utf-8'))

script = session.create_script(scr)
script.on("message" , on_message)
script.load()

​                這個py文件主要完成了js數據的接收和轉發至繪圖腳本的工作. 繪圖腳本代碼如下:

import mttkinter
import time
from mttkinter import *
import sys
import socket

global color
def ScreenPos(gamePos):
    for i in range(0,10):
        gamePos[2*i] = (gamePos[2*i]/108850*600)+300
        gamePos[2*i+1] = -(gamePos[2*i+1]/108850*600)+300
    return gamePos

def StringToInt(s):
    gamePos = s.split(',')
    for i in range(0,20):
        gamePos[i] = int(gamePos[i])
    return gamePos

def DrawPoint(canvas,screenPos):
    length = 5
    for i in range(0,10):
        if color[i]==1:
            canvas.create_rectangle(screenPos[i*2]-length+460,
                                    screenPos[i*2+1]-length+150,
                                    screenPos[i*2]+length+460,
                                    screenPos[i*2+1]+length+150,fill = 'red')
        else:
            canvas.create_rectangle(screenPos[i*2]-length+460,
                                    screenPos[i*2+1]-length+150,
                                    screenPos[i*2]+length+460,
                                    screenPos[i*2+1]+length+150,fill = 'blue')

def Draw(re_data,canvas,tk):
        gamePos = StringToInt(re_data)
        screenPos = ScreenPos(gamePos)
        canvas.create_rectangle(440,130,1080,770,fill = 'white')
        DrawPoint(canvas,screenPos)
        tk.update()

def Check(gamePos):
    for i in range(0,10):
        if gamePos[2*i]>0:
            color[i]=1#red

color = [0,0,0,0,0,0,0,0,0,0]#顏色區分
tk = mttkinter.mtTkinter.Tk()
tk.geometry('+0+0')
tk.overrideredirect(True)
canvas = mttkinter.mtTkinter.Canvas(tk,width = 1920,height = 1080)
canvas.pack()
client = socket.socket()
client.connect(('192.168.0.104',8900))#連接服務端
re_data = client.recv(1024).decode('utf-8')
Check(StringToInt(re_data))#數據校驗
while True:
    re_data = client.recv(1024).decode('utf-8')
    Draw(re_data,canvas,tk)#繪圖

广西快三​                最終實現的效果如圖:

0x4 最后

​                從開始有這個想法到最后的勉強算成功花了兩天的時間, 真的是踩了無數的坑, 也學到了挺多的東西. 令我印象最深刻的還是js讀出內存不更新以及畫圖的問題, 我到現在也搞不懂, 難道是frida還對讀過的內存進行了緩存嗎, 移動搖桿就是不更新內存, 只有點擊才有反應. 還有python的繪圖, 一邊傳數據一邊畫圖按理說用多線程就可以解決的, 可多線程多進程都試過才發現不行. 最后繪圖的幀率很低, 一卡一卡的,人物坐標莫名其妙會飄, 手機也很熱, 也就做研究可以試試, 實際的使用根本不行=.=

广西快三以下是我個人覺得比較好的相關參考資料:

广西快三[<FONT color='blue'>frida文檔</FONT>][]

[<FONT color='blue'>frida入門教程</FONT>][]

[<FONT color='blue'>tkinter畫圖</FONT>][]

免費評分

參與人數 32威望 +2 吾愛幣 +130 熱心值 +28 收起 理由
qtfreet00 + 2 + 100 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
西楓游戲 + 1 + 1 不一樣的使用方法 牛逼
q75092585 + 1 我很贊同!
wanghaisheng + 1 + 1 用心討論,共獲提升!
Small_Google + 1 + 1 用心討論,共獲提升!
sunnylds7 + 1 + 1 熱心回復!
hikansakuratan + 1 + 1 鼓勵轉貼優秀軟件安全工具和文檔!
zhp_king + 1 我很贊同!
小學生 + 1 + 1 樓主真行家,成品丟我一個
gunxsword + 1 + 1 從有想法到實現這種效果...2天...牛逼...
jimmyzang + 1 + 1 我很贊同!
lynxtang + 1 + 1 謝謝@Thanks!
Black_山貓 + 1 用心討論,共獲提升!
m0nst3r + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
wangyoo + 1 謝謝@Thanks!
v0id_alphc + 1 + 1 牛逼兄弟
S-tony + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
Lucifer_BW + 1 + 1 熱心回復!
unbeaten + 1 + 1 謝謝@Thanks!
暗夜殺神 + 1 + 1 謝謝@Thanks!
wyyynioo + 1 謝謝@Thanks!
zqy10008 + 1 用心討論,共獲提升!
AsktaoMS + 1 + 1 歡迎分析討論交流,吾愛破解論壇有你更精彩!
挑燈看花 + 1 我有一個大膽的想法
axuan666 + 1 我很贊同!
CrazyNut + 3 + 1 用心討論,共獲提升!
LASTandGAME + 1 + 1 鼓勵轉貼優秀軟件安全工具和文檔!
Capitalwell + 1 + 1 我很贊同!
干燒魚蛋炒飯 + 1 + 1 我很贊同!
丶咖啡貓丶 + 1 + 1 熱心回復!
Pholhx + 1 + 1 謝謝@Thanks!
clockworklun + 2 + 1 鼓勵轉貼優秀軟件安全工具和文檔!

查看全部評分

本帖被以下淘專輯推薦:

發帖前要善用論壇搜索功能,那里可能會有你要找的答案或者已經有人發布過相同內容了,請勿重復發帖。

推薦
赤座燈里 發表于 2020-3-25 16:03
本帖最后由 赤座燈里 于 2020-3-25 16:43 編輯

可以試試用rpc遠程調用,js里定義導出函數,用rpc.exports的字典進行聲明,函數只用來讀內存返回坐標數據,然后在python里循環調用該函數取出坐標直接繪制,應該可以解決問題
推薦
老凡塵 發表于 2020-3-27 12:26
推薦
那年夏天52 發表于 2020-3-25 16:01
推薦
E_eYYF 發表于 2020-3-26 10:53
@騰訊安全 建議發offer
推薦
LASTandGAME 發表于 2020-3-25 16:54
我就是沖著敏感代碼來的  結果你沒有
4#
SunerC 發表于 2020-3-25 16:26
企鵝覺得很淦
5#
jy03344125 發表于 2020-3-25 16:36
有點復雜…先慢慢看看
6#
imyxuan 發表于 2020-3-25 16:37
有點給力
7#
EV99 發表于 2020-3-25 16:40
收藏一波
8#
Capitalwell 發表于 2020-3-25 16:48
原來透視這樣實現的呀
10#
Dream_Peng 發表于 2020-3-25 17:00
樓主 基于這個東東可以寫自動化后臺腳本不?
您需要登錄后才可以回帖 登錄 | 注冊[Register]

本版積分規則 警告:本版塊禁止灌水或回復與主題無關內容,違者重罰!

快速回復 收藏帖子 返回列表 搜索

RSS訂閱|小黑屋|聯系我們|吾愛破解 - LCG - LSG ( )

GMT+8, 2020-4-3 11:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回復 返回頂部 返回列表
安徽快3-推荐 重庆快3-Welcome 北京快3-欢迎您 上海快3-Home 湖北快3-安全购彩 湖南快3-广西快三 河北快3-推荐 大发11选5-推荐 河南快3-Welcome 广东快3-Home