разбор black russia

Sahiro

Участник
Автор темы
16
25
Всем здравствуйте, в этой теме будет разбор шифрования, raknet + разбор Json пакетов интерфейса ну и рабочий форк для подключения.
Частично опирался на эту тему
Вообщем, начнем сначала с шифрования, а с последним фиксом блек раша сделала довольно интересную штуку, разберу изменения от самп шифрования по пунктам.

1. Серверные пакеты теперь тоже шифруются.
2. Шифруются только пакеты с reliable надежностями, ненадежные пакеты или пакеты не имеющие надежности ( OPEN_CONNECTION_REQUEST и OPEN_CONNECTION_REPLY) не шифруются.
3. Шифруются именно пакеты а не датаграммы, raknet заголовки или ack не шифруются, байт контрольной суммы идет после надежности, каждый новый пакет в датаграмме шифруется по новому.

Перейдем к json интерфейс пакетам.
их формат такой
айди пакета 27, uint16 айди интерфейса, uint32 длина json, сам json.
json пакеты сначала попадают в c++ откуда они переходят в джава код и далее обрабатываются именно там. (для разбора джава кода использовал jadx, для этого просто импортируем apk в jadx)
Сначала json попадает в JNIJSONTransport в функцию OnJsonDataIncoming а затем идет в GUIMANAGER в функцию onPacketIncoming далее такой путь showGUI - showCurrentGUI - handleFragmentScreen - emitFragmentChange - onFragmentChange, тут хранятся айди почти всех json интерфейсов.

