Подтвердить что ты не робот

Внедрение функции безумной установки приложения Google Play на Android

Привет, эксперты/экспертные хакеры,

Я пытаюсь внедрить функцию автоматической установки приложения Google Play (аналогичную быстрой установке веб-приложения appbrain) на Android.

До сих пор мне удалось добиться следующих результатов:

  • Узнайте, как получить токен Google Play Auth (таким образом, для моего приложения разрешено разговаривать с приложением Google Play на телефоне). Я перечислил код, который я использовал для этого ниже:

        Log.i(TAG,"Getting the Google Play Auth Token Using Account Manager : START");
        AccountManager accountManager = AccountManager.get(getApplicationContext());
        Account[] accArr = accountManager.getAccountsByType("com.google");
    
        for (Account acc : accArr) {
            Log.i(TAG, "For Account Name : " + acc.name + " - "+ "Account Type : " + acc.type);
            accountManager.getAuthToken(acc, "googleplay", null, this,new AccountManagerCallback<Bundle>() {
    
                        public void run(
                                AccountManagerFuture<Bundle> paramAccountManagerFuture) {
                            try {
                                Bundle localBundle = (Bundle) paramAccountManagerFuture.getResult();
                                String authToken = localBundle.get("authtoken") + "";
    
                                Log.i(TAG, "Got AuthToken : " + authToken);
    
                            } catch (Exception ex) {
                                StackTraceElement[] starray = ex.getStackTrace();
                                StringBuffer bf = new StringBuffer();
                                bf.append("Error : " + ex.getMessage()).append("\n");
                                for (StackTraceElement ste : starray) {
                                    bf.append(ste.toString()).append("\n");
                                }
                                Log.e(TAG, bf.toString());
                            }
    
                        }
    
                    }, null);
        }
        Log.i(TAG,"Getting the Google Play Auth Token Using Account Manager : END")
    
  • Узнайте, как получить Android-идентификатор телефона (этот идентификатор, как я полагаю, следует использовать при отправке запроса appInstall на серверы GPlay или приложение Gplay/vending на Android-телефоне)

      Log.i(TAG, "Getting the Android ID Of the Phone : START");
    
        Uri localUri = Uri.parse("content://com.google.android.gsf.gservices");
        ContentResolver localContentResolver = getContentResolver();
        String[] arrayOfString = new String[1];
        arrayOfString[0] = "android_id";
        Cursor localCursor = localContentResolver.query(localUri, null,null, arrayOfString, null);
        Log.i(TAG, "Column Count : " + localCursor.getColumnCount());
        if ((localCursor != null) && (localCursor.moveToFirst())) {
            String androidId = Long.toHexString(Long.parseLong(localCursor.getString(1)));
            Log.i(TAG, "Received Android ID : " + androidId);
    
            Log.i(TAG,"Other Value in Column : " + localCursor.getString(0));
        }
    
        Log.i(TAG,"Getting the Android ID of the Phone : END");
    
  • Узнайте, какой запрос буфера протокола должен быть отправлен на сервер Google Play или приложение Gplay/vending на телефоне, чтобы начать процесс загрузки и установки беззвучного приложения.

    message InstallRequest {
    optional string appId = 1;
    }
    message RequestContext {
    required string authSubToken = 1;
    required bool isSecure = 2;
    required int32 version = 3;
    required string androidId = 4;
    optional string deviceAndSdkVersion = 5;
    optional string userLanguage = 6;
    optional string userCountry = 7;
    optional string operatorAlpha = 8;
    optional string simOperatorAlpha = 9;
    optional string operatorNumeric = 10;
    optional string simOperatorNumeric = 11;
    
    }
    message Request {
    optional RequestContext context = 1;
    repeated group RequestGroup = 2 {
    optional InstallRequest installRequest = 10;
    }
    }
    

