├── .gitattributes ├── .github └── workflows │ └── Test_Build.yml ├── .gitignore ├── .gitmodules ├── .idea ├── .gitignore ├── compiler.xml ├── gradle.xml ├── inspectionProfiles │ └── Project_Default.xml ├── misc.xml ├── statistic.xml └── vcs.xml ├── ItemProcesser ├── .gitignore ├── build.gradle └── src │ └── main │ └── java │ └── cc │ └── hicore │ └── annotationsprocesser │ └── XPItemScanner.java ├── LICENSE.md ├── QQStub ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── cc │ │ └── hicore │ │ └── qqstub │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── tencent │ │ └── common │ │ └── config │ │ └── DeviceType.java │ └── test │ └── java │ └── cc │ └── hicore │ └── qqstub │ └── ExampleUnitTest.java ├── QTool ├── .gitignore ├── build.gradle ├── lint-baseline.xml ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── adfawhf │ ├── CMakeLists.txt │ └── biliroaming.cc │ ├── assets │ ├── loading.json │ └── xposed_init │ ├── java │ ├── cc │ │ └── hicore │ │ │ ├── ConfigUtils │ │ │ ├── BeforeConfig.java │ │ │ ├── ConfigCore.java │ │ │ ├── ConfigCore_Json.java │ │ │ ├── ConfigUtils_MapFile.java │ │ │ └── GlobalConfig.java │ │ │ ├── DexFinder │ │ │ ├── DexHelperFinder.java │ │ │ ├── DexKitFinder.java │ │ │ ├── IDexFinder.java │ │ │ └── SoLoader.java │ │ │ ├── HookItemLoader │ │ │ ├── Annotations │ │ │ │ ├── ApiExecutor.java │ │ │ │ ├── CommonExecutor.java │ │ │ │ ├── MethodScanner.java │ │ │ │ ├── UIClick.java │ │ │ │ ├── UIItem.java │ │ │ │ ├── VerController.java │ │ │ │ ├── XPChecker.java │ │ │ │ ├── XPExecutor.java │ │ │ │ └── XPItem.java │ │ │ ├── bridge │ │ │ │ ├── BaseFindMethodInfo.java │ │ │ │ ├── BaseMethodInfo.java │ │ │ │ ├── BaseXPExecutor.java │ │ │ │ ├── CommonMethodInfo.java │ │ │ │ ├── FindMethodByName.java │ │ │ │ ├── FindMethodInvokingMethod.java │ │ │ │ ├── FindMethodsWhichInvokeToTargetMethod.java │ │ │ │ ├── MethodContainer.java │ │ │ │ ├── MethodFinderBuilder.java │ │ │ │ ├── QQVersion.java │ │ │ │ └── UIInfo.java │ │ │ └── core │ │ │ │ ├── ApiHelper.java │ │ │ │ ├── CoreLoader.java │ │ │ │ ├── MethodScannerWorker.java │ │ │ │ └── SecurityChecker.java │ │ │ ├── LogUtils │ │ │ ├── LogOutputFile.java │ │ │ └── LogUtils.java │ │ │ ├── ReflectUtils │ │ │ ├── Classes.java │ │ │ ├── Finders.java │ │ │ ├── MClass.java │ │ │ ├── MField.java │ │ │ ├── MMethod.java │ │ │ ├── QQReflect.java │ │ │ ├── ResUtils.java │ │ │ └── XPBridge.java │ │ │ ├── Tracker │ │ │ ├── AppCenterTracker.java │ │ │ ├── AutoReport.java │ │ │ └── CommonTracker.java │ │ │ ├── UIViews │ │ │ ├── MyTimePicker.java │ │ │ └── PickerView.java │ │ │ ├── Utils │ │ │ ├── ActionUtils.java │ │ │ ├── Assert.java │ │ │ ├── BitmapUtils.java │ │ │ ├── DataUtils.java │ │ │ ├── DebugUtils.java │ │ │ ├── FileUtils.java │ │ │ ├── HttpUtils.java │ │ │ ├── LayoutUtils.java │ │ │ ├── MediaUtils.java │ │ │ ├── NameUtils.java │ │ │ ├── ServerUtils.java │ │ │ ├── StringUtils.java │ │ │ ├── TTSHelper.java │ │ │ ├── ThreadUtils.java │ │ │ └── Utils.java │ │ │ └── qtool │ │ │ ├── ActProxy │ │ │ ├── BaseProxyAct.java │ │ │ ├── MainItemChildLoader.java │ │ │ ├── MainMenu.java │ │ │ ├── MainMenuActionRegister.java │ │ │ └── ShowModuleItemStatus.java │ │ │ ├── ChatHook │ │ │ ├── ChatCracker │ │ │ │ ├── AlwaysShowAvatar.java │ │ │ │ ├── ChangeTipToSystemMsg.java │ │ │ │ ├── CopyCardCode.java │ │ │ │ ├── DisableFlushPic.java │ │ │ │ ├── DisableReplayAt.java │ │ │ │ ├── FuckDLCard.java │ │ │ │ └── TransShowUin.java │ │ │ ├── FuckBadMsg │ │ │ │ ├── BadAtMsgRemove.java │ │ │ │ └── ChatBoomHooker.java │ │ │ ├── GameHook │ │ │ │ └── DictHook.java │ │ │ ├── LongClickSendCard │ │ │ │ └── SendBtnHooker.java │ │ │ ├── PerventRevoke │ │ │ │ └── PreventRevoke.java │ │ │ ├── Repeater │ │ │ │ ├── Hooker.java │ │ │ │ ├── Repeater.java │ │ │ │ ├── RepeaterHelper.java │ │ │ │ └── RepeaterSet.java │ │ │ ├── ShowAtInfo │ │ │ │ └── ShowAtHook.java │ │ │ └── ShowForbiddenHook │ │ │ │ └── ShowForbiddenInfo.java │ │ │ ├── CrashHandler │ │ │ ├── ByPassInnerHook.java │ │ │ ├── CatchInstance.java │ │ │ ├── CatcherPacker.java │ │ │ ├── LogcatCatcher.java │ │ │ ├── StringPool_Logcat.java │ │ │ ├── StringPool_XpErr.java │ │ │ ├── StringPool_XpLog.java │ │ │ └── XposedLogCatcher.java │ │ │ ├── EmoHelper │ │ │ ├── Hooker │ │ │ │ ├── GuildSessionMonitor.java │ │ │ │ ├── HookForUnlockSaveLimit.java │ │ │ │ ├── HookInjectEmoTabView.java │ │ │ │ └── RepeatWithPic.java │ │ │ └── Panel │ │ │ │ ├── EmoPanel.java │ │ │ │ ├── EmoPanelView.java │ │ │ │ └── EmoSearchAndCache.java │ │ │ ├── GroupChecker │ │ │ ├── CheckAlive │ │ │ │ ├── CheckCommon.java │ │ │ │ └── CheckExtra.java │ │ │ ├── CheckJoinIn │ │ │ │ └── JoinSame.java │ │ │ └── CheckerHooker.java │ │ │ ├── HCHidePainter │ │ │ └── HidePainter.java │ │ │ ├── HookEnv.java │ │ │ ├── JavaPlugin │ │ │ ├── Controller │ │ │ │ ├── AutoLoad.java │ │ │ │ ├── KeyWordUtils.java │ │ │ │ ├── LoadJarHelper.java │ │ │ │ ├── PluginApiHelper.java │ │ │ │ ├── PluginController.java │ │ │ │ ├── PluginErrorOutput.java │ │ │ │ ├── PluginInfo.java │ │ │ │ ├── PluginMessageProcessor.java │ │ │ │ ├── PluginMethod.java │ │ │ │ ├── PluginSetController.java │ │ │ │ ├── PluginStoreUtils.java │ │ │ │ └── SecurityAccess.java │ │ │ ├── Hooker │ │ │ │ ├── IMessageHooker.java │ │ │ │ └── IMessageMenuHooker.java │ │ │ ├── InChatControl │ │ │ │ ├── ChatFragmentLifeHook.java │ │ │ │ └── FloatWindowControl.java │ │ │ ├── ListForm │ │ │ │ ├── JavaPluginAct.java │ │ │ │ ├── LocalPluginItemController.java │ │ │ │ └── OnlinePluginItemController.java │ │ │ └── OnlinePluginController │ │ │ │ └── PluginUploader.java │ │ │ ├── MainActivity.java │ │ │ ├── OpenSource.java │ │ │ ├── QQCleaner │ │ │ ├── ChatCleaner │ │ │ │ ├── ChatLongClickCleaner.java │ │ │ │ ├── HideBubble.java │ │ │ │ ├── HideFont.java │ │ │ │ ├── HideListenerTogether.java │ │ │ │ └── PreventShakeWindow.java │ │ │ ├── MainCleaner │ │ │ │ ├── HideAdIcon.java │ │ │ │ ├── HideAppEntry.java │ │ │ │ └── HideSlideItem.java │ │ │ ├── OtherCleaner │ │ │ │ ├── HideDIYCard.java │ │ │ │ ├── HideQWalletAd.java │ │ │ │ └── HideSomeToast.java │ │ │ ├── QQCleanerHook │ │ │ │ ├── HideEmoPanelGifAndSelf.java │ │ │ │ ├── HideQzoneAd.java │ │ │ │ └── HideSignTip.java │ │ │ └── StorageClean │ │ │ │ ├── DBCleaner.java │ │ │ │ ├── DBHelper.java │ │ │ │ ├── LocalTableInit.java │ │ │ │ └── StorageView.java │ │ │ ├── QQGroupHelper │ │ │ ├── AvatarMenu │ │ │ │ ├── AvatarMenuBuilder.java │ │ │ │ └── AvatarMenuHooker.java │ │ │ ├── ChatHelper │ │ │ │ └── ShowMessageTime.java │ │ │ ├── FileHelper │ │ │ │ ├── FileFailureRename.java │ │ │ │ └── FileUploadRename.java │ │ │ └── GroupHelper │ │ │ │ └── GroupHelperHooker.java │ │ │ ├── QQManager │ │ │ ├── ManagerImpl │ │ │ │ ├── Group_Change_Name.java │ │ │ │ ├── Group_Change_Title.java │ │ │ │ ├── Group_Kick.java │ │ │ │ ├── Group_Kick_Multi.java │ │ │ │ └── Group_Mute.java │ │ │ ├── QQEnvUtils.java │ │ │ ├── QQGroupManager.java │ │ │ ├── QQGroupUtils.java │ │ │ ├── QQGuildManager.java │ │ │ ├── QQTicketManager.java │ │ │ └── UtilsImpl │ │ │ │ ├── Get_Group_Name_By_Contact.java │ │ │ │ └── Group_Get_Mute_List.java │ │ │ ├── QQMessage │ │ │ ├── MessageBuilderImpl │ │ │ │ ├── Build_Common_Msg.java │ │ │ │ ├── Build_Common_Reply.java │ │ │ │ ├── Build_Mix.java │ │ │ │ ├── Build_Text.java │ │ │ │ ├── Build_structMsg.java │ │ │ │ ├── Builder_Pic.java │ │ │ │ ├── Common_Rebuild_Msg.java │ │ │ │ └── Copy_Tuya.java │ │ │ ├── MessageImpl │ │ │ │ ├── MsgApi_AddAndSendMsg.java │ │ │ │ ├── MsgApi_AddMsg.java │ │ │ │ ├── MsgApi_GetMessageByTimeSeq.java │ │ │ │ ├── MsgApi_SendFakeMultiMsg.java │ │ │ │ ├── MsgApi_revokeMsg.java │ │ │ │ ├── MsgApi_sendMix.java │ │ │ │ ├── MsgApi_sendReply.java │ │ │ │ └── MsgApi_sentAntEmo.java │ │ │ ├── QQMessageUtils.java │ │ │ ├── QQMsgBuilder.java │ │ │ ├── QQMsgSendUtils.java │ │ │ ├── QQMsgSender.java │ │ │ └── QQSessionUtils.java │ │ │ ├── QQTools │ │ │ ├── ContextFixUtil.java │ │ │ ├── QQDecodeUtils │ │ │ │ └── DecodeForEncPic.java │ │ │ ├── QQHighTipHelper.java │ │ │ ├── QQSelectHelper.java │ │ │ └── QQServletHelper.java │ │ │ ├── ServerKiller │ │ │ ├── KillRMonitor.java │ │ │ ├── LogWriterKiller.java │ │ │ ├── ToggleKiller.java │ │ │ └── ZPlanKiller.java │ │ │ ├── StickerPanelPlus │ │ │ ├── EmoOnlineLoader.java │ │ │ ├── Hooker │ │ │ │ └── StickerPanelJHook.java │ │ │ ├── ICreator.java │ │ │ ├── LocalDataHelper.java │ │ │ ├── MainItemImpl │ │ │ │ ├── InputFromLocalImpl.java │ │ │ │ ├── LocalStickerImpl.java │ │ │ │ ├── OnlineStickerImpl.java │ │ │ │ ├── RecentStickerImpl.java │ │ │ │ └── TgConvertStickerImpl.java │ │ │ ├── MainPanelAdapter.java │ │ │ ├── PanelUtils.java │ │ │ ├── RecentStickerHelper.java │ │ │ └── StickerShareHelper.java │ │ │ ├── VoiceHelper │ │ │ ├── Hooker │ │ │ │ └── QQVoicePanelInject.java │ │ │ └── Panel │ │ │ │ ├── FloatButton.java │ │ │ │ ├── LocalVoiceSearchHelper.java │ │ │ │ ├── TTSPanel.java │ │ │ │ ├── VoicePanel.java │ │ │ │ ├── VoicePanelController.java │ │ │ │ └── VoiceProvider.java │ │ │ ├── XPWork │ │ │ ├── EntryHook │ │ │ │ └── Hook_For_Main_Entry.java │ │ │ ├── LittleHook │ │ │ │ ├── DownloadRedict.java │ │ │ │ ├── FakeDevInfo.java │ │ │ │ ├── ForceTabletMode.java │ │ │ │ ├── RemoveReceiptMsg.java │ │ │ │ ├── SavedToXml.java │ │ │ │ ├── ShowFullMessageCount.java │ │ │ │ ├── SupportMoreReplyMsg.java │ │ │ │ ├── UnlockWebLock.java │ │ │ │ └── VipStatusFucker.java │ │ │ ├── QQProxy │ │ │ │ ├── AddMsgProxy.java │ │ │ │ ├── BaseChatPie.java │ │ │ │ ├── BaseGuildMsgProxy.java │ │ │ │ ├── BaseMsgProxy.java │ │ │ │ ├── BaseRevokeProxy.java │ │ │ │ ├── TroopJoinExitProxy.java │ │ │ │ └── TroopMuteProxy.java │ │ │ ├── QQUIUtils │ │ │ │ └── FormItemUtils.java │ │ │ └── QQUtilsHook │ │ │ │ └── HookForUploadAvatar.java │ │ │ └── XposedInit │ │ │ ├── BeforeCheck.java │ │ │ ├── CheckWrongVersion.java │ │ │ ├── CloudBlack.java │ │ │ ├── CommonHookLoaderDialog.java │ │ │ ├── DebugDialog.java │ │ │ ├── EnvHook.java │ │ │ ├── ExtraPathInit.java │ │ │ ├── HookEntry.java │ │ │ ├── HostInfo.java │ │ │ └── SettingInject.java │ ├── com │ │ └── tencent │ │ │ └── rmonitor │ │ │ └── looper │ │ │ └── LooperProxy.java │ ├── io │ │ └── github │ │ │ └── qauxv │ │ │ └── util │ │ │ └── DexMethodDescriptor.java │ └── me │ │ └── iacn │ │ └── biliroaming │ │ └── utils │ │ └── DexHelper.java │ └── res │ ├── anim │ ├── anim_fade_in.xml │ └── anim_fade_out.xml │ ├── color │ └── selector_text_press_color.xml │ ├── drawable-night │ └── icon.xml │ ├── drawable │ ├── add_group.webp │ ├── alarm.webp │ ├── append_icon.png │ ├── bg_round.xml │ ├── btnclick.xml │ ├── cat.webp │ ├── check.webp │ ├── convert.png │ ├── debug.png │ ├── delete.webp │ ├── dl_from_tg.webp │ ├── enjoy.png │ ├── folder.webp │ ├── github.webp │ ├── huaji.webp │ ├── icon.png │ ├── info.webp │ ├── input.png │ ├── itemback.xml │ ├── loading.webp │ ├── main_cleaner.webp │ ├── main_down.webp │ ├── main_helper.webp │ ├── menu_icon_plugin.webp │ ├── menu_item_base.xml │ ├── menu_item_base2.xml │ ├── menu_item_round.xml │ ├── micon.png │ ├── no_content.webp │ ├── plugin_btn.webp │ ├── plugin_load.webp │ ├── plugin_stop.webp │ ├── q.webp │ ├── repeat.webp │ ├── revoke.png │ ├── send.webp │ ├── share.webp │ ├── sticker_like.png │ ├── sticker_pack_set_icon.png │ ├── sticker_recent.png │ ├── tester.png │ ├── text_item_press.xml │ ├── textlines.xml │ ├── tool.webp │ ├── top_sticker_add.png │ ├── voice_down.webp │ ├── voice_file.webp │ ├── voice_item.webp │ ├── voice_panel.webp │ └── voice_upload.webp │ ├── layout │ ├── activity_main.xml │ ├── activity_opensource.xml │ ├── activity_update.xml │ ├── adapter_zhihu_comment.xml │ ├── alarm_view.xml │ ├── base_activity_container.xml │ ├── base_main_menu.xml │ ├── base_menu_item.xml │ ├── chat_msg_panel.xml │ ├── child_item.xml │ ├── child_item_container.xml │ ├── dbcleaner_item.xml │ ├── emo_bundle_list.xml │ ├── emo_get_from_tg.xml │ ├── emo_list_panel.xml │ ├── emo_pic_container.xml │ ├── emo_pre_save.xml │ ├── emo_search_online.xml │ ├── emo_show_empty.xml │ ├── file_download.xml │ ├── item_checker_hook_item.xml │ ├── item_checker_main.xml │ ├── item_checker_show_detail.xml │ ├── join_save_item.xml │ ├── loading_progress.xml │ ├── menu_javaplugin.xml │ ├── open_source_item.xml │ ├── plugin_create_new.xml │ ├── plugin_inchat_menu.xml │ ├── plugin_inchat_menu_item.xml │ ├── plugin_item_local.xml │ ├── plugin_item_menu_item.xml │ ├── plugin_item_online.xml │ ├── repeater_set_dialog.xml │ ├── select_dialog.xml │ ├── select_item.xml │ ├── sticker_panel_impl_input_from_local.xml │ ├── sticker_panel_plus_main.xml │ ├── sticker_panel_plus_pack_item.xml │ ├── storage_clean_item.xml │ ├── voice_base_panel.xml │ ├── voice_panel_item.xml │ ├── voice_pre_save.xml │ └── voice_tts.xml │ ├── values-night │ ├── colors.xml │ └── themes.xml │ └── values │ ├── arrays.xml │ ├── colors.xml │ ├── strings.xml │ └── themes.xml ├── README.md ├── build.gradle ├── common.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/workflows/Test_Build.yml: -------------------------------------------------------------------------------- 1 | name: Test Build CI 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | 7 | jobs: 8 | build: 9 | 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v2 14 | - name: set up JDK 11 15 | uses: actions/setup-java@v2 16 | with: 17 | java-version: '11' 18 | distribution: 'adopt' 19 | cache: gradle 20 | - name: Grant execute permission for gradlew 21 | run: chmod +x gradlew 22 | - name: Build with Gradle 23 | run: | 24 | mkdir tempDir 25 | cd tempDir 26 | git clone https://github.com/Hicores/QTool 27 | cd QTool 28 | export CommitNumber=`git rev-list --count main` 29 | echo $CommitNumber 30 | cd ../.. 31 | echo ${{ secrets.SIGN_KEY }} | base64 -d > key.jks 32 | git submodule update --init --recursive 33 | echo $CommitNumber 34 | ./gradlew :QTool:assembleRelease 35 | env: 36 | KEYSTORE_PATH: "../key.jks" 37 | KEYSTORE_PASSWORD: ${{ secrets.SIGN_PASS }} 38 | KEY_ALIAS: ${{ secrets.SIGN_ALIAS }} 39 | KEY_PASSWORD: ${{ secrets.ALIA_PASS }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "QTool/src/main/adfawhf/DexBuilder"] 2 | path = QTool/src/main/adfawhf/DexBuilder 3 | url = https://github.com/LSPosed/DexBuilder 4 | [submodule "libs/EasyAdapter"] 5 | path = libs/EasyAdapter 6 | url = https://github.com/Hicores/EasyAdapter 7 | [submodule "libs/XPopup"] 8 | path = libs/XPopup 9 | url = https://github.com/Hicores/XPopup 10 | [submodule "libs/BeanShell"] 11 | path = libs/BeanShell 12 | url = https://github.com/Hicores/BeanShell 13 | [submodule "libs/DexKit"] 14 | path = libs/DexKit 15 | url = https://github.com/Hicores/DexKit 16 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 25 | 26 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 20 | -------------------------------------------------------------------------------- /.idea/statistic.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /ItemProcesser/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /ItemProcesser/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-library' 3 | } 4 | 5 | java { 6 | sourceCompatibility = JavaVersion.VERSION_1_8 7 | targetCompatibility = JavaVersion.VERSION_1_8 8 | } 9 | 10 | dependencies { 11 | implementation 'com.google.auto.service:auto-service:1.0-rc6' 12 | annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6' 13 | } -------------------------------------------------------------------------------- /QQStub/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /QQStub/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.library' 3 | } 4 | 5 | android { 6 | compileSdk 32 7 | 8 | defaultConfig { 9 | minSdk 26 10 | targetSdk 32 11 | 12 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 13 | consumerProguardFiles "consumer-rules.pro" 14 | } 15 | 16 | buildTypes { 17 | release { 18 | minifyEnabled false 19 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 20 | } 21 | } 22 | compileOptions { 23 | sourceCompatibility JavaVersion.VERSION_1_8 24 | targetCompatibility JavaVersion.VERSION_1_8 25 | } 26 | } 27 | 28 | dependencies { 29 | 30 | implementation 'androidx.appcompat:appcompat:1.5.0' 31 | implementation 'com.google.android.material:material:1.6.1' 32 | testImplementation 'junit:junit:4.13.2' 33 | androidTestImplementation 'androidx.test.ext:junit:1.1.3' 34 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' 35 | } -------------------------------------------------------------------------------- /QQStub/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QQStub/consumer-rules.pro -------------------------------------------------------------------------------- /QQStub/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /QQStub/src/androidTest/java/cc/hicore/qqstub/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qqstub; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | assertEquals("cc.hicore.qqstub.test", appContext.getPackageName()); 25 | } 26 | } -------------------------------------------------------------------------------- /QQStub/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /QQStub/src/main/java/com/tencent/common/config/DeviceType.java: -------------------------------------------------------------------------------- 1 | package com.tencent.common.config; 2 | 3 | 4 | /* compiled from: P */ 5 | /* loaded from: classes4.dex */ 6 | public enum DeviceType { 7 | PHONE, 8 | TABLET, 9 | FOLD; 10 | 11 | DeviceType() { 12 | 13 | } 14 | } -------------------------------------------------------------------------------- /QQStub/src/test/java/cc/hicore/qqstub/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qqstub; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /QTool/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /release -------------------------------------------------------------------------------- /QTool/lint-baseline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /QTool/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | 35 | 38 | 42 | 45 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /QTool/src/main/adfawhf/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.18.1) 2 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os") 3 | set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections -std=c++20") 4 | 5 | find_library( 6 | ANDROID_LIBS 7 | log) 8 | add_subdirectory(DexBuilder) 9 | 10 | 11 | add_library( 12 | dexfinder SHARED 13 | biliroaming.cc 14 | ) 15 | 16 | target_link_libraries(dexfinder dex_builder) 17 | 18 | -------------------------------------------------------------------------------- /QTool/src/main/assets/xposed_init: -------------------------------------------------------------------------------- 1 | cc.hicore.qtool.XposedInit.HookEntry -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/ConfigUtils/BeforeConfig.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.ConfigUtils; 2 | 3 | import org.json.JSONObject; 4 | 5 | import cc.hicore.Utils.FileUtils; 6 | import cc.hicore.qtool.HookEnv; 7 | 8 | public class BeforeConfig { 9 | public static boolean getBoolean(String Name){ 10 | String path = HookEnv.AppPath + "/Global.json"; 11 | JSONObject jsonObject; 12 | try { 13 | jsonObject= new JSONObject(FileUtils.ReadFileString(path)); 14 | }catch (Exception e){ 15 | jsonObject = new JSONObject(); 16 | } 17 | return jsonObject.optBoolean(Name); 18 | } 19 | public static void putBoolean(String Name,boolean value){ 20 | String path = HookEnv.AppPath + "/Global.json"; 21 | JSONObject jsonObject; 22 | try { 23 | jsonObject= new JSONObject(FileUtils.ReadFileString(path)); 24 | }catch (Exception e){ 25 | jsonObject = new JSONObject(); 26 | } 27 | try{ 28 | jsonObject.put(Name,value); 29 | FileUtils.WriteToFile(path,jsonObject.toString()); 30 | }catch (Exception ignored){ 31 | 32 | } 33 | } 34 | public static int getInt(String Name){ 35 | String path = HookEnv.AppPath + "/Global.json"; 36 | JSONObject jsonObject; 37 | try { 38 | jsonObject= new JSONObject(FileUtils.ReadFileString(path)); 39 | }catch (Exception e){ 40 | jsonObject = new JSONObject(); 41 | } 42 | return jsonObject.optInt(Name); 43 | } 44 | public static void putInt(String Name,int value){ 45 | String path = HookEnv.AppPath + "/Global.json"; 46 | JSONObject jsonObject; 47 | try { 48 | jsonObject= new JSONObject(FileUtils.ReadFileString(path)); 49 | }catch (Exception e){ 50 | jsonObject = new JSONObject(); 51 | } 52 | try{ 53 | jsonObject.put(Name,value); 54 | FileUtils.WriteToFile(path,jsonObject.toString()); 55 | }catch (Exception ignored){ 56 | 57 | } 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/ConfigUtils/ConfigCore.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.ConfigUtils; 2 | 3 | import java.util.List; 4 | 5 | public interface ConfigCore { 6 | void removeKey(String PathName, String Key); 7 | 8 | void removeAll(String PathName); 9 | 10 | boolean getBoolean(String PathName, String Key, boolean Def); 11 | 12 | void setBoolean(String PathName, String Key, boolean Value); 13 | 14 | String getString(String PathName, String Key, String Def); 15 | 16 | void setString(String PathName, String Key, String Value); 17 | 18 | int getInt(String PathName, String Key, int Def); 19 | 20 | void setInt(String PathName, String Key, int Value); 21 | 22 | long getLong(String PathName, String Key, long Def); 23 | 24 | void setLong(String PathName, String Key, long Value); 25 | 26 | List getList(String PathName, String Key, boolean isCreate); 27 | 28 | void setList(String PathName, String Key, List Value); 29 | 30 | byte[] getBytes(String PathName, String Key); 31 | 32 | void setBytes(String PathName, String Key, byte[] Value); 33 | 34 | String[] getKeys(String PathName); 35 | } 36 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/ConfigUtils/GlobalConfig.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.ConfigUtils; 2 | 3 | import android.content.SharedPreferences; 4 | 5 | import cc.hicore.qtool.HookEnv; 6 | 7 | public class GlobalConfig { 8 | private static final String TAG = "QTool"; 9 | 10 | public static void Put_String(String Name, String Value) { 11 | SharedPreferences share = HookEnv.AppContext.getSharedPreferences(TAG, 0); 12 | SharedPreferences.Editor editor = share.edit(); 13 | editor.putString(Name, Value); 14 | editor.commit(); 15 | } 16 | 17 | public static String Get_String(String Name) { 18 | SharedPreferences share = HookEnv.AppContext.getSharedPreferences(TAG, 0); 19 | return share.getString(Name, ""); 20 | } 21 | 22 | public static void Put_Boolean(String Name, boolean Value) { 23 | SharedPreferences share = HookEnv.AppContext.getSharedPreferences(TAG, 0); 24 | SharedPreferences.Editor editor = share.edit(); 25 | editor.putBoolean(Name, Value); 26 | editor.commit(); 27 | } 28 | 29 | public static boolean Get_Boolean(String Name, boolean Defvalue) { 30 | SharedPreferences share = HookEnv.AppContext.getSharedPreferences(TAG, 0); 31 | return share.getBoolean(Name, Defvalue); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/DexFinder/IDexFinder.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.DexFinder; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | public interface IDexFinder { 6 | void init(String apkPath,ClassLoader loader); 7 | Method[] findMethodByString(String str); 8 | Method[] findMethodBeInvoked(Method beInvoked); 9 | Method[] findMethodInvoking(Method beInvoked); 10 | } 11 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/DexFinder/SoLoader.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.DexFinder; 2 | 3 | import android.provider.Settings; 4 | 5 | import java.io.File; 6 | import java.io.FileInputStream; 7 | import java.util.zip.ZipEntry; 8 | import java.util.zip.ZipInputStream; 9 | 10 | import cc.hicore.Utils.DataUtils; 11 | import cc.hicore.Utils.FileUtils; 12 | import cc.hicore.qtool.HookEnv; 13 | 14 | public class SoLoader { 15 | public static void loadByName(String name){ 16 | String cachePath = HookEnv.AppContext.getCacheDir() + "/" + DataUtils.getStrMD5(Settings.Secure.ANDROID_ID+"_").substring(0,8) + "/"; 17 | String tempName = ""+name.hashCode(); 18 | FileUtils.deleteFile(new File(cachePath+tempName)); 19 | outputLibToCache(cachePath+tempName,name); 20 | System.load(cachePath+tempName); 21 | } 22 | private static void outputLibToCache(String cachePath,String name){ 23 | String apkPath = HookEnv.ToolApkPath; 24 | try{ 25 | ZipInputStream zInp = new ZipInputStream(new FileInputStream(apkPath)); 26 | ZipEntry entry; 27 | while ((entry = zInp.getNextEntry())!= null){ 28 | if (android.os.Process.is64Bit() && entry.getName().startsWith("lib/arm64-v8a/"+name) ){ 29 | FileUtils.WriteToFile(cachePath,DataUtils.readAllBytes(zInp)); 30 | break; 31 | }else if (!android.os.Process.is64Bit() && entry.getName().startsWith("lib/armeabi-v7a/"+name)){ 32 | FileUtils.WriteToFile(cachePath,DataUtils.readAllBytes(zInp)); 33 | break; 34 | } 35 | } 36 | }catch (Exception ignored){ 37 | 38 | } 39 | 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/Annotations/ApiExecutor.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.Annotations; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.METHOD}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface ApiExecutor { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/Annotations/CommonExecutor.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.Annotations; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.METHOD}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface CommonExecutor { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/Annotations/MethodScanner.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.Annotations; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.METHOD}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface MethodScanner { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/Annotations/UIClick.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.Annotations; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.METHOD}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface UIClick { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/Annotations/UIItem.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.Annotations; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.METHOD}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface UIItem { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/Annotations/VerController.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.Annotations; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.METHOD}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface VerController { 11 | int targetVer() default -1; 12 | int max_targetVer() default -1; 13 | 14 | int Target_App_QQ = 1; 15 | int Target_App_Tim = 1 << 1; 16 | int targetApp() default Target_App_QQ; 17 | } 18 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/Annotations/XPChecker.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.Annotations; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.METHOD}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface XPChecker { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/Annotations/XPExecutor.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.Annotations; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | import de.robv.android.xposed.XC_MethodHook; 9 | 10 | @Target({ElementType.METHOD}) 11 | @Retention(RetentionPolicy.RUNTIME) 12 | public @interface XPExecutor { 13 | int Before = 1; 14 | int After = 1 << 1; 15 | 16 | String methodID(); 17 | int period() default Before; 18 | int hook_period() default XC_MethodHook.PRIORITY_DEFAULT; 19 | } 20 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/Annotations/XPItem.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.Annotations; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.TYPE}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface XPItem { 11 | int ITEM_Hook = 1; 12 | int ITEM_Api = 2; 13 | int itemType(); 14 | 15 | int targetVer() default -1; 16 | int max_targetVer() default -1; 17 | 18 | int PROC_MAIN = 1; 19 | int PROC_ALL = 2; 20 | int proc() default PROC_MAIN; 21 | 22 | String name(); 23 | 24 | int Period_Early = 1; 25 | int Period_InitData = 2; 26 | int period() default Period_Early; 27 | 28 | int Target_App_QQ = 1; 29 | int Target_App_Tim = 1 << 1; 30 | int targetApp() default Target_App_QQ; 31 | 32 | } 33 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/bridge/BaseFindMethodInfo.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.bridge; 2 | 3 | public class BaseFindMethodInfo extends BaseMethodInfo{ 4 | public String LinkedToMethodID; 5 | 6 | public BaseMethodInfo.MethodChecker checker; 7 | 8 | public Class InClass; 9 | public int paramCount; 10 | public BaseMethodInfo[] paramTypes; 11 | public BaseMethodInfo returnType; 12 | } 13 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/bridge/BaseMethodInfo.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.bridge; 2 | 3 | import java.lang.reflect.Member; 4 | 5 | import cc.hicore.HookItemLoader.core.CoreLoader; 6 | 7 | 8 | public class BaseMethodInfo { 9 | public static final int TYPE_METHOD = 1; 10 | public static final int TYPE_FINDER_INFO = 2; 11 | public int type; 12 | public String id; 13 | public CoreLoader.XPItemInfo bandToInfo; 14 | public interface MethodChecker{ 15 | Object onMethod(Member member); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/bridge/BaseXPExecutor.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.bridge; 2 | 3 | import de.robv.android.xposed.XC_MethodHook; 4 | 5 | public interface BaseXPExecutor { 6 | void onInvoke(XC_MethodHook.MethodHookParam param) throws Throwable; 7 | } 8 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/bridge/CommonMethodInfo.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.bridge; 2 | 3 | import java.lang.reflect.Member; 4 | 5 | public class CommonMethodInfo extends BaseMethodInfo { 6 | public Member methods; 7 | } 8 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/bridge/FindMethodByName.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.bridge; 2 | 3 | public class FindMethodByName extends BaseFindMethodInfo { 4 | public String name; 5 | 6 | } 7 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/bridge/FindMethodInvokingMethod.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.bridge; 2 | 3 | import java.lang.reflect.Member; 4 | 5 | public class FindMethodInvokingMethod extends BaseFindMethodInfo{ 6 | public Member checkMethod; 7 | } 8 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/bridge/FindMethodsWhichInvokeToTargetMethod.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.bridge; 2 | 3 | import java.lang.reflect.Member; 4 | 5 | public class FindMethodsWhichInvokeToTargetMethod extends BaseFindMethodInfo{ 6 | public Member checkMethod; 7 | } 8 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/bridge/MethodContainer.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.bridge; 2 | 3 | import java.lang.reflect.Member; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | 7 | public class MethodContainer { 8 | private final ArrayList NeedMethodList = new ArrayList<>(); 9 | public void addMethod(String id, Member m){ 10 | NeedMethodList.add(MethodFinderBuilder.newCommonMethod(id,m)); 11 | } 12 | public void addMethod(BaseMethodInfo m){ 13 | NeedMethodList.add(m); 14 | } 15 | public List getInfo(){ 16 | return NeedMethodList; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/bridge/QQVersion.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.bridge; 2 | 3 | public class QQVersion { 4 | public static final int QQ_8_8_35 = 6445; 5 | public static final int QQ_8_8_38 = 6590; 6 | public static final int QQ_8_8_50 = 6735; 7 | public static final int QQ_8_8_55 = 6900; 8 | public static final int QQ_8_8_68 = 7265; 9 | public static final int QQ_8_8_80 = 7400; 10 | public static final int QQ_8_8_83 = 7540; 11 | public static final int QQ_8_8_85 = 7685; 12 | public static final int QQ_8_8_88 = 7830; 13 | public static final int QQ_8_8_90 = 7975; 14 | public static final int QQ_8_8_93 = 8120; 15 | public static final int QQ_8_8_95 = 8265; 16 | public static final int QQ_8_8_98 = 8410; 17 | public static final int QQ_8_9_0 = 8555; 18 | public static final int QQ_8_9_3 = 8730; 19 | public static final int QQ_8_9_5 = 8845; 20 | public static final int QQ_8_9_8 = 8995; 21 | public static final int QQ_8_9_10 = 9135; 22 | public static final int QQ_8_9_13 = 9280; 23 | public static final int QQ_8_9_15 = 9425; 24 | public static final int QQ_8_9_18 = 9570; 25 | public static final int QQ_8_9_19 = 9580; 26 | public static final int QQ_8_9_28 = 10150; 27 | public static final int QQ_8_9_33 = 10335; 28 | public static final int QQ_8_9_35 = 10440; 29 | public static final int QQ_8_9_38 = 10545; 30 | public static final int QQ_8_9_58 = 11040; 31 | } 32 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/bridge/UIInfo.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.bridge; 2 | 3 | import cc.hicore.HookItemLoader.core.CoreLoader; 4 | 5 | public class UIInfo { 6 | public String name; 7 | public String groupName; 8 | public String desc = ""; 9 | public int type; 10 | public int targetID; 11 | 12 | public CoreLoader.XPItemInfo connectTo; 13 | } 14 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/core/ApiHelper.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.core; 2 | 3 | import android.util.Log; 4 | 5 | public class ApiHelper { 6 | public static Any invoke(Class ApiClass,Object... AnyParam){ 7 | CoreLoader.XPItemInfo info = CoreLoader.clzInstance.get(ApiClass); 8 | if (info != null){ 9 | try { 10 | return (Any) info.apiExecutor.invoke(info.Instance,AnyParam); 11 | }catch (Throwable th){ 12 | info.ExecutorException.put(info.apiExecutor+"", Log.getStackTraceString(th.getCause())); 13 | return null; 14 | } 15 | }else { 16 | throw new RuntimeException("No impl found for "+ApiClass); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/HookItemLoader/core/SecurityChecker.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.HookItemLoader.core; 2 | 3 | import android.content.SharedPreferences; 4 | 5 | import cc.hicore.qtool.HookEnv; 6 | import cc.hicore.qtool.QQManager.QQEnvUtils; 7 | 8 | public class SecurityChecker { 9 | public static int checkLoaderType(){ 10 | SharedPreferences share = HookEnv.AppContext.getSharedPreferences("SecurityLoad",0); 11 | return share.getInt("type",0); 12 | } 13 | public static void saveLoaderType(int type){ 14 | SharedPreferences share = HookEnv.AppContext.getSharedPreferences("SecurityLoad",0); 15 | SharedPreferences.Editor editor = share.edit(); 16 | editor.putInt("type",type); 17 | editor.commit(); 18 | } 19 | public static boolean isLoading(){ 20 | SharedPreferences share = HookEnv.AppContext.getSharedPreferences("SecurityLoad",0); 21 | return share.getBoolean("loading",false); 22 | } 23 | public static void savePreload(){ 24 | SharedPreferences share = HookEnv.AppContext.getSharedPreferences("SecurityLoad",0); 25 | SharedPreferences.Editor editor = share.edit(); 26 | editor.putBoolean("loading",true); 27 | editor.commit(); 28 | } 29 | public static void finishPreload(){ 30 | SharedPreferences share = HookEnv.AppContext.getSharedPreferences("SecurityLoad",0); 31 | SharedPreferences.Editor editor = share.edit(); 32 | editor.remove("loading"); 33 | editor.commit(); 34 | } 35 | public static void crash(){ 36 | QQEnvUtils.ExitQQAnyWays(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/LogUtils/LogUtils.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.LogUtils; 2 | 3 | import android.util.Log; 4 | 5 | import java.text.SimpleDateFormat; 6 | import java.util.Date; 7 | import java.util.Locale; 8 | 9 | import cc.hicore.Tracker.AutoReport; 10 | 11 | public class LogUtils { 12 | static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.CHINA); 13 | 14 | public static void debug(String Tag, String text) { 15 | LogOutputFile.Print(LogOutputFile.LEVEL_DEBUG, "[" + format.format(new Date()) + "]" + Tag + ":" + text); 16 | } 17 | 18 | private static void error(String Tag, String text) { 19 | LogOutputFile.Print(LogOutputFile.LEVEL_ERROR, "[" + format.format(new Date()) + "]" + Tag + ":" + text); 20 | } 21 | public static void error(String Tag, Throwable t) { 22 | AutoReport.reportException(Tag,t,""); 23 | error(Tag, Log.getStackTraceString(t)); 24 | } 25 | 26 | private static void fetal_error(String Tag, String text) { 27 | LogOutputFile.Print(LogOutputFile.LEVEL_FETAL_ERROR, "[" + format.format(new Date()) + "]" + Tag + ":" + text); 28 | } 29 | 30 | public static void fetal_error(String Tag, Throwable t) { 31 | AutoReport.reportException(Tag,t,""); 32 | fetal_error(Tag, Log.getStackTraceString(t)); 33 | } 34 | 35 | public static void info(String Tag, String text) { 36 | LogOutputFile.Print(LogOutputFile.LEVEL_INFO, "[" + format.format(new Date()) + "]" + Tag + ":" + text); 37 | } 38 | 39 | public static void warning(String Tag, String text) { 40 | LogOutputFile.Print(LogOutputFile.LEVEL_WARNING, "[" + format.format(new Date()) + "]" + Tag + ":" + text); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/ReflectUtils/Classes.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.ReflectUtils; 2 | 3 | public final class Classes { 4 | public static Class MessageRecord() { 5 | return MClass.loadClass("com.tencent.mobileqq.data.MessageRecord"); 6 | } 7 | 8 | public static Class AppInterface() { 9 | return MClass.loadClass("com.tencent.common.app.AppInterface"); 10 | } 11 | 12 | public static Class QQAppinterFace() { 13 | return MClass.loadClass("com.tencent.mobileqq.app.QQAppInterface"); 14 | } 15 | 16 | public static Class SessionInfo() { 17 | return MClass.loadClass("com.tencent.mobileqq.activity.aio.SessionInfo"); 18 | } 19 | public static Class ChatMessage(){ 20 | return MClass.loadClass("com.tencent.mobileqq.data.ChatMessage"); 21 | } 22 | public static Class BaseSessionInfo(){ 23 | return MClass.loadClass("com.tencent.mobileqq.activity.aio.SessionInfo").getSuperclass(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/ReflectUtils/QQReflect.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.ReflectUtils; 2 | 3 | import android.view.View; 4 | 5 | import java.lang.reflect.Method; 6 | 7 | public class QQReflect { 8 | public static Method GetItemBuilderMenuBuilder(Class clz) { 9 | for (Method med : clz.getDeclaredMethods()) { 10 | if (med.getParameterTypes().length == 1) { 11 | if (med.getParameterTypes()[0] == View.class) { 12 | Class ReturnClz = med.getReturnType(); 13 | if (ReturnClz.isArray()) { 14 | return med; 15 | } 16 | } 17 | } 18 | } 19 | return null; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/ReflectUtils/ResUtils.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.ReflectUtils; 2 | 3 | import android.content.Context; 4 | 5 | import com.github.kyuubiran.ezxhelper.init.EzXHelperInit; 6 | 7 | import cc.hicore.LogUtils.LogUtils; 8 | import cc.hicore.qtool.R; 9 | 10 | public class ResUtils { 11 | public static void StartInject(Context ctx) { 12 | try { 13 | if (ctx == null) return; 14 | try { 15 | ctx.getResources().getString(R.string.TestResInject); 16 | } catch (Exception e) { 17 | EzXHelperInit.INSTANCE.addModuleAssetPath(ctx); 18 | } 19 | } catch (Exception e) { 20 | LogUtils.fetal_error("Inject_Res", e); 21 | } 22 | } 23 | 24 | public static boolean CheckResInject(Context context) { 25 | try { 26 | return context.getResources().getString(R.string.TestResInject).equals("Test Success"); 27 | } catch (Exception e) { 28 | return false; 29 | } 30 | } 31 | 32 | 33 | } 34 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/Tracker/AppCenterTracker.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.Tracker; 2 | 3 | import com.microsoft.appcenter.analytics.Analytics; 4 | 5 | import java.util.HashMap; 6 | 7 | import cc.hicore.HookItemLoader.Annotations.CommonExecutor; 8 | import cc.hicore.HookItemLoader.Annotations.VerController; 9 | import cc.hicore.HookItemLoader.Annotations.XPItem; 10 | import cc.hicore.qtool.BuildConfig; 11 | import cc.hicore.qtool.QQManager.QQEnvUtils; 12 | 13 | @XPItem(name = "AppCenter_Init",itemType = XPItem.ITEM_Hook,period = XPItem.Period_InitData) 14 | public class AppCenterTracker{ 15 | public static void StartTrack() { 16 | try { 17 | Thread.sleep(5000); 18 | } catch (InterruptedException e) { 19 | e.printStackTrace(); 20 | } 21 | HashMap trackData = new HashMap<>(); 22 | trackData.put("Uin", QQEnvUtils.getCurrentUin()); 23 | trackData.put("UseVer", BuildConfig.VERSION_NAME); 24 | Analytics.trackEvent("QTLoadInMainProc", trackData); 25 | } 26 | @VerController 27 | @CommonExecutor 28 | public void startHook(){ 29 | new Thread(AppCenterTracker::StartTrack).start(); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/Tracker/AutoReport.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.Tracker; 2 | 3 | import com.microsoft.appcenter.crashes.Crashes; 4 | 5 | import java.util.HashMap; 6 | import java.util.HashSet; 7 | import java.util.Map; 8 | import java.util.concurrent.ExecutorService; 9 | import java.util.concurrent.Executors; 10 | 11 | import cc.hicore.qtool.BuildConfig; 12 | import de.robv.android.xposed.XposedBridge; 13 | 14 | public class AutoReport { 15 | private static final ExecutorService singleReport = Executors.newSingleThreadExecutor(); 16 | private static final HashSet reportCache = new HashSet<>(); 17 | public static void reportException(String tag,Throwable contain,String extra){ 18 | if (reportCache.contains(tag+"->"+contain))return; 19 | reportCache.add(tag+"->"+contain); 20 | singleReport.execute(()-> reportExceptionThread(tag,contain,extra)); 21 | } 22 | private static void reportExceptionThread(String tag,Throwable contain,String extra){ 23 | try { 24 | Map properties = new HashMap() {{ 25 | put("ver", BuildConfig.VERSION_NAME); 26 | put("tag",tag); 27 | put("extra",extra); 28 | }}; 29 | Crashes.trackError(contain, properties, null); 30 | }catch (Throwable e){ 31 | XposedBridge.log(e); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/Utils/ActionUtils.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.Utils; 2 | 3 | import android.app.Activity; 4 | 5 | import java.util.HashMap; 6 | 7 | public class ActionUtils { 8 | private static HashMap cacheAction = new HashMap<>(); 9 | public interface onAction{ 10 | void onAction(Activity activity); 11 | } 12 | public static void startAction(String ActionName,Activity activity){ 13 | onAction action = cacheAction.get(ActionName); 14 | action.onAction(activity); 15 | } 16 | public static void registerAction(String ActionName,onAction action){ 17 | cacheAction.put(ActionName,action); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/Utils/Assert.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.Utils; 2 | 3 | public class Assert { 4 | public static void notNull(Object obj, String message) { 5 | if (obj == null) throw new NullPointerException(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/Utils/LayoutUtils.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.Utils; 2 | 3 | import android.view.View; 4 | import android.view.ViewGroup; 5 | 6 | public class LayoutUtils { 7 | public static View findView(String Name, ViewGroup vg) { 8 | for (int i = 0; i < vg.getChildCount(); i++) { 9 | if (vg.getChildAt(i).getClass().getSimpleName().contains(Name)) { 10 | return vg.getChildAt(i); 11 | } 12 | } 13 | return null; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/Utils/NameUtils.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.Utils; 2 | 3 | import java.util.Random; 4 | 5 | public class NameUtils { 6 | public static String GetRandomName() { 7 | return getRandomString(16); 8 | } 9 | 10 | public static String getRandomString(int length) { 11 | String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 12 | Random random = new Random(); 13 | StringBuffer sb = new StringBuffer(); 14 | for (int i = 0; i < length; i++) { 15 | int number = random.nextInt(62); 16 | sb.append(str.charAt(number)); 17 | } 18 | return sb.toString(); 19 | } 20 | 21 | public static String getRandomString0(int length) { 22 | String str = "abcdefghijklmnopqrstuvwxyz"; 23 | Random random = new Random(); 24 | StringBuffer sb = new StringBuffer(); 25 | for (int i = 0; i < length; i++) { 26 | int number = random.nextInt(str.length() - 1); 27 | sb.append(str.charAt(number)); 28 | } 29 | return sb.toString(); 30 | } 31 | 32 | public static String getRandomString2(int length) { 33 | String str = "abcdefghijklmnopqrstuvwxyz0123456789"; 34 | Random random = new Random(); 35 | StringBuffer sb = new StringBuffer(); 36 | for (int i = 0; i < length; i++) { 37 | int number = random.nextInt(str.length() - 1); 38 | sb.append(str.charAt(number)); 39 | } 40 | return sb.toString(); 41 | } 42 | 43 | 44 | public static String GetRandomPackageName() { 45 | Random random = new Random(); 46 | if (Math.random() > 0.5) { 47 | return getRandomString0(random.nextInt(5) + 3) + "." + getRandomString0(random.nextInt(5) + 3); 48 | } else { 49 | return getRandomString0(random.nextInt(5) + 3) + "." + getRandomString0(random.nextInt(5) + 3) + "." + getRandomString0(random.nextInt(5) + 3); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/Utils/ServerUtils.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.Utils; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | public class ServerUtils { 7 | public static String getNewestCIBuildVer(){ 8 | try{ 9 | String result = HttpUtils.getContent("https://github.com/Hicores/QTool/actions"); 10 | Pattern pattern = Pattern.compile("Run [0-9]{3} of Build CI"); 11 | Matcher matcher = pattern.matcher(result); 12 | while (matcher.find()){ 13 | int start = matcher.start(); 14 | int end = matcher.end(); 15 | String match2 = result.substring(start,end); 16 | Pattern pattern2 = Pattern.compile("[0-9]{3}"); 17 | matcher = pattern2.matcher(match2); 18 | 19 | if (matcher.find()){ 20 | start = matcher.start(); 21 | end = matcher.end(); 22 | return match2.substring(start,end); 23 | } 24 | } 25 | }catch (Exception e){ 26 | 27 | } 28 | return "null"; 29 | 30 | 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/Utils/StringUtils.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.Utils; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class StringUtils { 6 | public static String[] GetStringMiddleMix(String source, String before, String last) { 7 | if (source == null) return new String[0]; 8 | int index = -1; 9 | int index2 = -1; 10 | ArrayList result = new ArrayList<>(); 11 | try { 12 | index = source.indexOf(before); 13 | while (index > -1) { 14 | index2 = source.indexOf(last, index + before.length()); 15 | if (index2 == -1) break; 16 | String searchEnd = source.substring(index + before.length(), index2); 17 | result.add(searchEnd); 18 | 19 | 20 | index = source.indexOf(before, index2 + last.length()); 21 | } 22 | } finally { 23 | return result.toArray(new String[0]); 24 | } 25 | } 26 | 27 | public static String GetOneStringMiddleMix(String source, String before, String last) { 28 | if (source == null) return null; 29 | int index = -1; 30 | int index2 = -1; 31 | ArrayList result = new ArrayList<>(); 32 | try { 33 | index = source.indexOf(before); 34 | if (index > -1) { 35 | index2 = source.indexOf(last, index + before.length()); 36 | if (index2 > -1) { 37 | String searchEnd = source.substring(index + before.length(), index2); 38 | return searchEnd; 39 | } 40 | } 41 | } finally { 42 | 43 | } 44 | return null; 45 | } 46 | 47 | public static String Repeat(String re, int count) { 48 | StringBuilder builder = new StringBuilder(); 49 | for (int i = 0; i < count; i++) builder.append(re); 50 | return builder.toString(); 51 | } 52 | 53 | public static int Count(String raw, String target) { 54 | int find = raw.indexOf(target); 55 | int Count = 0; 56 | while (find != -1) { 57 | Count++; 58 | find = raw.indexOf(target, find + target.length()); 59 | } 60 | return Count; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/Utils/ThreadUtils.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.Utils; 2 | 3 | public class ThreadUtils { 4 | public static void PostCommonTask(Runnable runnable){ 5 | new Thread(runnable,"QTool_Thread_Worker").start(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/ActProxy/MainMenuActionRegister.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.ActProxy; 2 | 3 | import android.content.Intent; 4 | import android.net.Uri; 5 | 6 | import cc.hicore.Utils.ActionUtils; 7 | import cc.hicore.qtool.JavaPlugin.ListForm.JavaPluginAct; 8 | import cc.hicore.qtool.R; 9 | import cc.hicore.qtool.XposedInit.DebugDialog; 10 | 11 | public class MainMenuActionRegister { 12 | static { 13 | ActionUtils.registerAction("OpenJavaPlugin", JavaPluginAct::startActivity); 14 | MainMenu.addItemData(0, "Java脚本", 0, "OpenJavaPlugin", R.drawable.menu_icon_plugin); 15 | 16 | ActionUtils.registerAction("QQHelper", v -> MainItemChildLoader.startLoad(1, v)); 17 | MainMenu.addItemData(1, "QQ辅助功能", 0, "QQHelper", R.drawable.main_helper); 18 | 19 | ActionUtils.registerAction("QQCleaner", v -> MainItemChildLoader.startLoad(2, v)); 20 | MainMenu.addItemData(2, "QQ净化功能", 0, "QQCleaner", R.drawable.main_cleaner); 21 | 22 | ActionUtils.registerAction("Enjoy", v -> MainItemChildLoader.startLoad(3, v)); 23 | MainMenu.addItemData(3, "娱乐功能", 0, "Enjoy", R.drawable.enjoy); 24 | 25 | ActionUtils.registerAction("Tester", v -> MainItemChildLoader.createAlarmView(4, v)); 26 | MainMenu.addItemData(4, "实验性功能", 0, "Tester", R.drawable.tester); 27 | 28 | 29 | ActionUtils.registerAction("DebugUtils", DebugDialog::startShow); 30 | MainMenu.addItemData(10, "状态查看", 0, "DebugUtils", R.drawable.debug); 31 | 32 | ActionUtils.registerAction("ItemStatus", ShowModuleItemStatus::onShow); 33 | MainMenu.addItemData(11, "故障排查", 0, "ItemStatus", R.drawable.check); 34 | 35 | 36 | ActionUtils.registerAction("AddGroup", context -> { 37 | Uri u = Uri.parse("https://t.me/QToolC"); 38 | Intent in = new Intent(Intent.ACTION_VIEW, u); 39 | context.startActivity(in); 40 | }); 41 | MainMenu.addItemData(20, "加入TG群组", 0, "AddGroup", R.drawable.add_group); 42 | 43 | ActionUtils.registerAction("DownloadNewVer", v -> { 44 | Uri u = Uri.parse("https://github.com/Hicores/QTool"); 45 | Intent in = new Intent(Intent.ACTION_VIEW, u); 46 | v.startActivity(in); 47 | }); 48 | MainMenu.addItemData(31, "最新版本下载", 0, "DownloadNewVer", R.drawable.main_down); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/ChatHook/ChatCracker/AlwaysShowAvatar.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.ChatHook.ChatCracker; 2 | 3 | import android.view.View; 4 | import android.widget.RelativeLayout; 5 | 6 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 7 | import cc.hicore.HookItemLoader.Annotations.UIItem; 8 | import cc.hicore.HookItemLoader.Annotations.VerController; 9 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 10 | import cc.hicore.HookItemLoader.Annotations.XPItem; 11 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 12 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 13 | import cc.hicore.HookItemLoader.bridge.QQVersion; 14 | import cc.hicore.HookItemLoader.bridge.UIInfo; 15 | import cc.hicore.ReflectUtils.Finders; 16 | import cc.hicore.Utils.LayoutUtils; 17 | 18 | @XPItem(name = "聊天消息强制显示头像", itemType = XPItem.ITEM_Hook) 19 | public class AlwaysShowAvatar { 20 | 21 | @UIItem 22 | @VerController 23 | public UIInfo getUIInfo() { 24 | UIInfo ui = new UIInfo(); 25 | ui.name = "聊天消息强制显示头像"; 26 | ui.desc = "主要针对某些全屏卡片"; 27 | ui.targetID = 2; 28 | ui.type = 1; 29 | ui.groupName = "聊天净化"; 30 | return ui; 31 | } 32 | 33 | @VerController 34 | @XPExecutor(methodID = "onAIOGetView", period = XPExecutor.After) 35 | public BaseXPExecutor hookWorker() { 36 | return param -> { 37 | Object mGetView = param.getResult(); 38 | RelativeLayout mLayout; 39 | if (mGetView instanceof RelativeLayout) mLayout = (RelativeLayout) mGetView; 40 | else return; 41 | View avatar = LayoutUtils.findView("VasAvatar", mLayout); 42 | if (avatar != null) { 43 | if (avatar.getVisibility() != View.VISIBLE) { 44 | avatar.setVisibility(View.VISIBLE); 45 | } 46 | } 47 | }; 48 | } 49 | 50 | 51 | @MethodScanner 52 | @VerController(max_targetVer = QQVersion.QQ_8_9_0) 53 | public void getHookMethod(MethodContainer container) { 54 | Finders.AIOMessageListAdapter_getView(container); 55 | } 56 | 57 | @MethodScanner 58 | @VerController(targetVer = QQVersion.QQ_8_9_0) 59 | public void getHookMethod_890(MethodContainer container) { 60 | Finders.AIOMessageListAdapter_getView_890(container); 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/ChatHook/ChatCracker/ChangeTipToSystemMsg.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.ChatHook.ChatCracker; 2 | 3 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 4 | import cc.hicore.HookItemLoader.Annotations.UIItem; 5 | import cc.hicore.HookItemLoader.Annotations.VerController; 6 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 7 | import cc.hicore.HookItemLoader.Annotations.XPItem; 8 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 9 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 10 | import cc.hicore.HookItemLoader.bridge.QQVersion; 11 | import cc.hicore.HookItemLoader.bridge.UIInfo; 12 | import cc.hicore.ReflectUtils.Finders; 13 | import cc.hicore.ReflectUtils.MField; 14 | import cc.hicore.ReflectUtils.MMethod; 15 | 16 | @XPItem(name = "状态消息隐藏", itemType = XPItem.ITEM_Hook) 17 | public class ChangeTipToSystemMsg { 18 | @UIItem 19 | @VerController 20 | public UIInfo getUIInfo() { 21 | UIInfo ui = new UIInfo(); 22 | ui.groupName = "聊天净化"; 23 | ui.name = "状态消息隐藏"; 24 | ui.desc = "阻止状态消息显示在自己的消息记录中"; 25 | ui.targetID = 2; 26 | ui.type = 1; 27 | return ui; 28 | } 29 | 30 | @MethodScanner 31 | @VerController(max_targetVer = QQVersion.QQ_8_9_0) 32 | public void getHookMethod(MethodContainer container) { 33 | Finders.onTroopMessage(container); 34 | } 35 | 36 | @MethodScanner 37 | @VerController(targetVer = QQVersion.QQ_8_9_0) 38 | public void getHookMethod_890(MethodContainer container) { 39 | Finders.onTroopMessageNew(container); 40 | } 41 | 42 | @VerController 43 | @XPExecutor(methodID = "troopMsgProxy") 44 | public BaseXPExecutor hookWorker() { 45 | return param -> { 46 | Object ChatMsg = param.args[2]; 47 | if (ChatMsg.getClass().getName().contains("MessageForUniteGrayTip")) { 48 | try { 49 | MField.SetField(ChatMsg, "senderuin", "10000"); 50 | MMethod.CallMethod(ChatMsg, "prewrite", void.class, new Class[0]); 51 | } catch (Exception e) { 52 | e.printStackTrace(); 53 | } 54 | } 55 | }; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/ChatHook/ChatCracker/DisableReplayAt.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.ChatHook.ChatCracker; 2 | 3 | 4 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 5 | import cc.hicore.HookItemLoader.Annotations.UIItem; 6 | import cc.hicore.HookItemLoader.Annotations.VerController; 7 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 8 | import cc.hicore.HookItemLoader.Annotations.XPItem; 9 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 10 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 11 | import cc.hicore.HookItemLoader.bridge.MethodFinderBuilder; 12 | import cc.hicore.HookItemLoader.bridge.QQVersion; 13 | import cc.hicore.HookItemLoader.bridge.UIInfo; 14 | import cc.hicore.ReflectUtils.Classes; 15 | import cc.hicore.ReflectUtils.MClass; 16 | import cc.hicore.ReflectUtils.MMethod; 17 | 18 | @XPItem(name = "去除回复自动艾特", itemType = XPItem.ITEM_Hook) 19 | public class DisableReplayAt { 20 | @UIItem 21 | @VerController 22 | public UIInfo getUIItem() { 23 | UIInfo info = new UIInfo(); 24 | info.groupName = "聊天界面增强"; 25 | info.type = 1; 26 | info.targetID = 1; 27 | info.name = "去除回复自动艾特"; 28 | return info; 29 | } 30 | 31 | @MethodScanner 32 | @VerController(max_targetVer = QQVersion.QQ_8_9_0) 33 | public void findHookMethod(MethodContainer container) { 34 | container.addMethod("hook", MMethod.FindMethod(MClass.loadClass("com.tencent.mobileqq.activity.aio.rebuild.input.InputUIUtils"), "a", void.class, new Class[]{ 35 | MClass.loadClass("com.tencent.mobileqq.activity.aio.core.AIOContext"), 36 | Classes.BaseSessionInfo(), 37 | boolean.class 38 | })); 39 | } 40 | 41 | @MethodScanner 42 | @VerController(targetVer = QQVersion.QQ_8_9_0) 43 | public void findHookMethod_890(MethodContainer container) { 44 | container.addMethod(MethodFinderBuilder.newFinderByString("hook", "@", m -> { 45 | if (m.getDeclaringClass().getName().startsWith("com.tencent.mobileqq.activity.aio.rebuild.input")) { 46 | return MMethod.FindMethodByName(m.getDeclaringClass(), "a"); 47 | } 48 | return false; 49 | })); 50 | } 51 | 52 | @VerController 53 | @XPExecutor(methodID = "hook") 54 | public BaseXPExecutor hookWorker() { 55 | return param -> param.setResult(null); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/ChatHook/FuckBadMsg/BadAtMsgRemove.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.ChatHook.FuckBadMsg; 2 | 3 | import org.json.JSONObject; 4 | 5 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 6 | import cc.hicore.HookItemLoader.Annotations.UIItem; 7 | import cc.hicore.HookItemLoader.Annotations.VerController; 8 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 9 | import cc.hicore.HookItemLoader.Annotations.XPItem; 10 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 11 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 12 | import cc.hicore.HookItemLoader.bridge.UIInfo; 13 | import cc.hicore.ReflectUtils.MClass; 14 | import cc.hicore.ReflectUtils.MField; 15 | import cc.hicore.ReflectUtils.MMethod; 16 | 17 | @XPItem(itemType = XPItem.ITEM_Hook, name = "屏蔽异常艾特提示") 18 | public class BadAtMsgRemove { 19 | @VerController 20 | @UIItem 21 | public UIInfo getUI() { 22 | UIInfo ui = new UIInfo(); 23 | ui.name = "屏蔽异常艾特提示"; 24 | ui.groupName = "消息屏蔽"; 25 | ui.type = 1; 26 | ui.targetID = 2; 27 | return ui; 28 | } 29 | 30 | @VerController 31 | @MethodScanner 32 | public void getHookMethod(MethodContainer container) { 33 | container.addMethod("msg_notify", MMethod.FindMethod(MClass.loadClass("com.tencent.mobileqq.app.QQAppInterface"), "notifyMessageReceived", void.class, new Class[]{MClass.loadClass("com.tencent.imcore.message.Message"), boolean.class, boolean.class})); 34 | } 35 | 36 | @VerController 37 | @XPExecutor(methodID = "msg_notify") 38 | public BaseXPExecutor hookWorker() { 39 | return param -> { 40 | Object Message = param.args[0]; 41 | int sr = MField.GetField(Message, "bizType", int.class); 42 | if (sr == 25) { 43 | String msg = MField.GetField(Message, "msg", String.class); 44 | String extStr = MField.GetField(Message, "extStr", String.class); 45 | JSONObject json = new JSONObject(extStr); 46 | if (json.optString("long_text_recv_state").equals("1")) { 47 | if (!msg.contains("@")) { 48 | param.setResult(null); 49 | } 50 | } 51 | } 52 | 53 | }; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/ChatHook/Repeater/RepeaterSet.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.ChatHook.Repeater; 2 | 3 | import android.app.AlertDialog; 4 | import android.content.Context; 5 | import android.view.LayoutInflater; 6 | import android.widget.CheckBox; 7 | import android.widget.EditText; 8 | import android.widget.LinearLayout; 9 | import android.widget.TextView; 10 | 11 | import cc.hicore.qtool.HookEnv; 12 | import cc.hicore.qtool.R; 13 | 14 | public class RepeaterSet { 15 | public static void startShow(Context context) { 16 | 17 | LinearLayout ll = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.repeater_set_dialog, null); 18 | CheckBox allSwitch = ll.findViewById(R.id.All_Switch); 19 | allSwitch.setChecked(HookEnv.Config.getBoolean("Repeater", "Open", false)); 20 | 21 | EditText edSize = ll.findViewById(R.id.Repeater_Size_Input); 22 | edSize.setText("" + HookEnv.Config.getInt("Repeater", "Size", 32)); 23 | 24 | TextView tipText = ll.findViewById(R.id.Tip); 25 | tipText.setText("图标文件请存放在" + HookEnv.ExtraDataPath + "res/repeat.png,如果不存在或者无法访问将会使用默认图标"); 26 | 27 | CheckBox doubleClick = ll.findViewById(R.id.Double_Click_Mode); 28 | doubleClick.setChecked(HookEnv.Config.getBoolean("Repeater", "DoubleClickMode", false)); 29 | 30 | 31 | new AlertDialog.Builder(context) 32 | .setTitle("设置复读消息+1") 33 | .setView(ll) 34 | .setNegativeButton("确定", (dialog, which) -> { 35 | HookEnv.Config.setBoolean("Repeater", "Open", allSwitch.isChecked()); 36 | HookEnv.Config.setInt("Repeater", "Size", Integer.parseInt(edSize.getText().toString())); 37 | HookEnv.Config.setBoolean("Repeater", "DoubleClickMode", doubleClick.isChecked()); 38 | }).show(); 39 | 40 | 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/CrashHandler/ByPassInnerHook.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.CrashHandler; 2 | 3 | import de.robv.android.xposed.XC_MethodHook; 4 | import de.robv.android.xposed.XposedBridge; 5 | import de.robv.android.xposed.XposedHelpers; 6 | 7 | public class ByPassInnerHook { 8 | static XC_MethodHook.Unhook unhook; 9 | static ClassLoader mLoader = XposedBridge.class.getClassLoader(); 10 | 11 | public static void StartByPass() { 12 | unhook = XposedHelpers.findAndHookMethod(Class.class, "getClassLoader", new XC_MethodHook() { 13 | @Override 14 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 15 | super.afterHookedMethod(param); 16 | ClassLoader loader = (ClassLoader) param.getResult(); 17 | if (loader == mLoader) { 18 | unhook.unhook(); 19 | unhook = null; 20 | param.setResult(null); 21 | } 22 | } 23 | }); 24 | } 25 | 26 | public static void EndBypass() { 27 | if (unhook != null) { 28 | unhook.unhook(); 29 | unhook = null; 30 | } 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/CrashHandler/LogcatCatcher.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.CrashHandler; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.IOException; 5 | import java.io.InputStreamReader; 6 | 7 | 8 | public class LogcatCatcher { 9 | public static void startCatcherOnce() { 10 | CatchInstance.StartCatch(); 11 | } 12 | 13 | public static void StartCatch() { 14 | new Thread(() -> { 15 | try { 16 | Process proc = Runtime.getRuntime().exec("logcat"); 17 | InputStreamReader reader = new InputStreamReader(proc.getInputStream()); 18 | BufferedReader mReader = new BufferedReader(reader); 19 | String Line; 20 | while ((Line = mReader.readLine()) != null) { 21 | StringPool_Logcat.Add(Line); 22 | } 23 | 24 | } catch (IOException e) { 25 | StringPool_Logcat.Add("Can't execute logcat."); 26 | } 27 | }).start(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/CrashHandler/StringPool_Logcat.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.CrashHandler; 2 | 3 | import java.util.concurrent.atomic.AtomicBoolean; 4 | 5 | public class StringPool_Logcat { 6 | static AtomicBoolean Lock = new AtomicBoolean(); 7 | private static long Size = 0; 8 | private static StringPool_Logcat FirstPos; 9 | private static StringPool_Logcat CurrentPos; 10 | private StringPool_Logcat BeforePool; 11 | private StringPool_Logcat AfterPool; 12 | private final String Line; 13 | public StringPool_Logcat(String Text, StringPool_Logcat Before) { 14 | Line = Text; 15 | BeforePool = Before; 16 | Size += Text.length(); 17 | 18 | while (Size >= 256 * 1024) { 19 | StringPool_Logcat poolFirst = FirstPos; 20 | poolFirst = poolFirst.AfterPool; 21 | Size -= FirstPos.Line.length(); 22 | FirstPos = poolFirst; 23 | FirstPos.BeforePool = null; 24 | } 25 | } 26 | 27 | private static void Init() { 28 | FirstPos = new StringPool_Logcat("StringPoolStart", null); 29 | CurrentPos = FirstPos; 30 | } 31 | 32 | public static void Add(String Line) { 33 | if (Line == null) return; 34 | if (Lock.get()) return; 35 | if (FirstPos == null) Init(); 36 | StringPool_Logcat NewPool = new StringPool_Logcat(Line, CurrentPos); 37 | CurrentPos.AfterPool = NewPool; 38 | 39 | CurrentPos = NewPool; 40 | } 41 | 42 | public static String getAll() { 43 | try { 44 | Lock.getAndSet(true); 45 | StringPool_Logcat CheckPoolaa = FirstPos; 46 | StringBuilder builder = new StringBuilder(); 47 | 48 | while (CheckPoolaa != null) { 49 | builder.append(CheckPoolaa.Line).append("\n"); 50 | 51 | CheckPoolaa = CheckPoolaa.AfterPool; 52 | } 53 | return builder.toString(); 54 | } catch (Exception e) { 55 | return "Error,Can't get StringPool Data"; 56 | } finally { 57 | Lock.getAndSet(false); 58 | } 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/CrashHandler/StringPool_XpErr.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.CrashHandler; 2 | 3 | import java.util.concurrent.atomic.AtomicBoolean; 4 | 5 | public class StringPool_XpErr { 6 | static AtomicBoolean Lock = new AtomicBoolean(); 7 | private static long Size = 0; 8 | private static StringPool_XpErr FirstPos; 9 | private static StringPool_XpErr CurrentPos; 10 | private StringPool_XpErr BeforePool; 11 | private StringPool_XpErr AfterPool; 12 | private final String Line; 13 | public StringPool_XpErr(String Text, StringPool_XpErr Before) { 14 | Line = Text; 15 | BeforePool = Before; 16 | Size += Text.length(); 17 | 18 | while (Size >= 128 * 1024) { 19 | StringPool_XpErr poolFirst = FirstPos; 20 | poolFirst = poolFirst.AfterPool; 21 | Size -= FirstPos.Line.length(); 22 | FirstPos = poolFirst; 23 | FirstPos.BeforePool = null; 24 | } 25 | } 26 | 27 | private static void Init() { 28 | FirstPos = new StringPool_XpErr("StringPoolStart", null); 29 | CurrentPos = FirstPos; 30 | } 31 | 32 | public static void Add(String Line) { 33 | if (Line == null) return; 34 | if (Lock.get()) return; 35 | if (FirstPos == null) Init(); 36 | StringPool_XpErr NewPool = new StringPool_XpErr(Line, CurrentPos); 37 | CurrentPos.AfterPool = NewPool; 38 | 39 | CurrentPos = NewPool; 40 | } 41 | 42 | public static String getAll() { 43 | try { 44 | Lock.getAndSet(true); 45 | StringPool_XpErr CheckPoolaa = FirstPos; 46 | StringBuilder builder = new StringBuilder(); 47 | 48 | while (CheckPoolaa != null) { 49 | builder.append(CheckPoolaa.Line).append("\n"); 50 | 51 | CheckPoolaa = CheckPoolaa.AfterPool; 52 | } 53 | return builder.toString(); 54 | } catch (Exception e) { 55 | return "Error,Can't get StringPool Data"; 56 | } finally { 57 | Lock.getAndSet(false); 58 | } 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/CrashHandler/StringPool_XpLog.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.CrashHandler; 2 | 3 | import java.util.concurrent.atomic.AtomicBoolean; 4 | 5 | public class StringPool_XpLog { 6 | static AtomicBoolean Lock = new AtomicBoolean(); 7 | private static long Size = 0; 8 | private static StringPool_XpLog FirstPos; 9 | private static StringPool_XpLog CurrentPos; 10 | private StringPool_XpLog BeforePool; 11 | private StringPool_XpLog AfterPool; 12 | private final String Line; 13 | public StringPool_XpLog(String Text, StringPool_XpLog Before) { 14 | Line = Text; 15 | BeforePool = Before; 16 | Size += Text.length(); 17 | 18 | while (Size >= 128 * 1024) { 19 | StringPool_XpLog poolFirst = FirstPos; 20 | poolFirst = poolFirst.AfterPool; 21 | Size -= FirstPos.Line.length(); 22 | FirstPos = poolFirst; 23 | FirstPos.BeforePool = null; 24 | } 25 | } 26 | 27 | private static void Init() { 28 | FirstPos = new StringPool_XpLog("StringPoolStart", null); 29 | CurrentPos = FirstPos; 30 | } 31 | 32 | public static void Add(String Line) { 33 | if (Line == null) return; 34 | if (Lock.get()) return; 35 | if (FirstPos == null) Init(); 36 | StringPool_XpLog NewPool = new StringPool_XpLog(Line, CurrentPos); 37 | CurrentPos.AfterPool = NewPool; 38 | 39 | CurrentPos = NewPool; 40 | } 41 | 42 | public static String getAll() { 43 | try { 44 | Lock.getAndSet(true); 45 | StringPool_XpLog CheckPoolaa = FirstPos; 46 | StringBuilder builder = new StringBuilder(); 47 | 48 | while (CheckPoolaa != null) { 49 | builder.append(CheckPoolaa.Line).append("\n"); 50 | CheckPoolaa = CheckPoolaa.AfterPool; 51 | } 52 | return builder.toString(); 53 | } catch (Exception e) { 54 | return "Error,Can't get StringPool Data"; 55 | } finally { 56 | Lock.getAndSet(false); 57 | } 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/EmoHelper/Hooker/GuildSessionMonitor.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.EmoHelper.Hooker; 2 | 3 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 4 | import cc.hicore.HookItemLoader.Annotations.VerController; 5 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 6 | import cc.hicore.HookItemLoader.Annotations.XPItem; 7 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 8 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 9 | import cc.hicore.HookItemLoader.bridge.MethodFinderBuilder; 10 | import cc.hicore.HookItemLoader.bridge.QQVersion; 11 | import cc.hicore.ReflectUtils.MField; 12 | import cc.hicore.qtool.HookEnv; 13 | 14 | @XPItem(name = "GuildSessionMonitor", itemType = XPItem.ITEM_Hook, targetVer = QQVersion.QQ_8_9_3) 15 | public class GuildSessionMonitor { 16 | public static String guildID; 17 | public static String channelID; 18 | 19 | @VerController 20 | @MethodScanner 21 | public void findMethod(MethodContainer container) { 22 | container.addMethod(MethodFinderBuilder.newFinderByString("hook", "aioFactory.javaClass.name", m -> true)); 23 | } 24 | 25 | @VerController 26 | @XPExecutor(methodID = "hook") 27 | public BaseXPExecutor xpWorker() { 28 | return param -> { 29 | Object currentContext = param.args[0]; 30 | guildID = MField.GetField(currentContext, "a", String.class); 31 | channelID = MField.GetField(currentContext, "b", String.class); 32 | HookEnv.isCurrentGuild = true; 33 | }; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/HCHidePainter/HidePainter.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.HCHidePainter; 2 | 3 | import android.graphics.Canvas; 4 | 5 | public class HidePainter { 6 | public static void drawCanvas(Canvas vas,String text){ 7 | int width = vas.getWidth(); 8 | int height = vas.getHeight(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/HookEnv.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | import android.os.HandlerThread; 6 | 7 | import cc.hicore.ConfigUtils.ConfigCore; 8 | import cc.hicore.ConfigUtils.ConfigCore_Json; 9 | 10 | public class HookEnv { 11 | public static ClassLoader mLoader; 12 | public static ClassLoader moduleLoader; 13 | 14 | public static String ProcessName; 15 | 16 | public static String ExtraDataPath; 17 | public static String AppApkPath; 18 | public static String ToolApkPath; 19 | public static String AppPath; 20 | 21 | public static Context AppContext; 22 | public static Application Application; 23 | 24 | public static boolean IsMainProcess; 25 | public static ConfigCore Config = new ConfigCore_Json(); 26 | 27 | public static Object AppInterface; 28 | public static Object SessionInfo; 29 | 30 | public static String New_Version; 31 | public static HandlerThread tasker = new HandlerThread("QTool_Handler"); 32 | public static boolean isInSubMode = true; 33 | public static ClassLoader SubClassLoader; 34 | 35 | public static StringBuilder loadFailed = new StringBuilder(); 36 | public static int CurrentApp = 1; 37 | 38 | public static boolean isCurrentGuild = false; 39 | } 40 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/JavaPlugin/Controller/PluginErrorOutput.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.JavaPlugin.Controller; 2 | 3 | import java.io.File; 4 | import java.io.FileOutputStream; 5 | import java.nio.charset.StandardCharsets; 6 | 7 | public class PluginErrorOutput { 8 | //输出错误信息到对应的插件目录中 9 | public static synchronized void Print(String RootPath, String Msg) { 10 | try { 11 | File f = new File(RootPath, "error_track.txt"); 12 | if (f.isDirectory()) f.delete(); 13 | FileOutputStream fOut = new FileOutputStream(f, true); 14 | fOut.write((Msg + "\n").getBytes(StandardCharsets.UTF_8)); 15 | fOut.close(); 16 | } catch (Exception e) { 17 | 18 | } 19 | 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/JavaPlugin/Controller/PluginSetController.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.JavaPlugin.Controller; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | 7 | import cc.hicore.qtool.HookEnv; 8 | 9 | public class PluginSetController { 10 | public static boolean IsBlackMode(String PluginID) { 11 | return HookEnv.Config.getBoolean("Plugin_Black_Mode_List", PluginID, false); 12 | } 13 | 14 | public static void SetBlackMode(String PluginID, boolean IsBlack) { 15 | if (IsBlack) { 16 | HookEnv.Config.setBoolean("Plugin_Black_Mode_List", PluginID, true); 17 | } else { 18 | HookEnv.Config.removeKey("Plugin_Black_Mode_List", PluginID); 19 | } 20 | } 21 | 22 | public static boolean IsAutoLoad(String PluginID) { 23 | return HookEnv.Config.getBoolean("Plugin_Auto_Load_List", PluginID, false); 24 | } 25 | 26 | public static void SetAutoLoad(String PluginID, boolean IsAutoLoad) { 27 | if (IsAutoLoad) HookEnv.Config.setBoolean("Plugin_Auto_Load_List", PluginID, true); 28 | else HookEnv.Config.removeKey("Plugin_Auto_Load_List", PluginID); 29 | } 30 | 31 | public static void SetRefusePrivate(String PluginID, boolean IsRefuse) { 32 | if (IsRefuse) HookEnv.Config.setBoolean("Plugin_Refuse_Private", PluginID, true); 33 | else HookEnv.Config.removeKey("Plugin_Refuse_Private", PluginID); 34 | } 35 | 36 | public static boolean IsRefusePrivate(String PluginID) { 37 | return HookEnv.Config.getBoolean("Plugin_Refuse_Private", PluginID, false); 38 | } 39 | 40 | public static List getAutoLoadList() { 41 | return Arrays.asList(HookEnv.Config.getKeys("Plugin_Auto_Load_List")); 42 | } 43 | 44 | public static List getModeList(String PluginID) { 45 | return HookEnv.Config.getList("Plugin_Mode_List", PluginID, true); 46 | } 47 | 48 | public static void setModeList(String PluginID, ArrayList list) { 49 | if (list.size() == 0) { 50 | HookEnv.Config.removeKey("Plugin_Mode_List", PluginID); 51 | } else { 52 | HookEnv.Config.setList("Plugin_Mode_List", PluginID, list); 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/JavaPlugin/Hooker/IMessageHooker.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.JavaPlugin.Hooker; 2 | 3 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 4 | import cc.hicore.HookItemLoader.Annotations.VerController; 5 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 6 | import cc.hicore.HookItemLoader.Annotations.XPItem; 7 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 8 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 9 | import cc.hicore.HookItemLoader.bridge.MethodFinderBuilder; 10 | import cc.hicore.qtool.JavaPlugin.Controller.PluginMessageProcessor; 11 | 12 | @XPItem(name = "IPluginMessageHooker", itemType = XPItem.ITEM_Hook) 13 | public class IMessageHooker { 14 | @VerController 15 | @MethodScanner 16 | public void findMethod(MethodContainer container) { 17 | container.addMethod(MethodFinderBuilder.newFinderByString("pbSendMsg", "--->sendRichTextMessageWith_MR : msgseq=", m -> true)); 18 | } 19 | 20 | @XPExecutor(methodID = "pbSendMsg") 21 | @VerController 22 | public BaseXPExecutor hook_worker() { 23 | return param -> { 24 | Object records = param.args[0]; 25 | PluginMessageProcessor.onPbSendMessage(records); 26 | }; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQCleaner/ChatCleaner/HideListenerTogether.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQCleaner.ChatCleaner; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 6 | import cc.hicore.HookItemLoader.Annotations.UIItem; 7 | import cc.hicore.HookItemLoader.Annotations.VerController; 8 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 9 | import cc.hicore.HookItemLoader.Annotations.XPItem; 10 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 11 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 12 | import cc.hicore.HookItemLoader.bridge.MethodFinderBuilder; 13 | import cc.hicore.HookItemLoader.bridge.QQVersion; 14 | import cc.hicore.HookItemLoader.bridge.UIInfo; 15 | import cc.hicore.ReflectUtils.MClass; 16 | import cc.hicore.ReflectUtils.MMethod; 17 | 18 | @XPItem(name = "屏蔽一起听歌顶栏", itemType = XPItem.ITEM_Hook) 19 | public class HideListenerTogether { 20 | @UIItem 21 | @VerController 22 | public UIInfo getUI() { 23 | UIInfo ui = new UIInfo(); 24 | ui.name = "屏蔽一起听歌顶栏"; 25 | ui.groupName = "聊天界面净化"; 26 | ui.targetID = 2; 27 | ui.type = 1; 28 | return ui; 29 | } 30 | 31 | @VerController(targetVer = QQVersion.QQ_8_8_93) 32 | @MethodScanner 33 | public void getHookMethod_New(MethodContainer container) { 34 | container.addMethod(MethodFinderBuilder.newFinderByString("hook", "onUIModuleNeedRefresh, checkSession is false", m -> ((Method) m).getReturnType() == void.class)); 35 | } 36 | 37 | @VerController(max_targetVer = QQVersion.QQ_8_8_93) 38 | @MethodScanner 39 | public void getHookMethod(MethodContainer container) { 40 | container.addMethod("hook", MMethod.FindMethod(MClass.loadClass("com.tencent.mobileqq.listentogether.ui.BaseListenTogetherPanel"), "a", void.class, new Class[]{ 41 | MClass.loadClass("com.tencent.mobileqq.listentogether.ListenTogetherSession") 42 | })); 43 | 44 | } 45 | 46 | @VerController 47 | @XPExecutor(methodID = "hook") 48 | public BaseXPExecutor worker() { 49 | return param -> param.setResult(null); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQCleaner/ChatCleaner/PreventShakeWindow.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQCleaner.ChatCleaner; 2 | 3 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 4 | import cc.hicore.HookItemLoader.Annotations.UIItem; 5 | import cc.hicore.HookItemLoader.Annotations.VerController; 6 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 7 | import cc.hicore.HookItemLoader.Annotations.XPItem; 8 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 9 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 10 | import cc.hicore.HookItemLoader.bridge.QQVersion; 11 | import cc.hicore.HookItemLoader.bridge.UIInfo; 12 | import cc.hicore.ReflectUtils.Finders; 13 | import cc.hicore.ReflectUtils.MField; 14 | 15 | @XPItem(name = "屏蔽窗口抖动", itemType = XPItem.ITEM_Hook) 16 | public class PreventShakeWindow { 17 | @VerController 18 | @UIItem 19 | public UIInfo getUI() { 20 | UIInfo ui = new UIInfo(); 21 | ui.name = "屏蔽窗口抖动"; 22 | ui.groupName = "聊天净化"; 23 | ui.type = 1; 24 | ui.targetID = 2; 25 | return ui; 26 | } 27 | 28 | @VerController(max_targetVer = QQVersion.QQ_8_9_0) 29 | @MethodScanner 30 | public void getHookMethod(MethodContainer container) { 31 | Finders.onTroopMessage(container); 32 | } 33 | 34 | @VerController(targetVer = QQVersion.QQ_8_9_0) 35 | @MethodScanner 36 | public void getHookMethod_890(MethodContainer container) { 37 | Finders.onTroopMessageNew(container); 38 | } 39 | 40 | @VerController 41 | @XPExecutor(methodID = "troopMsgProxy") 42 | public BaseXPExecutor worker() { 43 | return param -> { 44 | Object ChatMsg = param.args[2]; 45 | if (ChatMsg.getClass().getSimpleName().equals("MessageForShakeWindow")) { 46 | MField.SetField(ChatMsg, "isread", true); 47 | } 48 | }; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQCleaner/MainCleaner/HideAdIcon.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQCleaner.MainCleaner; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 6 | import cc.hicore.HookItemLoader.Annotations.UIItem; 7 | import cc.hicore.HookItemLoader.Annotations.VerController; 8 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 9 | import cc.hicore.HookItemLoader.Annotations.XPItem; 10 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 11 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 12 | import cc.hicore.HookItemLoader.bridge.MethodFinderBuilder; 13 | import cc.hicore.HookItemLoader.bridge.UIInfo; 14 | 15 | @XPItem(name = "隐藏主界面右上角入口", itemType = XPItem.ITEM_Hook) 16 | public class HideAdIcon { 17 | @VerController 18 | @UIItem 19 | public UIInfo getUI() { 20 | UIInfo ui = new UIInfo(); 21 | ui.name = "隐藏主界面右上角入口"; 22 | ui.desc = "可能包含小世界入口等"; 23 | ui.groupName = "主界面净化"; 24 | ui.type = 1; 25 | ui.targetID = 2; 26 | return ui; 27 | } 28 | 29 | @VerController 30 | @XPExecutor(methodID = "hook") 31 | public BaseXPExecutor worker() { 32 | return param -> param.setResult(null); 33 | } 34 | 35 | @VerController 36 | @MethodScanner 37 | public void getHookMethod(MethodContainer container) { 38 | container.addMethod(MethodFinderBuilder.newFinderByString("hook_before", "#666666", m -> m.getDeclaringClass().getName().equals("com.tencent.mobileqq.activity.home.Conversation"))); 39 | container.addMethod(MethodFinderBuilder.newFinderWhichMethodInvokingLinked("hook", "hook_before", m -> ((Method) m).getParameterCount() == 0 && m.getDeclaringClass().getName().equals("com.tencent.mobileqq.activity.ConversationTitleBtnCtrl"))); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQCleaner/OtherCleaner/HideDIYCard.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQCleaner.OtherCleaner; 2 | 3 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 4 | import cc.hicore.HookItemLoader.Annotations.UIItem; 5 | import cc.hicore.HookItemLoader.Annotations.VerController; 6 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 7 | import cc.hicore.HookItemLoader.Annotations.XPItem; 8 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 9 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 10 | import cc.hicore.HookItemLoader.bridge.UIInfo; 11 | import cc.hicore.ReflectUtils.MClass; 12 | import cc.hicore.ReflectUtils.MField; 13 | import cc.hicore.ReflectUtils.MMethod; 14 | 15 | @XPItem(name = "屏蔽DIY名片", itemType = XPItem.ITEM_Hook) 16 | public class HideDIYCard { 17 | @VerController 18 | @UIItem 19 | public UIInfo getUI() { 20 | UIInfo ui = new UIInfo(); 21 | ui.name = "屏蔽DIY名片"; 22 | ui.targetID = 2; 23 | ui.type = 1; 24 | ui.groupName = "其他净化"; 25 | return ui; 26 | } 27 | 28 | @VerController 29 | @MethodScanner 30 | public void getHookMethod(MethodContainer container) { 31 | container.addMethod("hook", MMethod.FindMethod("com.tencent.mobileqq.profilecard.processor.TempProfileBusinessProcessor", "updateCardTemplate", void.class, new Class[]{ 32 | MClass.loadClass("com.tencent.mobileqq.data.Card"), 33 | String.class, 34 | MClass.loadClass("SummaryCardTaf.SSummaryCardRsp") 35 | })); 36 | } 37 | 38 | @VerController 39 | @XPExecutor(methodID = "hook", period = XPExecutor.After) 40 | public BaseXPExecutor worker() { 41 | return param -> { 42 | MField.SetField(param.args[0], "lCurrentStyleId", (long) 0); 43 | }; 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQCleaner/QQCleanerHook/HideSignTip.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQCleaner.QQCleanerHook; 2 | 3 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 4 | import cc.hicore.HookItemLoader.Annotations.UIItem; 5 | import cc.hicore.HookItemLoader.Annotations.VerController; 6 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 7 | import cc.hicore.HookItemLoader.Annotations.XPItem; 8 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 9 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 10 | import cc.hicore.HookItemLoader.bridge.MethodFinderBuilder; 11 | import cc.hicore.HookItemLoader.bridge.QQVersion; 12 | import cc.hicore.HookItemLoader.bridge.UIInfo; 13 | import cc.hicore.ReflectUtils.MClass; 14 | import cc.hicore.ReflectUtils.MMethod; 15 | 16 | @XPItem(name = "隐藏打卡提示", itemType = XPItem.ITEM_Hook) 17 | public class HideSignTip { 18 | @VerController 19 | @UIItem 20 | public UIInfo getUI() { 21 | UIInfo ui = new UIInfo(); 22 | ui.name = "隐藏打卡提示"; 23 | ui.groupName = "聊天界面净化"; 24 | ui.type = 1; 25 | ui.targetID = 2; 26 | return ui; 27 | } 28 | 29 | @VerController(max_targetVer = QQVersion.QQ_8_9_0) 30 | @MethodScanner 31 | public void getHookMethod(MethodContainer container) { 32 | container.addMethod("hook", MMethod.FindMethod("com.tencent.mobileqq.graytip.UniteGrayTipUtil", null, MClass.loadClass("com.tencent.mobileqq.graytip.UniteEntity"), 33 | new Class[]{String.class})); 34 | } 35 | 36 | @VerController(targetVer = QQVersion.QQ_8_9_0) 37 | @MethodScanner 38 | public void getHookMethod_890(MethodContainer container) { 39 | container.addMethod(MethodFinderBuilder.newFinderByString("hook", "parseXML, illegel note: ", m -> m.getDeclaringClass().getName().startsWith("com.tencent.mobileqq.graytip"))); 40 | } 41 | 42 | @VerController 43 | @XPExecutor(methodID = "hook") 44 | public BaseXPExecutor worker() { 45 | return param -> { 46 | String paramText = String.valueOf(param.args[0]); 47 | if (paramText.contains("我也要打卡")) { 48 | param.setResult(null); 49 | } 50 | }; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQManager/ManagerImpl/Group_Change_Title.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQManager.ManagerImpl; 2 | 3 | import java.lang.reflect.Method; 4 | import java.lang.reflect.Proxy; 5 | 6 | import cc.hicore.HookItemLoader.Annotations.ApiExecutor; 7 | import cc.hicore.HookItemLoader.Annotations.VerController; 8 | import cc.hicore.HookItemLoader.Annotations.XPChecker; 9 | import cc.hicore.HookItemLoader.Annotations.XPItem; 10 | import cc.hicore.ReflectUtils.MClass; 11 | import cc.hicore.ReflectUtils.MMethod; 12 | import cc.hicore.Utils.Assert; 13 | import cc.hicore.qtool.HookEnv; 14 | 15 | @XPItem(name = "Group_Change_Title", itemType = XPItem.ITEM_Api) 16 | public class Group_Change_Title { 17 | @VerController 18 | @ApiExecutor 19 | public void change(String GroupUin, String UserUin, String title) throws Exception { 20 | Object mProxy = Proxy.newProxyInstance(HookEnv.mLoader, new Class[]{MClass.loadClass("mqq.observer.BusinessObserver")}, (proxy, method, args) -> null); 21 | MMethod.CallMethod(null, MClass.loadClass("com.tencent.biz.troop.EditUniqueTitleActivity"), null, void.class, new Class[]{ 22 | HookEnv.AppInterface.getClass(), String.class, String.class, String.class, MClass.loadClass("mqq.observer.BusinessObserver") 23 | }, 24 | HookEnv.AppInterface, GroupUin, UserUin, title, mProxy); 25 | } 26 | 27 | @VerController 28 | @XPChecker 29 | public void check() { 30 | Method m = MMethod.FindMethod(MClass.loadClass("com.tencent.biz.troop.EditUniqueTitleActivity"), null, void.class, new Class[]{ 31 | HookEnv.AppInterface.getClass(), String.class, String.class, String.class, MClass.loadClass("mqq.observer.BusinessObserver") 32 | }); 33 | Assert.notNull(m, "change title method is null"); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQManager/QQGroupManager.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQManager; 2 | 3 | import cc.hicore.HookItemLoader.core.ApiHelper; 4 | import cc.hicore.qtool.QQManager.ManagerImpl.Group_Change_Name; 5 | import cc.hicore.qtool.QQManager.ManagerImpl.Group_Change_Title; 6 | import cc.hicore.qtool.QQManager.ManagerImpl.Group_Kick; 7 | import cc.hicore.qtool.QQManager.ManagerImpl.Group_Kick_Multi; 8 | import cc.hicore.qtool.QQManager.ManagerImpl.Group_Mute; 9 | 10 | 11 | public class QQGroupManager { 12 | public static void Group_Kick(String GroupUin, String UserUin, boolean isBlack) { 13 | ApiHelper.invoke(Group_Kick.class, GroupUin, UserUin, isBlack); 14 | } 15 | 16 | public static void Group_Kick(String GroupUin, String[] UserUin, boolean isBlack) { 17 | ApiHelper.invoke(Group_Kick_Multi.class, GroupUin, UserUin, isBlack); 18 | } 19 | 20 | public static void Group_Mute(String GroupUin, String UserUin, long time) { 21 | ApiHelper.invoke(Group_Mute.class, GroupUin, UserUin, time); 22 | } 23 | 24 | public static void Group_Change_Title(String GroupUin, String UserUin, String title) { 25 | ApiHelper.invoke(Group_Change_Title.class, GroupUin, UserUin, title); 26 | } 27 | 28 | public static void Group_Change_Name(String GroupUin, String UserUin, String name) { 29 | ApiHelper.invoke(Group_Change_Name.class, GroupUin, UserUin, name); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQManager/UtilsImpl/Get_Group_Name_By_Contact.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQManager.UtilsImpl; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | import cc.hicore.HookItemLoader.Annotations.ApiExecutor; 6 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 7 | import cc.hicore.HookItemLoader.Annotations.VerController; 8 | import cc.hicore.HookItemLoader.Annotations.XPItem; 9 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 10 | import cc.hicore.HookItemLoader.bridge.MethodFinderBuilder; 11 | import cc.hicore.HookItemLoader.bridge.QQVersion; 12 | import cc.hicore.HookItemLoader.core.CoreLoader; 13 | import cc.hicore.ReflectUtils.MClass; 14 | import cc.hicore.ReflectUtils.MMethod; 15 | import cc.hicore.qtool.HookEnv; 16 | import cc.hicore.qtool.XposedInit.HostInfo; 17 | 18 | @XPItem(name = "get_Group_Name_By_Contact", itemType = XPItem.ITEM_Api) 19 | public class Get_Group_Name_By_Contact { 20 | CoreLoader.XPItemInfo info; 21 | 22 | @VerController(targetVer = QQVersion.QQ_8_9_0) 23 | @MethodScanner 24 | public void methodFinder(MethodContainer container) { 25 | container.addMethod(MethodFinderBuilder.newFinderByString("invokeMethod", "getTroopDisplayName()", m -> true)); 26 | } 27 | 28 | @VerController(max_targetVer = QQVersion.QQ_8_9_0) 29 | @ApiExecutor 30 | public String GetTroopNameByContact(String GroupUin) throws Exception { 31 | return MMethod.CallStaticMethod(MClass.loadClass("com.tencent.mobileqq.utils.ContactUtils"), 32 | HostInfo.getVerCode() > 8000 ? "W" : "a", String.class, HookEnv.AppInterface, GroupUin, true); 33 | } 34 | 35 | @VerController(targetVer = QQVersion.QQ_8_9_0) 36 | @ApiExecutor 37 | public String GetTroopNameByContact_New(String GroupUin) throws Exception { 38 | return (String) ((Method) info.scanResult.get("invokeMethod")).invoke(null, HookEnv.AppInterface, GroupUin, true); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQManager/UtilsImpl/Group_Get_Mute_List.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQManager.UtilsImpl; 2 | 3 | import java.util.ArrayList; 4 | 5 | import cc.hicore.HookItemLoader.Annotations.ApiExecutor; 6 | import cc.hicore.HookItemLoader.Annotations.VerController; 7 | import cc.hicore.HookItemLoader.Annotations.XPItem; 8 | import cc.hicore.ReflectUtils.MClass; 9 | import cc.hicore.ReflectUtils.MField; 10 | import cc.hicore.ReflectUtils.MMethod; 11 | import cc.hicore.qtool.HookEnv; 12 | import cc.hicore.qtool.QQManager.QQGroupUtils; 13 | 14 | @XPItem(name = "Group_Get_Mute_List", itemType = XPItem.ITEM_Api) 15 | public class Group_Get_Mute_List { 16 | @ApiExecutor 17 | @VerController 18 | public ArrayList get(String GroupUin) throws Exception { 19 | Object Manager = MClass.NewInstance(MClass.loadClass("com.tencent.mobileqq.troop.utils.TroopGagMgr"), new Class[]{HookEnv.AppInterface.getClass()}, HookEnv.AppInterface); 20 | ArrayList TheList; 21 | try { 22 | TheList = MMethod.CallMethod(Manager, "a", ArrayList.class, new Class[]{String.class, boolean.class}, GroupUin, true); 23 | } catch (Exception e) { 24 | TheList = MMethod.CallMethod(Manager, null, ArrayList.class, new Class[]{String.class, boolean.class}, GroupUin, true); 25 | } 26 | 27 | if (TheList != null) { 28 | ArrayList newList = new ArrayList<>(); 29 | for (Object item : TheList) { 30 | QQGroupUtils.MuteList newItem = new QQGroupUtils.MuteList(); 31 | String UserUin = MField.GetField(item, "a", String.class); 32 | long TimeStamp; 33 | try { 34 | TimeStamp = MField.GetField(item, "a", long.class); 35 | } catch (Exception e) { 36 | TimeStamp = MField.GetField(item, "b", long.class); 37 | } 38 | newItem.Uin = UserUin; 39 | newItem.delayTime = TimeStamp * 1000 - System.currentTimeMillis(); 40 | newList.add(newItem); 41 | } 42 | return newList; 43 | } 44 | return null; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQMessage/MessageBuilderImpl/Build_structMsg.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQMessage.MessageBuilderImpl; 2 | 3 | import android.util.Log; 4 | 5 | import java.lang.reflect.InvocationTargetException; 6 | import java.lang.reflect.Method; 7 | 8 | import cc.hicore.HookItemLoader.Annotations.ApiExecutor; 9 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 10 | import cc.hicore.HookItemLoader.Annotations.VerController; 11 | import cc.hicore.HookItemLoader.Annotations.XPItem; 12 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 13 | import cc.hicore.HookItemLoader.bridge.MethodFinderBuilder; 14 | import cc.hicore.HookItemLoader.bridge.QQVersion; 15 | import cc.hicore.HookItemLoader.core.CoreLoader; 16 | import cc.hicore.ReflectUtils.MClass; 17 | import cc.hicore.ReflectUtils.MMethod; 18 | import de.robv.android.xposed.XposedBridge; 19 | 20 | @XPItem(itemType = XPItem.ITEM_Api, name = "Build_StructMsg") 21 | public class Build_structMsg { 22 | CoreLoader.XPItemInfo info; 23 | 24 | @VerController(max_targetVer = QQVersion.QQ_8_9_0) 25 | @ApiExecutor 26 | public Object invoke(String xml) { 27 | try { 28 | Method BuildStructMsg = MMethod.FindMethod(MClass.loadClass("com.tencent.mobileqq.structmsg.TestStructMsg"), "a", 29 | MClass.loadClass("com.tencent.mobileqq.structmsg.AbsStructMsg"), new Class[]{String.class}); 30 | return BuildStructMsg.invoke(null, xml); 31 | } catch (Throwable th) { 32 | XposedBridge.log(Log.getStackTraceString(th)); 33 | return null; 34 | } 35 | } 36 | 37 | @MethodScanner 38 | @VerController(targetVer = QQVersion.QQ_8_9_0) 39 | public void MethodScaner(MethodContainer container) { 40 | container.addMethod(MethodFinderBuilder.newFinderByString("method", "getStructMsgFromXmlBuffByStream", m -> ((Method) m).getParameterCount() == 1)); 41 | } 42 | 43 | @VerController(targetVer = QQVersion.QQ_8_9_0) 44 | @ApiExecutor 45 | public Object invoke_8890(String xml) throws InvocationTargetException, IllegalAccessException { 46 | return ((Method) info.scanResult.get("method")).invoke(null, xml); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQMessage/MessageBuilderImpl/Builder_Pic.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQMessage.MessageBuilderImpl; 2 | 3 | import java.io.File; 4 | import java.lang.reflect.Method; 5 | import java.util.UUID; 6 | 7 | import cc.hicore.HookItemLoader.Annotations.ApiExecutor; 8 | import cc.hicore.HookItemLoader.Annotations.VerController; 9 | import cc.hicore.HookItemLoader.Annotations.XPItem; 10 | import cc.hicore.ReflectUtils.MClass; 11 | import cc.hicore.ReflectUtils.MField; 12 | import cc.hicore.ReflectUtils.MMethod; 13 | import cc.hicore.Utils.DataUtils; 14 | import cc.hicore.qtool.HookEnv; 15 | 16 | @XPItem(name = "Builder_Pic", itemType = XPItem.ITEM_Api) 17 | public class Builder_Pic { 18 | @VerController 19 | @ApiExecutor 20 | public Object onBuild(Object _Session, String PicPath) throws Exception { 21 | Method CallMethod = MMethod.FindMethod("com.tencent.mobileqq.activity.ChatActivityFacade", null, MClass.loadClass("com.tencent.mobileqq.data.ChatMessage"), new Class[]{ 22 | MClass.loadClass("com.tencent.mobileqq.app.QQAppInterface"), 23 | MClass.loadClass("com.tencent.mobileqq.activity.aio.SessionInfo"), 24 | String.class 25 | }); 26 | Object PICMsg = CallMethod.invoke(null, 27 | HookEnv.AppInterface, _Session, PicPath 28 | ); 29 | MField.SetField(PICMsg, "md5", DataUtils.getFileMD5(new File(PicPath))); 30 | MField.SetField(PICMsg, "uuid", DataUtils.getFileMD5(new File(PicPath)) + ".jpg"); 31 | MField.SetField(PICMsg, "localUUID", UUID.randomUUID().toString()); 32 | MMethod.CallMethodNoParam(PICMsg, "prewrite", void.class); 33 | return PICMsg; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQMessage/MessageBuilderImpl/Common_Rebuild_Msg.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQMessage.MessageBuilderImpl; 2 | 3 | import cc.hicore.HookItemLoader.Annotations.ApiExecutor; 4 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 5 | import cc.hicore.HookItemLoader.Annotations.VerController; 6 | import cc.hicore.HookItemLoader.Annotations.XPItem; 7 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 8 | import cc.hicore.HookItemLoader.bridge.MethodFinderBuilder; 9 | import cc.hicore.HookItemLoader.bridge.QQVersion; 10 | import cc.hicore.HookItemLoader.core.CoreLoader; 11 | import cc.hicore.ReflectUtils.MClass; 12 | import cc.hicore.ReflectUtils.MMethod; 13 | 14 | @XPItem(name = "Common_Rebuild_Msg", itemType = XPItem.ITEM_Api) 15 | public class Common_Rebuild_Msg { 16 | CoreLoader.XPItemInfo info; 17 | 18 | @VerController(targetVer = QQVersion.QQ_8_9_0) 19 | @MethodScanner 20 | public void getMethod(MethodContainer container) { 21 | container.addMethod(MethodFinderBuilder.newFinderByString("method", " MessageForWantGiftMsg.GIFT_SENDER_UIN ", m -> true)); 22 | } 23 | 24 | @VerController(max_targetVer = QQVersion.QQ_8_9_0) 25 | @ApiExecutor 26 | public Object build(Object record) throws Exception { 27 | return MMethod.CallStaticMethod(MClass.loadClass("com.tencent.mobileqq.service.message.MessageRecordFactory"), null, MClass.loadClass("com.tencent.mobileqq.data.MessageRecord"), record); 28 | } 29 | 30 | @VerController(targetVer = QQVersion.QQ_8_9_0) 31 | @ApiExecutor 32 | public Object build_890(Object record) throws Exception { 33 | return MMethod.CallStaticMethod(info.scanResult.get("method").getDeclaringClass(), null, MClass.loadClass("com.tencent.mobileqq.data.MessageRecord"), record); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQMessage/MessageImpl/MsgApi_AddAndSendMsg.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQMessage.MessageImpl; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | import cc.hicore.HookItemLoader.Annotations.ApiExecutor; 6 | import cc.hicore.HookItemLoader.Annotations.VerController; 7 | import cc.hicore.HookItemLoader.Annotations.XPItem; 8 | import cc.hicore.ReflectUtils.MClass; 9 | import cc.hicore.ReflectUtils.MMethod; 10 | import cc.hicore.qtool.QQManager.QQEnvUtils; 11 | 12 | @XPItem(itemType = XPItem.ITEM_Api, name = "MsgApi_AddAndSendMsg") 13 | public class MsgApi_AddAndSendMsg { 14 | @VerController 15 | @ApiExecutor 16 | public void onInvoke(Object MessageRecord) throws Exception { 17 | Object MessageFacade = MMethod.CallMethodNoParam(QQEnvUtils.getAppRuntime(), "getMessageFacade", 18 | MClass.loadClass("com.tencent.imcore.message.QQMessageFacade")); 19 | Method mMethod = MMethod.FindMethod("com.tencent.imcore.message.BaseQQMessageFacade", null, void.class, new Class[]{ 20 | MClass.loadClass("com.tencent.mobileqq.data.MessageRecord"), 21 | MClass.loadClass("com.tencent.mobileqq.app.BusinessObserver"), boolean.class 22 | }); 23 | mMethod.invoke(MessageFacade, MessageRecord, null, false); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQMessage/MessageImpl/MsgApi_AddMsg.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQMessage.MessageImpl; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | import cc.hicore.HookItemLoader.Annotations.ApiExecutor; 6 | import cc.hicore.HookItemLoader.Annotations.VerController; 7 | import cc.hicore.HookItemLoader.Annotations.XPItem; 8 | import cc.hicore.ReflectUtils.MClass; 9 | import cc.hicore.ReflectUtils.MMethod; 10 | import cc.hicore.qtool.QQManager.QQEnvUtils; 11 | 12 | @XPItem(name = "MsgApi_AddMsg", itemType = XPItem.ITEM_Api) 13 | public class MsgApi_AddMsg { 14 | @VerController 15 | @ApiExecutor 16 | public void onInvoke(Object msg) throws Exception { 17 | Method InvokeMethod = MMethod.FindMethod("com.tencent.imcore.message.BaseQQMessageFacade", null, void.class, new Class[]{ 18 | MClass.loadClass("com.tencent.mobileqq.data.MessageRecord"), 19 | String.class, boolean.class, boolean.class, boolean.class, boolean.class 20 | }); 21 | Object MessageFacade = MMethod.CallMethodNoParam(QQEnvUtils.getAppRuntime(), "getMessageFacade", 22 | MClass.loadClass("com.tencent.imcore.message.QQMessageFacade")); 23 | InvokeMethod.invoke(MessageFacade, msg, QQEnvUtils.getCurrentUin(), false, false, false, true); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQMessage/MessageImpl/MsgApi_sentAntEmo.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQMessage.MessageImpl; 2 | 3 | 4 | import java.lang.reflect.InvocationTargetException; 5 | import java.lang.reflect.Method; 6 | 7 | import cc.hicore.HookItemLoader.Annotations.ApiExecutor; 8 | import cc.hicore.HookItemLoader.Annotations.VerController; 9 | import cc.hicore.HookItemLoader.Annotations.XPItem; 10 | import cc.hicore.HookItemLoader.bridge.QQVersion; 11 | import cc.hicore.ReflectUtils.Classes; 12 | import cc.hicore.ReflectUtils.MClass; 13 | import cc.hicore.ReflectUtils.MMethod; 14 | 15 | @XPItem(name = "MsgApi_sentAntEmo", itemType = XPItem.ITEM_Api) 16 | public class MsgApi_sentAntEmo { 17 | @VerController(max_targetVer = QQVersion.QQ_8_9_0) 18 | @ApiExecutor 19 | public void send_8820(Object _Session, int ID) throws InvocationTargetException, IllegalAccessException { 20 | Method m = MMethod.FindMethod("com.tencent.mobileqq.emoticonview.AniStickerSendMessageCallBack", "sendAniSticker", 21 | boolean.class, new Class[]{int.class, Classes.BaseSessionInfo(), int.class} 22 | ); 23 | m.invoke(null, ID, _Session, 0); 24 | } 25 | 26 | @VerController(targetVer = QQVersion.QQ_8_9_0) 27 | @ApiExecutor 28 | public void send_890(Object _Session, int ID) throws InvocationTargetException, IllegalAccessException { 29 | Method m = MMethod.FindMethodByName(MClass.loadClass("com.tencent.mobileqq.emoticonview.AniStickerSendMessageCallBack"), "sendAniSticker"); 30 | m.invoke(null, ID, _Session, 0); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/QQTools/QQHighTipHelper.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.QQTools; 2 | 3 | import android.os.Bundle; 4 | 5 | import cc.hicore.ReflectUtils.MField; 6 | import cc.hicore.ReflectUtils.MMethod; 7 | import cc.hicore.qtool.QQMessage.QQMessageUtils; 8 | import cc.hicore.qtool.QQMessage.QQMsgBuilder; 9 | 10 | public class QQHighTipHelper { 11 | public static void AddHighLightTip(String GroupUin, String Items, HighLightItem[] ItemsClick) { 12 | try { 13 | Object ItemObject = QQMsgBuilder.Build_RawMessageRecord_Troop(GroupUin, -2030); 14 | MField.SetField(ItemObject, "msg", Items); 15 | for (HighLightItem item : ItemsClick) { 16 | Bundle b = new Bundle(); 17 | b.putInt("key_action", 5); 18 | b.putString("troop_mem_uin", item.Uin); 19 | b.putBoolean("need_update_nick", true); 20 | MMethod.CallMethod(ItemObject, "addHightlightItem", void.class, new Class[]{ 21 | int.class, int.class, Bundle.class 22 | }, item.Start, item.End, b); 23 | } 24 | MField.SetField(ItemObject, "isread", true); 25 | QQMessageUtils.AddMsg(ItemObject); 26 | } catch (Exception e) { 27 | } 28 | } 29 | 30 | public static class HighLightItem { 31 | public int Start; 32 | public int End; 33 | public String Uin; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/ServerKiller/KillRMonitor.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.ServerKiller; 2 | 3 | import cc.hicore.HookItemLoader.Annotations.CommonExecutor; 4 | import cc.hicore.HookItemLoader.Annotations.VerController; 5 | import cc.hicore.HookItemLoader.Annotations.XPItem; 6 | import cc.hicore.HookItemLoader.bridge.QQVersion; 7 | import cc.hicore.qtool.HookEnv; 8 | import de.robv.android.xposed.XC_MethodHook; 9 | import de.robv.android.xposed.XposedHelpers; 10 | 11 | @XPItem(name = "KillRMonitor", itemType = XPItem.ITEM_Api, max_targetVer = QQVersion.QQ_8_9_5, targetVer = QQVersion.QQ_8_9_5) 12 | public class KillRMonitor { 13 | @VerController 14 | @CommonExecutor 15 | public void doWork() { 16 | XposedHelpers.findAndHookMethod("com.tencent.rmonitor.Magnifier$1", HookEnv.mLoader, "run", new XC_MethodHook() { 17 | @Override 18 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 19 | super.beforeHookedMethod(param); 20 | param.setResult(null); 21 | } 22 | }); 23 | 24 | XposedHelpers.findAndHookMethod("com.tencent.rmonitor.metrics.UVEventMonitor$1", HookEnv.mLoader, "run", new XC_MethodHook() { 25 | @Override 26 | protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable { 27 | super.beforeHookedMethod(param); 28 | param.setResult(null); 29 | } 30 | }); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/ServerKiller/ToggleKiller.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.ServerKiller; 2 | 3 | import android.os.Message; 4 | 5 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 6 | import cc.hicore.HookItemLoader.Annotations.UIItem; 7 | import cc.hicore.HookItemLoader.Annotations.VerController; 8 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 9 | import cc.hicore.HookItemLoader.Annotations.XPItem; 10 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 11 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 12 | import cc.hicore.HookItemLoader.bridge.QQVersion; 13 | import cc.hicore.HookItemLoader.bridge.UIInfo; 14 | import cc.hicore.ReflectUtils.MClass; 15 | import cc.hicore.ReflectUtils.MMethod; 16 | 17 | @XPItem(name = "禁用Toggle", itemType = XPItem.ITEM_Hook, proc = XPItem.PROC_ALL, targetVer = QQVersion.QQ_8_8_88, max_targetVer = QQVersion.QQ_8_9_0) 18 | public class ToggleKiller { 19 | @VerController 20 | @UIItem 21 | public UIInfo getUI() { 22 | UIInfo ui = new UIInfo(); 23 | ui.name = "禁用Toggle"; 24 | ui.groupName = "服务调节"; 25 | ui.targetID = 4; 26 | ui.type = 1; 27 | return ui; 28 | } 29 | 30 | @VerController 31 | @MethodScanner 32 | public void getHookMethod(MethodContainer container) { 33 | container.addMethod("hook", MMethod.FindMethod(MClass.loadClass("com.tencent.ft.op.ToggleDispatcher$11"), "handleMessage", void.class, new Class[]{ 34 | Message.class 35 | })); 36 | } 37 | 38 | @VerController 39 | @XPExecutor(methodID = "hook") 40 | public BaseXPExecutor worker() { 41 | return param -> param.setResult(null); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/StickerPanelPlus/MainPanelAdapter.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.StickerPanelPlus; 2 | 3 | import android.view.View; 4 | import android.view.ViewGroup; 5 | import android.widget.BaseAdapter; 6 | 7 | import java.util.ArrayList; 8 | 9 | public class MainPanelAdapter extends BaseAdapter { 10 | ArrayList viewData = new ArrayList<>(); 11 | volatile long timeStart; 12 | 13 | @Override 14 | public int getCount() { 15 | return viewData.size(); 16 | } 17 | 18 | public int addItemData(IMainPanelItem item) { 19 | viewData.add(item); 20 | return viewData.size() - 1; 21 | } 22 | 23 | @Override 24 | public Object getItem(int position) { 25 | return viewData.get(position); 26 | } 27 | 28 | @Override 29 | public long getItemId(int position) { 30 | return viewData.get(position).getID(); 31 | } 32 | 33 | @Override 34 | public View getView(int position, View convertView, ViewGroup parent) { 35 | if (convertView != null) { 36 | Object tag = convertView.getTag(); 37 | if (tag instanceof IMainPanelItem) { 38 | IMainPanelItem item = (IMainPanelItem) tag; 39 | item.onViewDestroy(parent); 40 | } 41 | } 42 | View retView = viewData.get(position).getView(parent); 43 | retView.setTag(getItem(position)); 44 | return retView; 45 | } 46 | 47 | public void destroyAllViews() { 48 | for (IMainPanelItem item : viewData) { 49 | item.onViewDestroy(null); 50 | } 51 | } 52 | 53 | public void notifyViewUpdate(int first, int last) { 54 | if (System.currentTimeMillis() - timeStart > 150) { 55 | timeStart = System.currentTimeMillis(); 56 | for (int i = first; i < last + 1; i++) { 57 | IMainPanelItem item = viewData.get(i); 58 | item.notifyViewUpdate0(); 59 | } 60 | } 61 | 62 | } 63 | 64 | public interface IMainPanelItem { 65 | View getView(ViewGroup parent); 66 | 67 | void onViewDestroy(ViewGroup parent); 68 | 69 | long getID(); 70 | 71 | void notifyViewUpdate0(); 72 | } 73 | 74 | } 75 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/VoiceHelper/Panel/FloatButton.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.VoiceHelper.Panel; 2 | 3 | public class FloatButton { 4 | public static void Create() { 5 | 6 | } 7 | 8 | public static void Hide() { 9 | 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/VoiceHelper/Panel/VoiceProvider.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.VoiceHelper.Panel; 2 | 3 | import java.util.ArrayList; 4 | 5 | import cc.hicore.qtool.HookEnv; 6 | 7 | public class VoiceProvider { 8 | public static final String PROVIDER_LOCAL_FILE = "LocalFile::"; 9 | public static final String PROVIDER_LOCAL_SEARCH = " LOCAL_SEARCH::"; 10 | private String Path; 11 | 12 | private VoiceProvider() { 13 | 14 | } 15 | 16 | public static VoiceProvider getNewInstance(String Path) { 17 | VoiceProvider provider = new VoiceProvider(); 18 | provider.Path = Path; 19 | return provider; 20 | } 21 | 22 | public VoiceProvider getParent() { 23 | if (!Path.contains("/")) return this; 24 | return getNewInstance(Path.substring(0, Path.lastIndexOf("/"))); 25 | } 26 | 27 | public VoiceProvider getChild(String Name) { 28 | return getNewInstance(Path + "/" + Name); 29 | } 30 | 31 | public String getPath() { 32 | return Path; 33 | } 34 | 35 | public ArrayList getList() { 36 | if (Path.startsWith(PROVIDER_LOCAL_FILE)) { 37 | String truePath = HookEnv.ExtraDataPath + "Voice/" + Path.substring(PROVIDER_LOCAL_FILE.length()); 38 | return LocalVoiceSearchHelper.searchForPath(truePath, Path.length() == PROVIDER_LOCAL_FILE.length()); 39 | } else if (Path.startsWith(PROVIDER_LOCAL_SEARCH)) { 40 | String searchName = Path.substring(PROVIDER_LOCAL_SEARCH.length()); 41 | return LocalVoiceSearchHelper.searchForName(HookEnv.ExtraDataPath + "Voice/", searchName); 42 | } 43 | return new ArrayList<>(); 44 | } 45 | 46 | public static class FileInfo { 47 | public String Name; 48 | public int type; 49 | public String Path; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/XPWork/LittleHook/SavedToXml.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.XPWork.LittleHook; 2 | 3 | import cc.hicore.HookItemLoader.Annotations.CommonExecutor; 4 | import cc.hicore.HookItemLoader.Annotations.VerController; 5 | import cc.hicore.HookItemLoader.Annotations.XPItem; 6 | import cc.hicore.ReflectUtils.Classes; 7 | import cc.hicore.ReflectUtils.MClass; 8 | import cc.hicore.ReflectUtils.MMethod; 9 | import de.robv.android.xposed.XC_MethodHook; 10 | import de.robv.android.xposed.XposedHelpers; 11 | 12 | @XPItem(name = "XP_Save", itemType = XPItem.ITEM_Hook) 13 | public class SavedToXml { 14 | @VerController 15 | @CommonExecutor 16 | public void execute() { 17 | XposedHelpers.findAndHookMethod(MClass.loadClass("com.tencent.mobileqq.data.MessageForStarLeague"), "decodeMsgFromXmlBuff", Classes.QQAppinterFace(), int.class, long.class, byte[].class, int.class, new XC_MethodHook() { 18 | @Override 19 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 20 | byte[] arr = MMethod.CallMethod(null, MClass.loadClass("com.tencent.mobileqq.structmsg.StructMsgUtils"), "a", 21 | byte[].class, new Class[]{byte[].class, int.class}, param.args[3], -1); 22 | MMethod.CallMethodParams(param.getResult(), "saveExtInfoToExtStr", void.class, "SavedXml", new String(arr)); 23 | } 24 | }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/XPWork/LittleHook/UnlockWebLock.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.XPWork.LittleHook; 2 | 3 | import java.net.URLDecoder; 4 | 5 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 6 | import cc.hicore.HookItemLoader.Annotations.UIItem; 7 | import cc.hicore.HookItemLoader.Annotations.VerController; 8 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 9 | import cc.hicore.HookItemLoader.Annotations.XPItem; 10 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 11 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 12 | import cc.hicore.HookItemLoader.bridge.UIInfo; 13 | import cc.hicore.ReflectUtils.MClass; 14 | import cc.hicore.ReflectUtils.MMethod; 15 | 16 | @XPItem(name = "解除风险网址拦截", itemType = XPItem.ITEM_Hook, proc = XPItem.PROC_ALL) 17 | public class UnlockWebLock { 18 | private static String GetStringMiddle(String str, String before, String after) { 19 | int index1 = str.indexOf(before); 20 | if (index1 == -1) return null; 21 | int index2 = str.indexOf(after, index1 + before.length()); 22 | if (index2 == -1) return null; 23 | return str.substring(index1 + before.length(), index2); 24 | } 25 | 26 | @VerController 27 | @UIItem 28 | public UIInfo getUI() { 29 | UIInfo ui = new UIInfo(); 30 | ui.name = "解除风险网址拦截"; 31 | ui.groupName = "功能辅助"; 32 | ui.targetID = 1; 33 | ui.type = 1; 34 | return ui; 35 | } 36 | 37 | @VerController 38 | @MethodScanner 39 | public void getHookMethod(MethodContainer container) { 40 | container.addMethod("hook", MMethod.FindMethod(MClass.loadClass("com.tencent.smtt.sdk.WebView"), "loadUrl", void.class, new Class[]{ 41 | String.class 42 | })); 43 | } 44 | 45 | @VerController 46 | @XPExecutor(methodID = "hook") 47 | public BaseXPExecutor worker() { 48 | return param -> { 49 | String loadUrl = (String) param.args[0]; 50 | if (loadUrl.startsWith("https://c.pc.qq.com/middlem.html?") || loadUrl.startsWith("https://c.pc.qq.com/index.html?")) { 51 | String RedictUrl = GetStringMiddle(loadUrl, "url=", "&"); 52 | if (RedictUrl != null) { 53 | String SourceUrl = URLDecoder.decode(RedictUrl); 54 | param.args[0] = SourceUrl; 55 | } 56 | } 57 | }; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/XPWork/LittleHook/VipStatusFucker.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.XPWork.LittleHook; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 6 | import cc.hicore.HookItemLoader.Annotations.UIItem; 7 | import cc.hicore.HookItemLoader.Annotations.VerController; 8 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 9 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 10 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 11 | import cc.hicore.HookItemLoader.bridge.MethodFinderBuilder; 12 | import cc.hicore.HookItemLoader.bridge.UIInfo; 13 | import de.robv.android.xposed.XposedBridge; 14 | 15 | //@XPItem(itemType = XPItem.ITEM_Hook, name = "VipStatusFucker") 16 | public class VipStatusFucker { 17 | @UIItem 18 | @VerController 19 | public UIInfo UIInit() { 20 | UIInfo info = new UIInfo(); 21 | info.name = "伪装VIP状态"; 22 | info.desc = "可用来免VIP贴图"; 23 | info.targetID = 3; 24 | info.type = 1; 25 | return info; 26 | } 27 | 28 | @MethodScanner 29 | @VerController 30 | public void MethodFiner(MethodContainer container) { 31 | container.addMethod(MethodFinderBuilder.newFinderByString("hook", "getPrivilegeFlags Friends is null", member -> ((Method) member).getParameterCount() == 1)); 32 | } 33 | 34 | @VerController 35 | @XPExecutor(methodID = "hook") 36 | public BaseXPExecutor hookWorker() { 37 | return param -> { 38 | String uin = (String) param.args[0]; 39 | if (uin == null) { 40 | int i = (int) XposedBridge.invokeOriginalMethod(param.method, param.thisObject, param.args); 41 | param.setResult(i | 2 | 4 | 8); 42 | } 43 | }; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/XPWork/QQProxy/AddMsgProxy.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.XPWork.QQProxy; 2 | 3 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 4 | import cc.hicore.HookItemLoader.Annotations.VerController; 5 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 6 | import cc.hicore.HookItemLoader.Annotations.XPItem; 7 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 8 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 9 | import cc.hicore.ReflectUtils.MClass; 10 | import cc.hicore.ReflectUtils.MMethod; 11 | import cc.hicore.qtool.JavaPlugin.Controller.PluginController; 12 | 13 | /* 14 | Hook For AddAndSendMessage 15 | 在发送 文本,回复时会调用 16 | */ 17 | @XPItem(name = "Proxy_AddMsg", itemType = XPItem.ITEM_Hook) 18 | public class AddMsgProxy { 19 | @VerController 20 | @MethodScanner 21 | public void getHookMethod(MethodContainer container) { 22 | container.addMethod("hook", MMethod.FindMethod("com.tencent.imcore.message.BaseQQMessageFacade", "a", void.class, new Class[]{ 23 | MClass.loadClass("com.tencent.mobileqq.data.MessageRecord"), 24 | MClass.loadClass("com.tencent.mobileqq.app.BusinessObserver") 25 | })); 26 | } 27 | 28 | @VerController 29 | @XPExecutor(methodID = "hook") 30 | public BaseXPExecutor worker() { 31 | return param -> { 32 | Object chatMsg = param.args[0]; 33 | PluginController.WaitForgetMsgInvoke(chatMsg); 34 | }; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/XPWork/QQProxy/BaseChatPie.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.XPWork.QQProxy; 2 | 3 | import cc.hicore.HookItemLoader.Annotations.MethodScanner; 4 | import cc.hicore.HookItemLoader.Annotations.VerController; 5 | import cc.hicore.HookItemLoader.Annotations.XPExecutor; 6 | import cc.hicore.HookItemLoader.Annotations.XPItem; 7 | import cc.hicore.HookItemLoader.bridge.BaseXPExecutor; 8 | import cc.hicore.HookItemLoader.bridge.MethodContainer; 9 | import cc.hicore.HookItemLoader.bridge.QQVersion; 10 | import cc.hicore.ReflectUtils.Finders; 11 | import cc.hicore.ReflectUtils.MClass; 12 | import cc.hicore.ReflectUtils.MField; 13 | import cc.hicore.qtool.HookEnv; 14 | 15 | @XPItem(name = "BaseChatPie_Init", itemType = XPItem.ITEM_Hook) 16 | public class BaseChatPie { 17 | public static Object cacheChatPie; 18 | 19 | public static Object getNewSessionInfo() { 20 | try { 21 | return MField.GetFirstField(cacheChatPie, MClass.loadClass("com.tencent.mobileqq.activity.aio.SessionInfo")); 22 | } catch (Exception e) { 23 | e.printStackTrace(); 24 | return null; 25 | } 26 | } 27 | 28 | @VerController 29 | @XPExecutor(methodID = "basechatpie_init", period = XPExecutor.After) 30 | public BaseXPExecutor worker() { 31 | return param -> { 32 | cacheChatPie = param.thisObject; 33 | HookEnv.AppInterface = MField.GetFirstField(cacheChatPie, MClass.loadClass("com.tencent.mobileqq.app.QQAppInterface")); 34 | HookEnv.SessionInfo = MField.GetFirstField(cacheChatPie, MClass.loadClass("com.tencent.mobileqq.activity.aio.SessionInfo")); 35 | HookEnv.isCurrentGuild = false; 36 | }; 37 | } 38 | 39 | @MethodScanner 40 | @VerController(targetVer = QQVersion.QQ_8_8_93) 41 | public void getBaseChatPieInit(MethodContainer container) { 42 | Finders.BaseChatPieInit_8893(container); 43 | } 44 | 45 | @MethodScanner 46 | @VerController(max_targetVer = QQVersion.QQ_8_8_93) 47 | public void getBaseChatPieOld(MethodContainer container) { 48 | Finders.BaseChatPieInit(container); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/XPWork/QQUIUtils/FormItemUtils.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.XPWork.QQUIUtils; 2 | 3 | import android.content.Context; 4 | import android.view.View; 5 | 6 | import cc.hicore.LogUtils.LogUtils; 7 | import cc.hicore.ReflectUtils.MClass; 8 | import cc.hicore.ReflectUtils.MMethod; 9 | 10 | public class FormItemUtils { 11 | private static final String TAG = "FormItemUtils"; 12 | 13 | public static View createSingleItem(Context context, String title, View.OnClickListener listener) { 14 | try { 15 | View NewItem = MClass.NewInstance(MClass.loadClass("com.tencent.mobileqq.widget.FormSimpleItem"), context); 16 | MMethod.CallMethodSingle(NewItem, "setLeftText", void.class, title); 17 | NewItem.setOnClickListener(listener); 18 | return NewItem; 19 | } catch (Exception e) { 20 | LogUtils.error(TAG, e); 21 | return null; 22 | } 23 | } 24 | 25 | public static View createMultiItem(Context context, String title, String rightLine, View.OnClickListener listener) { 26 | try { 27 | View NewItem = MClass.NewInstance(MClass.loadClass("com.tencent.mobileqq.widget.FormSimpleItem"), context); 28 | MMethod.CallMethodSingle(NewItem, "setLeftText", void.class, title); 29 | MMethod.CallMethodSingle(NewItem, "setRightText", void.class, rightLine); 30 | NewItem.setOnClickListener(listener); 31 | return NewItem; 32 | } catch (Exception e) { 33 | LogUtils.error(TAG, e); 34 | return null; 35 | } 36 | } 37 | public static View createMultiItem_Appent(Context context, CharSequence title, String rightLine, View.OnClickListener listener) { 38 | try { 39 | View NewItem = MClass.NewInstance(MClass.loadClass("com.tencent.mobileqq.widget.FormSimpleItem"), context); 40 | MMethod.CallMethodSingle(NewItem, "setLeftText", void.class, title); 41 | MMethod.CallMethodSingle(NewItem, "setRightText", void.class, rightLine); 42 | NewItem.setOnClickListener(listener); 43 | return NewItem; 44 | } catch (Exception e) { 45 | LogUtils.error(TAG, e); 46 | return null; 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/XposedInit/CheckWrongVersion.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.XposedInit; 2 | 3 | import android.app.AlertDialog; 4 | import android.content.Context; 5 | 6 | public class CheckWrongVersion { 7 | public static void ShowToast1(Context context) { 8 | new AlertDialog.Builder(context, 3) 9 | .setTitle("提示") 10 | .setMessage("由于作者精力有限,QTool将在QQ8.8.35以下版本中禁用,请升级QQ后使用,如果私自修改了QQ版本号请修改回正确版本,如果有需要请使用旧版本模块") 11 | .setNegativeButton("确定", (dialog, which) -> { 12 | 13 | }).show(); 14 | } 15 | 16 | public static void ShowWrongVersionDialog(Context context) { 17 | new AlertDialog.Builder(context, 3) 18 | .setTitle("提示") 19 | .setMessage("当前QQ版本号存在异常,请不要私自修改QQ版本号,以避免适配错误") 20 | .setNegativeButton("确定", (dialog, which) -> { 21 | 22 | }).show(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /QTool/src/main/java/cc/hicore/qtool/XposedInit/HostInfo.java: -------------------------------------------------------------------------------- 1 | package cc.hicore.qtool.XposedInit; 2 | 3 | import android.content.pm.ApplicationInfo; 4 | import android.content.pm.PackageInfo; 5 | import android.content.pm.PackageManager; 6 | 7 | import cc.hicore.LogUtils.LogUtils; 8 | import cc.hicore.qtool.HookEnv; 9 | 10 | //获取QQ的版本号信息 11 | public class HostInfo { 12 | private static final String TAG = "HostInfo"; 13 | private static String Version; 14 | private static int Version_Code; 15 | 16 | protected static void Init() { 17 | try { 18 | //获取普通apk版本信息 19 | PackageManager pm = HookEnv.AppContext.getPackageManager(); 20 | PackageInfo mSelfInfo = pm.getPackageInfo("com.tencent.mobileqq", 0); 21 | String Version_1 = mSelfInfo.versionName; 22 | 23 | //获取QQ小版本信息 24 | ApplicationInfo sAppInfo = pm.getApplicationInfo("com.tencent.mobileqq", PackageManager.GET_META_DATA); 25 | String UUID = sAppInfo.metaData.getString("com.tencent.rdm.uuid"); 26 | 27 | Version = Version_1; 28 | Version_Code = Integer.parseInt(UUID.substring(0, UUID.indexOf("_"))); 29 | } catch (Throwable e) { 30 | LogUtils.fetal_error(TAG, e); 31 | } 32 | } 33 | 34 | public static int getVerCode() { 35 | return Version_Code; 36 | } 37 | 38 | public static String getVersion() { 39 | return Version; 40 | } 41 | 42 | public static boolean checkIsGrayQQ(){ 43 | try { 44 | PackageManager pm = HookEnv.AppContext.getPackageManager(); 45 | ApplicationInfo sAppInfo = pm.getApplicationInfo("com.tencent.mobileqq", PackageManager.GET_META_DATA); 46 | String Settings = sAppInfo.metaData.getString("AppSetting_params"); 47 | if (Settings.contains("#Gray"))return true; 48 | }catch (Exception ignored) {} 49 | return false; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /QTool/src/main/java/com/tencent/rmonitor/looper/LooperProxy.java: -------------------------------------------------------------------------------- 1 | package com.tencent.rmonitor.looper; 2 | 3 | import android.os.Handler; 4 | import android.os.Looper; 5 | 6 | import cc.hicore.qtool.CrashHandler.CatchInstance; 7 | 8 | public class LooperProxy implements Runnable{ 9 | public static void Proxy(){ 10 | new Handler(Looper.getMainLooper()) 11 | .post(new LooperProxy()); 12 | } 13 | 14 | @Override 15 | public void run() { 16 | while (true){ 17 | try { 18 | Looper.loop(); 19 | break; 20 | }catch (Throwable e){ 21 | CatchInstance.ICatchEx(Thread.currentThread(),e); 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /QTool/src/main/res/anim/anim_fade_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /QTool/src/main/res/anim/anim_fade_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /QTool/src/main/res/color/selector_text_press_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/add_group.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/add_group.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/alarm.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/alarm.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/append_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/append_icon.png -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/bg_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/btnclick.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/cat.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/cat.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/check.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/check.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/convert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/convert.png -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/debug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/debug.png -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/delete.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/delete.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/dl_from_tg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/dl_from_tg.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/enjoy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/enjoy.png -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/folder.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/folder.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/github.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/github.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/huaji.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/huaji.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/icon.png -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/info.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/info.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/input.png -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/itemback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/loading.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/loading.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/main_cleaner.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/main_cleaner.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/main_down.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/main_down.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/main_helper.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/main_helper.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/menu_icon_plugin.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/menu_icon_plugin.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/menu_item_base.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/menu_item_base2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/menu_item_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/micon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/micon.png -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/no_content.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/no_content.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/plugin_btn.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/plugin_btn.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/plugin_load.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/plugin_load.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/plugin_stop.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/plugin_stop.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/q.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/q.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/repeat.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/repeat.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/revoke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/revoke.png -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/send.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/send.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/share.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/share.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/sticker_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/sticker_like.png -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/sticker_pack_set_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/sticker_pack_set_icon.png -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/sticker_recent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/sticker_recent.png -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/tester.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/tester.png -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/text_item_press.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/textlines.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/tool.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/tool.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/top_sticker_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/top_sticker_add.png -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/voice_down.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/voice_down.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/voice_file.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/voice_file.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/voice_item.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/voice_item.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/voice_panel.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/voice_panel.webp -------------------------------------------------------------------------------- /QTool/src/main/res/drawable/voice_upload.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hicores/QTool/840188b6a7e2fbd2cd4941e5c9a562f3c94f550f/QTool/src/main/res/drawable/voice_upload.webp -------------------------------------------------------------------------------- /QTool/src/main/res/layout/activity_opensource.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 20 | 21 | 25 | 26 | 27 | 32 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /QTool/src/main/res/layout/activity_update.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /QTool/src/main/res/layout/adapter_zhihu_comment.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 23 | 24 | 34 | 35 |