Java:
    public void onFragmentChange(int fragmentConst, @Nullable Bundle currentBundle) {
        FragmentManager supportFragmentManager;
        JNIActivity context = JNIActivity.getContext();
        FragmentTransaction fragmentTransactionBeginTransaction = (context == null || (supportFragmentManager = context.getSupportFragmentManager()) == null) ? null : supportFragmentManager.beginTransaction();
        int i = R.id.jniactivity_main_root_view;
        int i2 = R.id.jniactivity_notification_container;
        String fragmentTag = getFragmentTag(fragmentConst);
        if (fragmentTransactionBeginTransaction != null) {
            switch (fragmentConst) {
                case 1:
                    fragmentTransactionBeginTransaction.add(i, PlatesGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 2:
                    fragmentTransactionBeginTransaction.add(i, GUIFuelFill.class, currentBundle, fragmentTag);
                    break;
                case 6:
                    fragmentTransactionBeginTransaction.add(i, RentGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 11:
                    fragmentTransactionBeginTransaction.add(i, ChooseServerGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 13:
                    fragmentTransactionBeginTransaction.add(i2, GUINotificationNewStyle.class, currentBundle, fragmentTag);
                    break;
                case 14:
                    fragmentTransactionBeginTransaction.add(i, MenuComposeGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 16:
                    fragmentTransactionBeginTransaction.add(i, TaxiFragment.class, currentBundle, fragmentTag);
                    break;
                case 17:
                    fragmentTransactionBeginTransaction.add(i, TaxiOrderFragment.class, currentBundle, fragmentTag);
                    break;
                case 18:
                    fragmentTransactionBeginTransaction.add(i, TaxiRatingFragment.class, currentBundle, fragmentTag);
                    break;
                case 21:
                    fragmentTransactionBeginTransaction.add(i, TaxiMapFragment.class, currentBundle, fragmentTag);
                    break;
                case 22:
                    fragmentTransactionBeginTransaction.add(i, GUIDonate.class, currentBundle, fragmentTag);
                    break;
                case 24:
                    fragmentTransactionBeginTransaction.add(i, GUISmiEditor.class, currentBundle, fragmentTag);
                    break;
                case 25:
                    fragmentTransactionBeginTransaction.add(i, GUIPlayersList.class, currentBundle, fragmentTag);
                    break;
                case 27:
                    fragmentTransactionBeginTransaction.add(i, GUIRadialMenuForCar.class, currentBundle, fragmentTag);
                    break;
                case 28:
                    fragmentTransactionBeginTransaction.add(i, GUITuning.class, currentBundle, fragmentTag);
                    break;
                case 30:
                    fragmentTransactionBeginTransaction.add(i, HolidayEventsGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 33:
                    fragmentTransactionBeginTransaction.add(i, GUIUsersInventory.class, currentBundle, fragmentTag);
                    break;
                case 34:
                    fragmentTransactionBeginTransaction.add(i, GUICarsTrunkOrCloset.class, currentBundle, fragmentTag);
                    break;
                case 35:
                    fragmentTransactionBeginTransaction.add(i, BlackPassBannerComposeGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 36:
                    fragmentTransactionBeginTransaction.add(i, GUISocialInteraction.class, currentBundle, fragmentTag);
                    break;
                case 37:
                    fragmentTransactionBeginTransaction.add(i, GUIDrivingSchool.class, currentBundle, fragmentTag);
                    break;
                case 38:
                    fragmentTransactionBeginTransaction.add(i, GUIRegistration.class, currentBundle, fragmentTag);
                    break;
                case 39:
                    fragmentTransactionBeginTransaction.add(i, TutorialGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 40:
                    fragmentTransactionBeginTransaction.add(i, GUIWoundSystem.class, currentBundle, fragmentTag);
                    break;
                case 42:
                    fragmentTransactionBeginTransaction.add(i, GUIEntertainmentSystem.class, currentBundle, fragmentTag);
                    break;
                case 43:
                    fragmentTransactionBeginTransaction.add(i, GUIEntertainmentSystemFinalWindow.class, currentBundle, fragmentTag);
                    break;
                case 45:
                    fragmentTransactionBeginTransaction.add(i, GUIFamilySystem.class, currentBundle, fragmentTag);
                    break;
                case 46:
                    fragmentTransactionBeginTransaction.add(i, GUIFractionSystem.class, currentBundle, fragmentTag);
                    break;
                case 47:
                    fragmentTransactionBeginTransaction.add(i, MenuSettingMainUiFragment.class, currentBundle, fragmentTag);
                    break;
                case 49:
                    fragmentTransactionBeginTransaction.add(i, CraftGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 50:
                    fragmentTransactionBeginTransaction.add(i, GUISpawnLocation.class, currentBundle, fragmentTag);
                    break;
                case 52:
                    fragmentTransactionBeginTransaction.add(i, GUISocialNetworkLink.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_ELECTRIC /* 56 */:
                    fragmentTransactionBeginTransaction.add(i, ElectricGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_CATCH_STREAMER /* 57 */:
                    fragmentTransactionBeginTransaction.add(i, CatchStreamerGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 58:
                    fragmentTransactionBeginTransaction.add(i, GUIGasmanGame.class, currentBundle, fragmentTag);
                    break;
                case 59:
                    fragmentTransactionBeginTransaction.add(i, FishingGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 61:
                    fragmentTransactionBeginTransaction.add(i, YotubePlayerFragment.class, currentBundle, fragmentTag);
                    break;
                case 63:
                    fragmentTransactionBeginTransaction.add(i, InteractionWithNpcGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 64:
                    fragmentTransactionBeginTransaction.add(i, HalloweenAwardGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 65:
                    fragmentTransactionBeginTransaction.add(i, ActiveTaskGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 66:
                    fragmentTransactionBeginTransaction.add(i, AdminToolsGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 67:
                    fragmentTransactionBeginTransaction.add(i, BrSimBannerComposeGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_UPGRADE_OBJECT_EVENT /* 68 */:
                    fragmentTransactionBeginTransaction.add(i, UpgradeObjectEventGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_GIFTS /* 69 */:
                    fragmentTransactionBeginTransaction.add(i, GiftsGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 70:
                    fragmentTransactionBeginTransaction.add(i, PanelInfoGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 71:
                    fragmentTransactionBeginTransaction.add(i, CalendarGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_RATE_APP /* 72 */:
                    fragmentTransactionBeginTransaction.add(i, RateAppComposeGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_CASES /* 73 */:
                    fragmentTransactionBeginTransaction.add(i, CasesGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_BP_REWARDS /* 74 */:
                    fragmentTransactionBeginTransaction.add(i, BpRewardsGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 75:
                    fragmentTransactionBeginTransaction.add(i, TanpinBannerGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_VIDEO_PLAYER /* 76 */:
                    fragmentTransactionBeginTransaction.add(i, VideoPlayerGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_MARKETPLACE /* 77 */:
                    fragmentTransactionBeginTransaction.add(i, MarketplaceGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_CLICKER /* 79 */:
                    fragmentTransactionBeginTransaction.add(i, ClickerGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 80:
                    fragmentTransactionBeginTransaction.add(i, ChatGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 81:
                    fragmentTransactionBeginTransaction.add(i, ModuleDialogGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 82:
                    fragmentTransactionBeginTransaction.add(i, RatingGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 83:
                    fragmentTransactionBeginTransaction.add(i, InitializationFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_LOADER /* 84 */:
                    fragmentTransactionBeginTransaction.add(i, LoaderFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_MAIN /* 85 */:
                    fragmentTransactionBeginTransaction.add(i, MainFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_UPDATE_MANAGER /* 86 */:
                    fragmentTransactionBeginTransaction.add(i, UpdateManagerFragment.class, currentBundle, fragmentTag);
                    break;
            }
            fragmentTransactionBeginTransaction.setReorderingAllowed(true).commitAllowingStateLoss();
        }
    }
Рабочий форк с api (апи для обработки некоторых json интерфейсов тоже есть)
GitHub