4. Я даже использовал компилятор protobuf и сгенерировал класс java для управления указанным выше запросом буфера протокола и заполнил вышеуказанные поля буфера протокола некоторыми выборочными данными. См. Код ниже:

    public void buildAndSendSilentInstallProtoBuffMessage(String gplayAuthToken, String deviceAndroidId){

    try{
    /*
     * The Root Request Object Assumed to be Holding the Silent Install Request
     */
    Request.Builder request = Request.newBuilder(); 

    //Populating the ReequestContext Object
    RequestContext.Builder context = RequestContext.newBuilder();

    context.setAndroidId(deviceAndroidId);
    context.setAuthSubToken(gplayAuthToken);

    context.setIsSecure(true);
    context.setVersion(1002);
    context.setDeviceAndSdkVersion("dream:4");
    context.setUserLanguage("en");
    context.setUserCountry("us");
    context.setOperatorAlpha("Android");
    context.setOperatorNumeric("310260");
    context.setSimOperatorNumeric("310260");

    //Building the Install Request
    InstallRequest.Builder installRequest = InstallRequest.newBuilder();
    installRequest.setAppId("-2564446724934482383");

    //Setting the Install Request to the Request Group
    RequestGroup.Builder requestGroup = RequestGroup.newBuilder();
    requestGroup.setInstallRequest(installRequest);

    //Setting the Request Context to the Main Request Object
    request.setContext(context);

    //Setting the Request Group to the Request Object
            request.addRequestGroup(requestGroup);

Образцы данных для GPlay Token и Android Id следующие:

  • Android_ID:

3a0f901831a0f402

  • Google Play AuthToken:

DQAAAMgAAACpOyPf6apRbb0i4qhTVaf0yYoikTAb4TYlHCRLrW 4mu5f14j-H35KGmO9TQKUDYCfj3-б-QIH5chfXT3bS02Uxljg7vYt4I-kgXLEJwPcynjugDcJ9fYPOh1c2FnOnywFXXxXw6hcqs5sVnJEt 5zW2ditoB5VeeXG9Zfodj9dXKobObi50-XnHoGfWi2b64Uf3EHGdQTsDCMzfZrE4mb22fr9LCW1oZG5tkzw S4KhPBHWMN2fO7w-1IZ4UK5LOI80vPBLjxBaavKAXHoVUHSNV

  • Я также немного понюхал, используя мой встроенный телефон галактики Nexus во время установки Gplay без установки и нашел только два запроса HTTP GET.

Я попытался воспроизвести эти два запроса Http GET, захваченные с помощью Shark для root (используя мой встроенный гаджет галактики галактики Android), а 1-й запрос просто загружает сам файл Market (который я смог сохранить на SD-карте телефона Но тогда он должен быть установлен как любое приложение неизвестных источников), в то время как второй запрос ничего не возвращает.

Два захваченных запроса получаются ниже:

  • ПОЛУЧИТЕ ЗАПРОС:

    21 0.827240 192.168.135.102 173.194.36.4 HTTP 535 GET /market/download/Download?                                                                     packageName=com.gau.go.launcherex.theme.appwidget.gopowermaster.futureworld&versionCode=1&token=AOTCm0QRnH3rmypWtCGoAL_SU1BSt311wpyz-_LZTodkUSAlc-             f5SrdMiz5WDRDUKMMm6S3plBI9Jbh1tukT1jyCYXLgP4QhVvZvn5JLtZQ&downloadId=-165214892049282883 HTTP/1.1
    
     Which has the following http headers :
    
    Cookie: MarketDA=17214805622679635526\r\n
    Host: android.clients.google.com\r\n
    Connection: Keep-Alive\r\n
    User-Agent: AndroidDownloadManager/4.1.1 (Linux; U; Android 4.1.1; Galaxy Nexus Build/JRO03C)\r\n
    
  • ПОЛУЧИТЕ ЗАПРОС ДВА:

    44    6.595093    192.168.135.102    222.165.163.15    HTTP    608    GET /market/GetBinary/com.gau.go.launcherex.theme.appwidget.gopowermaster.futureworld/1?expire=1346838270&ipbits=0&ip=0.0.0.0&cp=SnpybWlzSFk6OTYzMzg0MTE2NzA1ODEwOTYxMjE&sparams=expire,ipbits,ip,q:,cp&signature=2C0778C4635F6F8AE1DA8479FB08DCB9BC04C2E9.60202D8D4D2FDDA70609A3862A25852F0BAA2766&key=am2 HTTP/1.1
    
    Which has the following http headers :
    
    Cookie: MarketDA=17214805622679635526\r\n
    Host: o-o.preferred.slt-cmb2.v12.lscache4.c.android.clients.google.com\r\n
    Connection: Keep-Alive\r\n
    User-Agent: AndroidDownloadManager/4.1.1 (Linux; U; Android 4.1.1; Galaxy Nexus  Build/JRO03C)\r\n
    

Я рассматривал это примерно две недели, но я все еще не мог найти следующее:

  • Быстро ли веб-установщик AppBrain использует буфер протокола для вызова Gplay (вендинговое приложение) на телефоне или серверах Gplay? Если это так, то формат протокола буфера протокола правильный.

  • Если формат запроса на превышение протокола буфера корректен, а затем в "Где на сервере Phone или Gplay" я должен отправить запрос буфера протокола для вызова процедуры загрузки и установки Silent Application?.

У меня также есть сервер и клиентская среда C2DM (теперь GCM) и вокруг этой задачи. Может ли кто-нибудь указать мне в правильном направлении или дать мне какие-либо подсказки для решения этой проблемы? Любая помощь очень ценится.

4b9b3361

Ответ 1

Тихая установка на устройствах Google Experience возможна только в Google Play. В более общем плане, только магазины, которые поставляются предварительно на вашем оборудовании, могут выполнить это, поскольку они должны использовать ключ подписи операционной системы.

Это по соображениям безопасности. Пользователи должны иметь возможность принимать разрешения для новых установок. ОС не имеет возможности проверить, правильно ли это сделали неофициальные магазины.

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

Попытка обойти это может подпадать под статью "запрещенные действия" в Google Play DDA, которая ставит под угрозу вашу учетную запись разработчика. Не делайте этого.

Ответ 2

Есть несколько действий, которые O.S. не разрешит никому, кроме доверенных приложений.

Приложениям, которые подписываются с ключами платформы, доверяют O.S., поэтому эти приложения могут делать больше с телефоном, например, при молчаливой установке. Я склонен видеть приложение с платформой, более мощным, чем наличие корневой функциональности, только потому, что это позволяет вам более легко получить доступ к намерениям и API Android.

Вам не нужно обнюхивать сообщения, отправляемые/получаемые Google Play с HTTP-сервера... Вам нужно подписать свое приложение с помощью ключей платформы. Проблема в том, что у каждого оператора/производителя/телефона/версии потенциально могут быть разные ключи платформы... Итак, для этого вам нужно будет создать несколько версий вашего приложения для каждого конкретного устройства...

Некоторые операторы подписывают все телефоны того же производителя с теми же клавишами, но другие используют разные клавиши для каждого телефона.

Вам нужно будет сделать большие усилия и провести переговоры с операторами, чтобы позволить эту функциональность, или полагаться на пользователей ROOT. Или просто отпустите свое приложение, подписанное с помощью тестовых клавиш (те, которые поставляются вместе с SDK android), и оно будет работать со всеми пользователями, у которых есть пользовательский ром с тестовыми ключами.