- 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 интерфейсов.
Рабочий форк с api (апи для обработки некоторых json интерфейсов тоже есть)
GitHub
Частично опирался на эту тему
Вообщем, начнем сначала с шифрования, а с последним фиксом блек раша сделала довольно интересную штуку, разберу изменения от самп шифрования по пунктам.
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();
}
}
GitHub