2016-06-15 109 views
1

我想從應用程序獲取一些數字數據,但它們不會存儲爲像db這樣的文件。我知道有一些內存破解應用程序可以改變遊戲值,但我不知道它們是如何工作的。 我在尋找類似的功能,但我不需要改變任何東西。如何從Android應用程序讀取內存數據

我想寫的應用程序只是從特定的應用程序讀取一些數據,並根據它做一些背景計算。如果這是不可能的,我需要通過閱讀屏幕來獲取信息(例如獲取像素顏色),但這對於獲取許多數據似乎是非常繁瑣的任務。

有沒有辦法實現這一目標?

謝謝。

編輯:我想我會需要一個根權限呢?

+0

您想要訪問以讀取數據的應用程序嗎? –

+0

@Raptor我不知道如何,所以我在這裏問。任何相關的想法或在哪裏尋找將是非常有益的。 – Seung

+0

@TedHopp是的,我試圖寫的應用程序將讀取數據。正在讀取的數據來自另一個第三方應用程序 – Seung

回答

4

是的,你需要root權限。此外,您的用戶必須擁有完全根植的設備,例如SuperSU或其他現代Su應用程序,可以解除大部分SELinux限制。 KNOX和其他類似系統也可能存在衝突,但我對這些系統並不瞭解。

您需要將您的進程作爲調試器附加到目標應用程序,並通過掃描其內存來查找必要的數據。這可以通過多種方式完成,最佳參考實現可以在scanmem中找到。

執行需要root權限的實際行爲的代碼 - 讀取/寫入目標進程內存 - 將駐留在通過su運行的本機可執行文件中。你必須編寫一些代碼來與該可執行文件進行通信(可能通過它的stdin/stdout或類似的東西)。

您還必須編寫額外的代碼來自己分析目標應用程序的內存佈局。或者,您可能更喜歡在目標應用程序的內存中注入一個小模塊,或者讓應用程序本身加載您製作的Dex文件(如果目標數據存儲在Java內存中,尤其方便)。這種方法有利於最大限度地減少與虛擬機的內存佈局的交互,但是您仍然必須啓動加載初始Dex文件。一旦加載了Dex文件,您就可以使用舊的反射API在Java代碼中完成剩下的工作。如果你採用這種方式,在Linux進程內存中注入可執行代碼片段的代碼(體面支持!)可以在compel library中找到,該代碼是作爲CRIU項目的一部分而開發的。

+0

請注意,我真誠地爲您提供幫助,但是許多內存掃描程序應用程序在抄襲開源代碼(尤其是scanmem)時甚至沒有給予作者正確的評分。如果您使用scanmem的代碼,請考慮至少與其他人分享與您的工作相關的記憶掃描相關部分。還要注意,上述方法是非常通用的。如果您只需要Java應用程序支持,則最好使用Android Accesibility API或Java遠程調試API來獲得您的方式(前者甚至可以在沒有root權限的情況下使用!) – user1643723

+0

非常感謝,它確實有幫助。這個應用程序將是私人的,只爲我。一直在用神經網絡學習和編碼,並且認爲一場比賽對於練習對抗實際比賽是一個好的開始。我只希望獲得輸入數據與神經網絡的實際部分相比並不是那麼大的混雜。 – Seung

1

兩個Android進程不能共享內存並互相通信直接。所以爲了交流,對象必須被分解爲原語(編組)並跨越過程邊界。

要做到這一點編組,必須編寫大量複雜的代碼,因此Android會使用AIDL(Android接口定義語言)處理它。

從OP,因爲沒有更多的細節可以找到,我建議你閱讀/搜索關鍵字「AIDL」,你會被重定向到具體的解決方案。

+0

感謝您的回答。現在,我沒有看到任何相關部分,但我想這是我的錯,不清楚我想要什麼。我會繼續閱讀:) – Seung

相關問題