2016-06-15 2 views
1

Я хотел бы получить некоторые числовые данные из приложения, но они не хранятся в виде файлов, таких как db. Я знаю, что есть некоторые приложения для взлома памяти для изменения значений игры, хотя я не знаю, как они работают. Я ищу похожие функции, но мне ничего не нужно менять.Как читать данные памяти из приложения android

Приложение, которое я пытаюсь написать, просто считывает некоторые данные из определенного приложения и делает некоторые вычисления фона на основе этого. Если это невозможно, мне нужно будет получить информацию, читая экран (например, получите цвет пикселя), но это, по-видимому, очень громоздкая задача для получения многих данных.

Есть ли способ достичь этого?

Спасибо.

EDIT: Я бы предположил, что для этого мне понадобится разрешение root?

+0

Это ваше приложение, к которому вы хотите получить доступ, чтобы прочитать данные? –

+0

@ Raptor Я не был уверен, как, поэтому я спросил здесь. любая соответствующая идея или где искать было бы очень полезно. – Seung

+0

@TedHopp да, приложение, которое я пытаюсь написать, будет читать данные. считываемые данные поступают от другого стороннего приложения – Seung

ответ

4

Да, вам необходимо получить разрешение на использование root. Кроме того, ваши пользователи должны иметь полностью внедренное устройство, например. SuperSU или другое современное приложение Su, которое может поднять большинство ограничений SELinux. Также могут возникнуть конфликты с KNOX и другими подобными системами, но я не очень осведомлен о них.

Вам необходимо приложить свой процесс в качестве отладчика к целевому приложению и найти необходимые данные, сканируя его в память. Это можно сделать несколькими способами, наилучшую ссылочную реализацию для поиска можно найти в scanmem.

Код, выполняющий фактический акт, который требует прав root, - чтение/запись целевой памяти процесса - будет находиться в исполняемом файле native, выполняющемся через su. Вам нужно будет написать код для связи с этим исполняемым файлом (возможно, через stdin/stdout или что-то в этом роде).

Вам также придется написать дополнительный код, чтобы самостоятельно разобрать макет памяти целевого приложения.

В качестве альтернативы вы можете предпочесть ввести небольшой модуль в память целевого приложения и/или загрузить приложение непосредственно из Dex-файла (особенно удобно, если ваши целевые данные хранятся в памяти Java). Такой подход имеет преимущество минимизации взаимодействия с макетом памяти виртуальной машины, но вам все равно придется инициировать загрузку исходного файла Dex. После того, как файл Dex загружен, вы можете сделать все остальное в Java-коде, используя API хорошего старого отражения. Если вы поедете с этим путем, код (по-настоящему поддерживаемый!) Для ввода исполняемых фрагментов в память процесса Linux можно найти в compel library, который разрабатывается как часть проекта CRIU.

+0

Обратите внимание, что я помогаю вам добросовестно, но многие приложения для сканера памяти имеют плагиат с открытым исходным кодом (в первую очередь scanmem), даже не давая надлежащих кредитов своим авторам. Если вы используете код scanmem, рассмотрите хотя бы общую часть работы с другими людьми, связанную с сканированием памяти. Также обратите внимание, что вышеописанный метод * очень * общий. Если вам нужна поддержка только для Java-приложений, вам может быть лучше использовать API-интерфейсы Android Accuibility API или API-интерфейсы для отладки Java, чтобы получить ваш путь (первый может даже использоваться без прав root!) – user1643723

+0

Большое спасибо, это действительно помогает. Это приложение будет приватным, только для меня. Немного научился и кодировал нейронную сеть, и подумал, что одна игра станет хорошим началом для практики против реальной игры. Я просто надеюсь, что получение входных данных не является таким большим huddle по сравнению с фактической частью нейронной сети. – Seung

1

Два процесса Android не могут совместно использовать память и общаться друг с другом напрямую. Поэтому для связи объекты должны быть разбиты на примитивы (сортировка) и перенесены через границы процесса.

Чтобы сделать это, нужно написать много сложного кода, поэтому Android обрабатывает его для нас с помощью AIDL (Язык определения интерфейса Android).

От OP, так как более подробную информацию вы можете найти, я бы порекомендовал вам чтение/поиск с ключевым словом «AIDL», и вы будете перенаправлены на конкретные решения.

+0

Спасибо за ответ. На данный момент я не вижу какой-либо важной части, но я думаю, что это моя ошибка, не ясная, что я хотел. Я буду читать :) – Seung