├── iMemScan ├── en-IN.lproj │ ├── Main.strings │ └── LaunchScreen.strings ├── en.lproj │ ├── LaunchScreen.strings │ ├── InfoPlist.strings │ └── Localizable.strings ├── zh-Hans.lproj │ ├── Main.strings │ ├── LaunchScreen.strings │ └── Localizable.strings ├── Assets.xcassets │ ├── Contents.json │ ├── auto.imageset │ │ ├── auto@2x.png │ │ ├── auto@3x.png │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── lcon-1024.png │ │ ├── AppIcon-iPad-20.png │ │ ├── AppIcon-iPad-29.png │ │ ├── AppIcon-iPad-40.png │ │ ├── AppIcon-iPad-76.png │ │ ├── AppIcon-iPad-20@2x.png │ │ ├── AppIcon-iPad-29@2x.png │ │ ├── AppIcon-iPad-40@2x.png │ │ ├── AppIcon-iPad-76@2x.png │ │ ├── AppIcon-iPad-20@2x-1.png │ │ ├── AppIcon-iPad-83.5@2x.png │ │ ├── AppIcon-iPhone-20@3x.png │ │ ├── AppIcon-iPhone-29@2x.png │ │ ├── AppIcon-iPhone-29@3x.png │ │ ├── AppIcon-iPhone-40@2x.png │ │ ├── AppIcon-iPhone-40@3x.png │ │ ├── AppIcon-iPhone-60@2x.png │ │ └── AppIcon-iPhone-60@3x.png │ ├── sun-dark.imageset │ │ ├── sun-dark@2x.png │ │ ├── sun-dark@3x.png │ │ └── Contents.json │ ├── moon-light.imageset │ │ ├── moon-light@2x.png │ │ ├── moon-light@3x.png │ │ └── Contents.json │ ├── color_4.colorset │ │ └── Contents.json │ ├── color_3.colorset │ │ └── Contents.json │ ├── color_2.colorset │ │ └── Contents.json │ └── color_1.colorset │ │ └── Contents.json ├── Tool │ ├── LocalFiles │ │ └── music.m4a │ ├── Jailbreak │ │ ├── Root │ │ │ ├── Root.h │ │ │ └── Root.m │ │ ├── Sh │ │ │ ├── RunCmdModel.swift │ │ │ ├── CommandLine.swift │ │ │ ├── Actions.swift │ │ │ └── NSTask.h │ │ ├── Pid │ │ │ └── PidModel.h │ │ ├── iMemScan.entitlements │ │ └── NSTask.h │ ├── VMem │ │ ├── SetModel.h │ │ ├── SetModel.m │ │ ├── MemModel.h │ │ ├── VMTypeHeader.h │ │ └── VMTool.h │ └── Device │ │ └── UIDevice+Helper.swift ├── Lib │ ├── MJRefresh │ │ ├── MJRefresh.bundle │ │ │ ├── arrow@2x.png │ │ │ ├── trail_arrow@2x.png │ │ │ ├── en.lproj │ │ │ │ └── Localizable.strings │ │ │ ├── ru.lproj │ │ │ │ └── Localizable.strings │ │ │ ├── uk.lproj │ │ │ │ └── Localizable.strings │ │ │ ├── zh-Hans.lproj │ │ │ │ └── Localizable.strings │ │ │ ├── ko.lproj │ │ │ │ └── Localizable.strings │ │ │ └── zh-Hant.lproj │ │ │ │ └── Localizable.strings │ │ ├── Base │ │ │ ├── MJRefreshBackFooter.h │ │ │ ├── MJRefreshTrailer.h │ │ │ ├── MJRefreshAutoFooter.h │ │ │ ├── MJRefreshHeader.h │ │ │ ├── MJRefreshFooter.h │ │ │ └── MJRefreshFooter.m │ │ ├── Custom │ │ │ ├── Trailer │ │ │ │ ├── MJRefreshNormalTrailer.h │ │ │ │ ├── MJRefreshStateTrailer.h │ │ │ │ └── MJRefreshStateTrailer.m │ │ │ ├── Header │ │ │ │ ├── MJRefreshGifHeader.h │ │ │ │ ├── MJRefreshNormalHeader.h │ │ │ │ └── MJRefreshStateHeader.h │ │ │ └── Footer │ │ │ │ ├── Auto │ │ │ │ ├── MJRefreshAutoNormalFooter.h │ │ │ │ ├── MJRefreshAutoGifFooter.h │ │ │ │ ├── MJRefreshAutoStateFooter.h │ │ │ │ └── MJRefreshAutoNormalFooter.m │ │ │ │ └── Back │ │ │ │ ├── MJRefreshBackGifFooter.h │ │ │ │ ├── MJRefreshBackNormalFooter.h │ │ │ │ ├── MJRefreshBackStateFooter.h │ │ │ │ └── MJRefreshBackStateFooter.m │ │ ├── MJRefreshConfig.m │ │ ├── NSBundle+MJRefresh.h │ │ ├── MJRefreshConfig.h │ │ ├── MJRefresh.h │ │ ├── UIView+MJExtension.h │ │ ├── UIScrollView+MJExtension.h │ │ ├── UIScrollView+MJRefresh.h │ │ ├── UIView+MJExtension.m │ │ └── MJRefreshConst.m │ ├── KakaJSON │ │ ├── Metadata │ │ │ ├── Layout │ │ │ │ ├── BaseLayout.swift │ │ │ │ ├── ProtocolLayout.swift │ │ │ │ ├── FunctionLayout.swift │ │ │ │ ├── EnumLayout.swift │ │ │ │ ├── StructLayout.swift │ │ │ │ ├── TupleLayout.swift │ │ │ │ ├── FieldList.swift │ │ │ │ └── Layout.swift │ │ │ ├── Type │ │ │ │ ├── MetaType.swift │ │ │ │ ├── ProtocolType.swift │ │ │ │ ├── ObjCClassType.swift │ │ │ │ ├── ForeignClassType.swift │ │ │ │ ├── StructType.swift │ │ │ │ ├── OptionalType.swift │ │ │ │ ├── EnumType.swift │ │ │ │ ├── FunctionType.swift │ │ │ │ ├── TupleType.swift │ │ │ │ ├── ClassType.swift │ │ │ │ ├── BaseType.swift │ │ │ │ └── ModelType.swift │ │ │ ├── Property.swift │ │ │ ├── Descriptor │ │ │ │ ├── StructDescriptor.swift │ │ │ │ ├── EnumDescriptor.swift │ │ │ │ ├── ClassDescriptor.swift │ │ │ │ └── FieldDescriptor.swift │ │ │ └── Metadata.swift │ │ ├── Extension │ │ │ ├── NSObject+KJ.swift │ │ │ ├── Optional+KJ.swift │ │ │ ├── JSONSerialization+KJ.swift │ │ │ ├── Pointer+KJ.swift │ │ │ ├── Data+KJ.swift │ │ │ └── Array+KJ.swift │ │ ├── Convert │ │ │ ├── ConvertibleEnum.swift │ │ │ ├── TypeProxy.swift │ │ │ ├── Logger.swift │ │ │ └── KJ.swift │ │ └── Global │ │ │ ├── JSON.swift │ │ │ └── Coding.swift │ ├── mem │ │ ├── mem_utils.h │ │ ├── search_result.h │ │ ├── mem.h │ │ └── search_result_def.h │ ├── AlertView │ │ ├── PokerCarda.swift │ │ ├── UIView+KeyWindow.swift │ │ ├── Extension+UIImage.swift │ │ ├── Extension+UILabel.swift │ │ ├── PokerPresenter.swift │ │ └── PokerConfirmRepresentable.swift │ ├── JHLog │ │ ├── JHLog.h │ │ └── JHLog.m │ ├── Appinfo │ │ └── APP │ │ │ ├── AppController.h │ │ │ ├── App.h │ │ │ └── AppController.m │ ├── YYModel │ │ └── YYModel.h │ ├── UIColor │ │ └── Utils.swift │ ├── Categories │ │ ├── UIView+CGRect.h │ │ ├── UIResponder+JHRouter.m │ │ ├── UIResponder+JHRouter.h │ │ └── UIView+CGRect.m │ ├── Drops │ │ ├── AnimationContext.swift │ │ ├── Weak.swift │ │ ├── PassthroughView.swift │ │ ├── UIView+Extensions.swift │ │ ├── PassthroughWindow.swift │ │ └── WindowViewController.swift │ ├── Alamofire │ │ ├── Alamofire.swift │ │ ├── DispatchQueue+Alamofire.swift │ │ ├── URLRequest+Alamofire.swift │ │ ├── URLSessionConfiguration+Alamofire.swift │ │ ├── StringEncoding+Alamofire.swift │ │ └── HTTPMethod.swift │ ├── JHKeyboard │ │ ├── UITextView+JHKeyboard.h │ │ ├── UITextField+JHKeyboard.h │ │ ├── JHKeyboard.h │ │ ├── UITextView+JHKeyboard.m │ │ └── UITextField+JHKeyboard.m │ └── MD5 │ │ └── StringMD5.swift ├── iMemScan-Bridging-Header.h ├── Ctrl │ ├── OneKey() │ │ ├── VMOneKeyTool.h │ │ ├── VMOneKeyModel.m │ │ ├── VMOneKeyModel.h │ │ └── VMOneKeyTool.m │ ├── OneKey │ │ ├── VMOneKeyModel.m │ │ ├── VMOneKeyTool.h │ │ └── VMOneKeyModel.h │ ├── Set │ │ ├── AppNoticeCtrl.swift │ │ ├── SetModel.swift │ │ └── AppHtmlCtrl.swift │ └── TabbarCtrl │ │ └── VMTabBarCtrl.swift ├── ViewController.swift ├── flexdecrypt.entitlements ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.storyboard ├── Info.plist ├── SceneDelegate.swift └── AppDelegate.swift ├── iMemScanTS.tipa ├── iMemScan.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ ├── WorkspaceSettings.xcsettings │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── lilianglin.xcuserdatad │ │ └── WorkspaceSettings.xcsettings └── xcuserdata │ ├── lilianglin.xcuserdatad │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ │ └── xcschememanagement.plist │ ├── macbook.xcuserdatad │ └── xcschemes │ │ └── xcschememanagement.plist │ └── kevinmuller.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── README.md └── Makefile /iMemScan/en-IN.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /iMemScan/en.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /iMemScan/zh-Hans.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /iMemScan/en-IN.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /iMemScan/zh-Hans.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /iMemScanTS.tipa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScanTS.tipa -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /iMemScan/Tool/LocalFiles/music.m4a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Tool/LocalFiles/music.m4a -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/auto.imageset/auto@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/auto.imageset/auto@2x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/auto.imageset/auto@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/auto.imageset/auto@3x.png -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/MJRefresh.bundle/arrow@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Lib/MJRefresh/MJRefresh.bundle/arrow@2x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/lcon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/lcon-1024.png -------------------------------------------------------------------------------- /iMemScan/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* 2 | InfoPlist.strings 3 | iMemScan 4 | 5 | Created by yiming on 2021/8/18. 6 | 7 | */ 8 | 9 | "进程" = "Course"; 10 | -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/sun-dark.imageset/sun-dark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/sun-dark.imageset/sun-dark@2x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/sun-dark.imageset/sun-dark@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/sun-dark.imageset/sun-dark@3x.png -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/MJRefresh.bundle/trail_arrow@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Lib/MJRefresh/MJRefresh.bundle/trail_arrow@2x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/moon-light.imageset/moon-light@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/moon-light.imageset/moon-light@2x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/moon-light.imageset/moon-light@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/moon-light.imageset/moon-light@3x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-20.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-29.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-40.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-76.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-20@2x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-29@2x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-40@2x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-76@2x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-20@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-20@2x-1.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPad-83.5@2x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-20@3x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-29@2x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-29@3x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-40@2x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-40@3x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-60@2x.png -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Assets.xcassets/AppIcon.appiconset/AppIcon-iPhone-60@3x.png -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/MJRefresh.bundle/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Lib/MJRefresh/MJRefresh.bundle/en.lproj/Localizable.strings -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/MJRefresh.bundle/ru.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Lib/MJRefresh/MJRefresh.bundle/ru.lproj/Localizable.strings -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/MJRefresh.bundle/uk.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Lib/MJRefresh/MJRefresh.bundle/uk.lproj/Localizable.strings -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/MJRefresh.bundle/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zSaaiq/iMemScanTS-Localized/HEAD/iMemScan/Lib/MJRefresh/MJRefresh.bundle/zh-Hans.lproj/Localizable.strings -------------------------------------------------------------------------------- /iMemScan.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /iMemScan.xcodeproj/xcuserdata/lilianglin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /iMemScan/Tool/Jailbreak/Root/Root.h: -------------------------------------------------------------------------------- 1 | // 2 | // Root.h 3 | // Root 4 | // 5 | // Created by yiming on 2021/8/14. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface Root : NSObject 13 | 14 | @end 15 | 16 | NS_ASSUME_NONNULL_END 17 | -------------------------------------------------------------------------------- /iMemScan/Tool/Jailbreak/Sh/RunCmdModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RunCmdModel.swift 3 | // RunCmdModel 4 | // 5 | // Created by yiming on 2021/8/21. 6 | // 7 | 8 | import UIKit 9 | 10 | struct RunCmdModel: Convertible { 11 | var path: String = "" 12 | var args: [String] = [] 13 | } 14 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Layout/BaseLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseLayout.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/2. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | struct BaseLayout: Layout { 10 | let kind: UnsafeRawPointer 11 | } 12 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Layout/ProtocolLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProtocolLayout.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/1. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | struct ProtocolLayout: Layout { 10 | let kind: UnsafeRawPointer 11 | } 12 | 13 | -------------------------------------------------------------------------------- /iMemScan.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # iMemScan Trollstore localized into English and German 2 | 3 | This version of iMemScan was translated from Chinese into English and German 4 | 5 | ## Installation 6 | 7 | 1. Download the **iMemscan.tipa** and install it in Trollstore 8 | 9 | ## Donations 10 | 11 | Support me, here: https://www.paypal.me/zSaaiq 12 | -------------------------------------------------------------------------------- /iMemScan.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Layout/FunctionLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FunctionLayout.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/1. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | struct FunctionLayout: Layout { 10 | let kind: UnsafeRawPointer 11 | var flags: Int 12 | var parameters: FieldList 13 | } 14 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Extension/NSObject+KJ.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+KJ.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/15. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension NSObject { 12 | static func newConvertible() -> Convertible { 13 | return self.init() as! Convertible 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Base/MJRefreshBackFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshBackFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshBackFooter : MJRefreshFooter 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Layout/EnumLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EnumLayout.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/7/31. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | struct EnumLayout: NominalLayout { 10 | let kind: UnsafeRawPointer 11 | /// An out-of-line description of the type 12 | var description: UnsafeMutablePointer 13 | } 14 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Layout/StructLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StructLayout.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/7/31. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | struct StructLayout: ModelLayout { 10 | let kind: UnsafeRawPointer 11 | /// An out-of-line description of the type 12 | var description: UnsafeMutablePointer 13 | } 14 | -------------------------------------------------------------------------------- /iMemScan/Lib/mem/mem_utils.h: -------------------------------------------------------------------------------- 1 | // 2 | // mem_utils.h 3 | // memui 4 | // 5 | // Created by Liu Junqi on 4/24/18. 6 | // Copyright © 2018 DeviLeo. All rights reserved. 7 | // 8 | 9 | #ifndef mem_utils_h 10 | #define mem_utils_h 11 | 12 | #include 13 | #include "search_result_def.h" 14 | 15 | void *search_mem_value(const void *b, size_t len, void *v, size_t vlen, int type, int comparison); 16 | 17 | #endif /* mem_utils_h */ 18 | -------------------------------------------------------------------------------- /iMemScan/Lib/AlertView/PokerCarda.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PokerCarda.swift 3 | // iMemScan 4 | // 5 | // Created by 李良林 on 2021/1/5. 6 | // Copyright © 2021 李良林. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class PokerCarda: NSObject { 12 | 13 | public func showInput(title: String, detail: String? = nil) -> PokerInputView { 14 | return PokerAlertPresenter().showInput(title: title, detail: detail) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Type/MetaType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MetaType.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/2. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | public class MetaType: BaseType, LayoutType { 10 | private(set) var layout: UnsafeMutablePointer! 11 | 12 | override func build() { 13 | super.build() 14 | 15 | layout = builtLayout() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Type/ProtocolType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProtocolType.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/1. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | public class ProtocolType: BaseType, LayoutType { 10 | private(set) var layout: UnsafeMutablePointer! 11 | 12 | override func build() { 13 | super.build() 14 | 15 | layout = builtLayout() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /iMemScan.xcodeproj/xcuserdata/macbook.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | iMemScan.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /iMemScan/Lib/JHLog/JHLog.h: -------------------------------------------------------------------------------- 1 | // 2 | // JHLog.h 3 | // A 4 | // 5 | // Created by HaoCold on 2020/11/4. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | #define kJHCacheLog(log) [[JHLog share] cache:log]; 14 | 15 | @interface JHLog : NSObject 16 | 17 | + (instancetype)share; 18 | 19 | - (void)cache:(NSString *)log; 20 | - (void)save; 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /iMemScan.xcodeproj/xcuserdata/kevinmuller.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | iMemScan.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /iMemScan.xcodeproj/xcuserdata/lilianglin.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | iMemScan.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/auto.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "auto@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "auto@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Type/ObjCClassType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObjCClassType.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/2. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | /// e.g. NSString 10 | public class ObjCClassType: BaseType, LayoutType { 11 | private(set) var layout: UnsafeMutablePointer! 12 | 13 | override func build() { 14 | super.build() 15 | 16 | layout = builtLayout() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshNormalTrailer.h 3 | // MJRefreshExample 4 | // 5 | // Created by kinarobin on 2020/5/3. 6 | // Copyright © 2020 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshStateTrailer.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshNormalTrailer : MJRefreshStateTrailer 14 | 15 | @property (weak, nonatomic, readonly) UIImageView *arrowView; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/sun-dark.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "sun-dark@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "sun-dark@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/moon-light.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "moon-light@2x.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "filename" : "moon-light@3x.png", 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Layout/TupleLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TupleLayout.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/1. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | struct TupleLayout: Layout { 10 | let kind: UnsafeRawPointer 11 | let numElements: Int 12 | let labels: UnsafeMutablePointer 13 | var elements: FieldList 14 | } 15 | 16 | struct TupleElement { 17 | let type: Any.Type 18 | let offset: Int 19 | } 20 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Extension/Optional+KJ.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Optional+KJ.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/5. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | protocol OptionalValue { 12 | var kj_value: Any? { get } 13 | } 14 | 15 | extension Optional: OptionalValue { 16 | var kj_value: Any? { 17 | guard let v = self else { return nil } 18 | return (v as? OptionalValue)?.kj_value ?? v 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Type/ForeignClassType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ForeignClassType.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/2. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | /// e.g. CFArray 10 | public class ForeignClassType: BaseType, LayoutType { 11 | private(set) var layout: UnsafeMutablePointer! 12 | 13 | override func build() { 14 | super.build() 15 | 16 | layout = builtLayout() 17 | } 18 | } 19 | 20 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/MJRefreshConfig.m: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshConfig.m 3 | // 4 | // Created by Frank on 2018/11/27. 5 | // Copyright © 2018 小码哥. All rights reserved. 6 | // 7 | 8 | #import "MJRefreshConfig.h" 9 | 10 | @implementation MJRefreshConfig 11 | 12 | static MJRefreshConfig *mj_RefreshConfig = nil; 13 | 14 | + (instancetype)defaultConfig { 15 | static dispatch_once_t onceToken; 16 | dispatch_once(&onceToken, ^{ 17 | mj_RefreshConfig = [[self alloc] init]; 18 | }); 19 | return mj_RefreshConfig; 20 | } 21 | 22 | 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /iMemScan/iMemScan-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import "JHUIAlertView.h" 6 | #import "UIView+CGRect.h" 7 | #import "UITextField+JHKeyboard.h" 8 | #import "MemModel.h" 9 | #import "VMTool.h" 10 | #import "YYModel.h" 11 | #import "UIResponder+JHRouter.h" 12 | #import "VMOneKeyTool.h" 13 | #import "VMOneKeyModel.h" 14 | #include "mem.h" 15 | #import "PidModel.h" 16 | #import "NSTask.h" 17 | #import "MJRefresh.h" 18 | #import "JHLog.h" 19 | #import "AppController.h" 20 | #import "NSTask.h" 21 | -------------------------------------------------------------------------------- /iMemScan/Tool/Jailbreak/Pid/PidModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // PidModel.h 3 | // BeautyList 4 | // 5 | // Created by HaoCold on 2020/11/23. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface PidModel : NSObject 14 | 15 | @property (nonatomic, copy) NSString *name; 16 | @property (nonatomic, copy) NSString *pid; 17 | @property (nonatomic, assign) BOOL selected; 18 | 19 | + (NSArray *)modelArray:(NSString *)input; 20 | + (NSArray *)refreshModelArray; 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /iMemScan/Lib/Appinfo/APP/AppController.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppController.h 3 | // MemSearch 4 | // 5 | // Created by 李良林 on 2020/10/18. 6 | // Copyright © 2020 李良林. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "App.h" 11 | 12 | @interface AppController : NSObject 13 | 14 | @property (nonatomic, readonly) NSArray* installedApplications; 15 | 16 | - (BOOL)openAppWithBundleIdentifier:(NSString*)bundleIdentifier; 17 | - (NSArray*)privateURLSchemes; 18 | - (NSArray*)publicURLSchemes; 19 | - (NSArray*)readApplications; 20 | 21 | + (instancetype)sharedInstance; 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/NSBundle+MJRefresh.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSBundle+MJRefresh.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 16/6/13. 6 | // Copyright © 2016年 小码哥. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface NSBundle (MJRefresh) 14 | + (instancetype)mj_refreshBundle; 15 | + (UIImage *)mj_arrowImage; 16 | + (UIImage *)mj_trailArrowImage; 17 | + (NSString *)mj_localizedStringForKey:(NSString *)key value:(nullable NSString *)value; 18 | + (NSString *)mj_localizedStringForKey:(NSString *)key; 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /iMemScan/Ctrl/OneKey()/VMOneKeyTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // VMOneKeyTool.h 3 | // MemView 4 | // 5 | // Created by HaoCold on 2020/9/29. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class VMOneKeyModel; 14 | 15 | @interface VMOneKeyTool : NSObject 16 | 17 | + (void)setup; 18 | + (NSArray *)allRecords; 19 | + (void)deleteRecord:(VMOneKeyModel *)model; 20 | + (void)saveRecord:(VMOneKeyModel *)model; 21 | + (void)save; 22 | + (void)exchange:(NSInteger)idx1 index:(NSInteger)idx2; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Custom/Trailer/MJRefreshStateTrailer.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshStateTrailer.h 3 | // MJRefreshExample 4 | // 5 | // Created by kinarobin on 2020/5/3. 6 | // Copyright © 2020 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshTrailer.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | 14 | @interface MJRefreshStateTrailer : MJRefreshTrailer 15 | 16 | #pragma mark - 状态相关 17 | /** 显示刷新状态的label */ 18 | @property (weak, nonatomic, readonly) UILabel *stateLabel; 19 | /** 设置state状态下的文字 */ 20 | - (void)setTitle:(NSString *)title forState:(MJRefreshState)state; 21 | 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/MJRefreshConfig.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshConfig.h 3 | // 4 | // Created by Frank on 2018/11/27. 5 | // Copyright © 2018 小码哥. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface MJRefreshConfig : NSObject 13 | 14 | /** 默认使用的语言版本, 默认为 nil. 将随系统的语言自动改变 */ 15 | @property (copy, nonatomic, nullable) NSString *languageCode; 16 | 17 | /** @return Singleton Config instance */ 18 | + (instancetype)defaultConfig; 19 | 20 | - (instancetype)init NS_UNAVAILABLE; 21 | + (instancetype)new NS_UNAVAILABLE; 22 | 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /iMemScan/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // iMemScan 4 | // 5 | // Created by yiming on 2021/8/4. 6 | // 7 | 8 | import UIKit 9 | import Foundation 10 | 11 | @discardableResult func eng(_ str: String) -> String { 12 | return NSLocalizedString(str, comment: "") 13 | } 14 | 15 | class ViewController: UIViewController { 16 | 17 | override func viewDidLoad() { 18 | super.viewDidLoad() 19 | // Do any additional setup after loading the view. 20 | 21 | UIApplication.shared.delegate?.window?!.rootViewController = VMTabBarCtrl() 22 | } 23 | 24 | } 25 | 26 | 27 | -------------------------------------------------------------------------------- /iMemScan/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | iMemScan 4 | 5 | Created by yiming on 2021/8/19. 6 | 7 | */ 8 | 9 | "授权状态" = "VIP status"; 10 | "设备已冻结" = "Ban"; 11 | "设备标识" = "Serial number"; 12 | "购买授权" = "Buy VIP"; 13 | "版本" = "Version"; 14 | "卸载应用" = "Uninstall app"; 15 | "信息" = "Info"; 16 | "购买" = "Buy"; 17 | "卸载" = "Uninstall"; 18 | "暂无更新" = "Update isn’t available"; 19 | "您当前版本无需更新" = "You are using latest version"; 20 | "确定要卸载本应用吗?" = "Are you sure you want to uninstall this app?"; 21 | "确定卸载" = "Complete Uninstallation"; 22 | "取消" = "Cancel"; 23 | "复制设备码成功" = "Copy device code successfully"; 24 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/MJRefresh.h: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | 4 | #import "UIScrollView+MJRefresh.h" 5 | #import "UIScrollView+MJExtension.h" 6 | #import "UIView+MJExtension.h" 7 | 8 | #import "MJRefreshNormalHeader.h" 9 | #import "MJRefreshGifHeader.h" 10 | 11 | #import "MJRefreshBackNormalFooter.h" 12 | #import "MJRefreshBackGifFooter.h" 13 | #import "MJRefreshAutoNormalFooter.h" 14 | #import "MJRefreshAutoGifFooter.h" 15 | 16 | #import "MJRefreshNormalTrailer.h" 17 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Layout/FieldList.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FieldList.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/1. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | struct FieldList { 10 | private let item: Item 11 | mutating func ptr(_ index: Int) -> UnsafeMutablePointer { 12 | return withUnsafeMutablePointer(to: &self) { 13 | ($0 + index).kj_raw ~> Item.self 14 | } 15 | } 16 | 17 | mutating func item(_ index: Int) -> Item { 18 | return withUnsafeMutablePointer(to: &self) { 19 | $0[index].item 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /iMemScan/Tool/VMem/SetModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // SetModel.h 3 | // iMemScan 4 | // 5 | // Created by HaoCold on 2021/8/16. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface SetModel : NSObject 13 | 14 | @property (nonatomic, assign) NSString *range; 15 | @property (nonatomic, assign) NSString *addrRangeStart; 16 | @property (nonatomic, assign) NSString *addrRangeEnd; 17 | @property (nonatomic, assign) NSString *LimitCount; 18 | @property (nonatomic, assign) NSString *duration; 19 | @property (nonatomic, assign) NSString *duration1; 20 | 21 | + (instancetype)share; 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /iMemScan/Tool/VMem/SetModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // SetModel.m 3 | // iMemScan 4 | // 5 | // Created by HaoCold on 2021/8/16. 6 | // 7 | 8 | #import 9 | #import "SetModel.h" 10 | #import "YYModel.h" 11 | 12 | @implementation SetModel 13 | 14 | NSMutableArray *_setData; 15 | 16 | + (instancetype)share 17 | { 18 | static SetModel *model; 19 | static dispatch_once_t onceToken; 20 | dispatch_once(&onceToken, ^{ 21 | model = [[SetModel alloc] init]; 22 | }); 23 | return model; 24 | } 25 | 26 | - (instancetype)init 27 | { 28 | self = [super init]; 29 | if (self) { 30 | 31 | } 32 | return self; 33 | } 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Custom/Header/MJRefreshGifHeader.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshGifHeader.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshStateHeader.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshGifHeader : MJRefreshStateHeader 14 | @property (weak, nonatomic, readonly) UIImageView *gifView; 15 | 16 | /** 设置state状态下的动画图片images 动画持续时间duration*/ 17 | - (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state; 18 | - (void)setImages:(NSArray *)images forState:(MJRefreshState)state; 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshAutoNormalFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshAutoStateFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshAutoNormalFooter : MJRefreshAutoStateFooter 14 | @property (weak, nonatomic, readonly) UIActivityIndicatorView *loadingView; 15 | 16 | /** 菊花的样式 */ 17 | @property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle MJRefreshDeprecated("first deprecated in 3.2.2 - Use `loadingView` property"); 18 | @end 19 | 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /iMemScan/Lib/YYModel/YYModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // YYModel.h 3 | // YYModel 4 | // 5 | // Created by ibireme on 15/5/10. 6 | // Copyright (c) 2015 ibireme. 7 | // 8 | // This source code is licensed under the MIT-style license found in the 9 | // LICENSE file in the root directory of this source tree. 10 | // 11 | 12 | #import 13 | 14 | #if __has_include() 15 | FOUNDATION_EXPORT double YYModelVersionNumber; 16 | FOUNDATION_EXPORT const unsigned char YYModelVersionString[]; 17 | #import 18 | #import 19 | #else 20 | #import "NSObject+YYModel.h" 21 | #import "YYClassInfo.h" 22 | #endif 23 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshAutoGifFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshAutoStateFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshAutoGifFooter : MJRefreshAutoStateFooter 14 | @property (weak, nonatomic, readonly) UIImageView *gifView; 15 | 16 | /** 设置state状态下的动画图片images 动画持续时间duration*/ 17 | - (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state; 18 | - (void)setImages:(NSArray *)images forState:(MJRefreshState)state; 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshBackGifFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshBackStateFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshBackGifFooter : MJRefreshBackStateFooter 14 | @property (weak, nonatomic, readonly) UIImageView *gifView; 15 | 16 | /** 设置state状态下的动画图片images 动画持续时间duration*/ 17 | - (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state; 18 | - (void)setImages:(NSArray *)images forState:(MJRefreshState)state; 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /iMemScan.xcodeproj/project.xcworkspace/xcuserdata/lilianglin.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildLocationStyle 6 | UseAppPreferences 7 | CustomBuildLocationType 8 | RelativeToDerivedData 9 | DerivedDataLocationStyle 10 | Default 11 | IssueFilterStyle 12 | ShowActiveSchemeOnly 13 | LiveSourceIssuesEnabled 14 | 15 | ShowSharedSchemesAutomaticallyEnabled 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /iMemScan/Tool/Jailbreak/iMemScan.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | platform-application 6 | 7 | get-task-allow 8 | 9 | task_for_pid-allow 10 | 11 | proc_info-allow 12 | 13 | run-unsigned-code 14 | 15 | com.apple.springboard.debugapplications 16 | 17 | application-identifier 18 | $(AppIdentifierPrefix)$(CFBundleIdentifier) 19 | com.apple.private.security.no-container 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Convert/ConvertibleEnum.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConvertibleEnum.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/13. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | public protocol ConvertibleEnum { 10 | static func kj_convert(from value: Any) -> Self? 11 | var kj_value: Any { get } 12 | static var kj_valueType: Any.Type { get } 13 | } 14 | 15 | public extension RawRepresentable where Self: ConvertibleEnum { 16 | static func kj_convert(from value: Any) -> Self? { 17 | return (value as? RawValue).flatMap { Self.init(rawValue: $0) } 18 | } 19 | var kj_value: Any { return rawValue } 20 | static var kj_valueType: Any.Type { return RawValue.self } 21 | } 22 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/MJRefresh.bundle/ko.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "MJRefreshHeaderIdleText" = "아래로 당겨 새로고침"; 2 | "MJRefreshHeaderPullingText" = "놓으면 새로고침"; 3 | "MJRefreshHeaderRefreshingText" = "로딩중..."; 4 | 5 | "MJRefreshAutoFooterIdleText" = "탭 또는 위로 당겨 로드함"; 6 | "MJRefreshAutoFooterRefreshingText" = "로딩중..."; 7 | "MJRefreshAutoFooterNoMoreDataText" = "더이상 데이터 없음"; 8 | 9 | "MJRefreshBackFooterIdleText" = "위로 당겨 더 로드 가능"; 10 | "MJRefreshBackFooterPullingText" = "놓으면 더 로드됨."; 11 | "MJRefreshBackFooterRefreshingText" = "로딩중..."; 12 | "MJRefreshBackFooterNoMoreDataText" = "더이상 데이터 없음"; 13 | 14 | "MJRefreshHeaderLastTimeText" = "마지막 업데이트: "; 15 | "MJRefreshHeaderDateTodayText" = "오늘"; 16 | "MJRefreshHeaderNoneLastDateText" = "기록 없음"; 17 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Base/MJRefreshTrailer.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshTrailer.h 3 | // MJRefresh 4 | // 5 | // Created by kinarobin on 2020/5/3. 6 | // Copyright © 2020 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshComponent.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshTrailer : MJRefreshComponent 14 | 15 | /** 创建trailer*/ 16 | + (instancetype)trailerWithRefreshingBlock:(MJRefreshComponentAction)refreshingBlock; 17 | /** 创建trailer */ 18 | + (instancetype)trailerWithRefreshingTarget:(id)target refreshingAction:(SEL)action; 19 | 20 | /** 忽略多少scrollView的contentInset的right */ 21 | @property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetRight; 22 | 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /iMemScan/Ctrl/OneKey()/VMOneKeyModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // VMOneKeyModel.m 3 | // MemView 4 | // 5 | // Created by HaoCold on 2020/9/28. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import "VMOneKeyModel.h" 10 | 11 | @implementation VMOneKeyModel 12 | 13 | - (instancetype)init 14 | { 15 | self = [super init]; 16 | if (self) { 17 | _steps = @[].mutableCopy; 18 | } 19 | return self; 20 | } 21 | 22 | + (NSDictionary *)modelContainerPropertyGenericClass 23 | { 24 | return @{@"steps": [VMOneKeySubModel class]}; 25 | } 26 | 27 | + (nullable NSArray *)modelPropertyBlacklist 28 | { 29 | return @[@"open"]; 30 | } 31 | 32 | @end 33 | 34 | @implementation VMOneKeySubModel 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Custom/Header/MJRefreshNormalHeader.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshNormalHeader.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshStateHeader.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshNormalHeader : MJRefreshStateHeader 14 | @property (weak, nonatomic, readonly) UIImageView *arrowView; 15 | @property (weak, nonatomic, readonly) UIActivityIndicatorView *loadingView; 16 | 17 | 18 | /** 菊花的样式 */ 19 | @property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle MJRefreshDeprecated("first deprecated in 3.2.2 - Use `loadingView` property"); 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Type/StructType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StructType.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/7/31. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | public class StructType: ModelType, PropertyType, LayoutType { 10 | private(set) var layout: UnsafeMutablePointer! 11 | 12 | override func build() { 13 | super.build() 14 | 15 | layout = builtLayout() 16 | properties = builtProperties() 17 | genericTypes = builtGenericTypes() 18 | } 19 | 20 | override public var description: String { 21 | return "\(name) { kind = \(kind), properties = \(properties ?? []), genericTypes = \(genericTypes ?? []) }" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshBackNormalFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshBackStateFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshBackNormalFooter : MJRefreshBackStateFooter 14 | @property (weak, nonatomic, readonly) UIImageView *arrowView; 15 | @property (weak, nonatomic, readonly) UIActivityIndicatorView *loadingView; 16 | 17 | /** 菊花的样式 */ 18 | @property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle MJRefreshDeprecated("first deprecated in 3.2.2 - Use `loadingView` property"); 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshBackStateFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/6/13. 6 | // Copyright © 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshBackFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshBackStateFooter : MJRefreshBackFooter 14 | /** 文字距离圈圈、箭头的距离 */ 15 | @property (assign, nonatomic) CGFloat labelLeftInset; 16 | /** 显示刷新状态的label */ 17 | @property (weak, nonatomic, readonly) UILabel *stateLabel; 18 | /** 设置state状态下的文字 */ 19 | - (void)setTitle:(NSString *)title forState:(MJRefreshState)state; 20 | 21 | /** 获取state状态下的title */ 22 | - (NSString *)titleForState:(MJRefreshState)state; 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/color_4.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "1.000", 9 | "green" : "1.000", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "platform" : "ios", 24 | "reference" : "systemGray5Color" 25 | }, 26 | "idiom" : "universal" 27 | } 28 | ], 29 | "info" : { 30 | "author" : "xcode", 31 | "version" : 1 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/color_3.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.820", 9 | "green" : "0.820", 10 | "red" : "0.820" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "platform" : "ios", 24 | "reference" : "opaqueSeparatorColor" 25 | }, 26 | "idiom" : "universal" 27 | } 28 | ], 29 | "info" : { 30 | "author" : "xcode", 31 | "version" : 1 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Layout/Layout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Layout.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/7/31. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | /// Must be struct, do not use class 10 | /// Memory layout for metadata 11 | protocol Layout { 12 | // Only valid for non-class metadata 13 | var kind: UnsafeRawPointer { get } 14 | } 15 | 16 | protocol NominalLayout: Layout { 17 | associatedtype DescriptorType: NominalDescriptor 18 | var description: UnsafeMutablePointer { get } 19 | var genericTypeOffset: Int { get } 20 | } 21 | 22 | extension NominalLayout { 23 | var genericTypeOffset: Int { return 2 } 24 | } 25 | 26 | protocol ModelLayout: NominalLayout where DescriptorType: ModelDescriptor {} 27 | -------------------------------------------------------------------------------- /iMemScan/Ctrl/OneKey/VMOneKeyModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // VMOneKeyModel.m 3 | // MemView 4 | // 5 | // Created by HaoCold on 2020/9/28. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import "VMOneKeyModel.h" 10 | 11 | @implementation VMOneKeyGroupModel 12 | 13 | @end 14 | 15 | @implementation VMOneKeyModel 16 | 17 | - (instancetype)init 18 | { 19 | self = [super init]; 20 | if (self) { 21 | _steps = @[].mutableCopy; 22 | } 23 | return self; 24 | } 25 | 26 | + (NSDictionary *)modelContainerPropertyGenericClass 27 | { 28 | return @{@"steps": [VMOneKeySubModel class]}; 29 | } 30 | 31 | + (nullable NSArray *)modelPropertyBlacklist 32 | { 33 | return @[@"open"]; 34 | } 35 | 36 | @end 37 | 38 | @implementation VMOneKeySubModel 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshAutoStateFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/6/13. 6 | // Copyright © 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshAutoFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshAutoStateFooter : MJRefreshAutoFooter 14 | /** 文字距离圈圈、箭头的距离 */ 15 | @property (assign, nonatomic) CGFloat labelLeftInset; 16 | /** 显示刷新状态的label */ 17 | @property (weak, nonatomic, readonly) UILabel *stateLabel; 18 | 19 | /** 设置state状态下的文字 */ 20 | - (void)setTitle:(NSString *)title forState:(MJRefreshState)state; 21 | 22 | /** 隐藏刷新状态的文字 */ 23 | @property (assign, nonatomic, getter=isRefreshingTitleHidden) BOOL refreshingTitleHidden; 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/MJRefresh.bundle/zh-Hant.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "MJRefreshHeaderIdleText" = "下拉可以刷新"; 2 | "MJRefreshHeaderPullingText" = "鬆開立即刷新"; 3 | "MJRefreshHeaderRefreshingText" = "正在刷新數據中..."; 4 | 5 | "MJRefreshTrailerIdleText" = "滑動查看圖文詳情"; 6 | "MJRefreshTrailerPullingText" = "釋放查看圖文詳情"; 7 | 8 | "MJRefreshAutoFooterIdleText" = "點擊或上拉加載更多"; 9 | "MJRefreshAutoFooterRefreshingText" = "正在加載更多的數據..."; 10 | "MJRefreshAutoFooterNoMoreDataText" = "已經全部加載完畢"; 11 | 12 | "MJRefreshBackFooterIdleText" = "上拉可以加載更多"; 13 | "MJRefreshBackFooterPullingText" = "鬆開立即加載更多"; 14 | "MJRefreshBackFooterRefreshingText" = "正在加載更多的數據..."; 15 | "MJRefreshBackFooterNoMoreDataText" = "已經全部加載完畢"; 16 | 17 | "MJRefreshHeaderLastTimeText" = "最後更新:"; 18 | "MJRefreshHeaderDateTodayText" = "今天"; 19 | "MJRefreshHeaderNoneLastDateText" = "無記錄"; 20 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Type/OptionalType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OptionalType.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/2. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | /// Optional metadata share the same basic layout as enum metadata 10 | public class OptionalType: EnumType { 11 | public private(set) var wrapType: Any.Type = Any.self 12 | 13 | override func build() { 14 | super.build() 15 | 16 | var wt: BaseType! = self 17 | while wt.kind == .optional { 18 | wt = Metadata.type((wt as! OptionalType).genericTypes![0]) 19 | } 20 | wrapType = wt.type 21 | } 22 | 23 | override public var description: String { 24 | return "\(name) { kind = \(kind), wrapType = \(wrapType) }" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/UIView+MJExtension.h: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | // UIView+Extension.h 4 | // MJRefreshExample 5 | // 6 | // Created by MJ Lee on 14-5-28. 7 | // Copyright (c) 2014年 小码哥. All rights reserved. 8 | // 9 | 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface UIView (MJExtension) 15 | @property (assign, nonatomic) CGFloat mj_x; 16 | @property (assign, nonatomic) CGFloat mj_y; 17 | @property (assign, nonatomic) CGFloat mj_w; 18 | @property (assign, nonatomic) CGFloat mj_h; 19 | @property (assign, nonatomic) CGSize mj_size; 20 | @property (assign, nonatomic) CGPoint mj_origin; 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /iMemScan/Lib/UIColor/Utils.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Utils.swift 3 | // ControlBoardSwift 4 | // 5 | // Created by 李良林 on 2020/11/21. 6 | // Copyright © 2020 李良林. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | extension UIColor { 13 | convenience init(rgb: UInt) { 14 | self.init(red: CGFloat((rgb & 0xFF0000) >> 16) / 255.0, green: CGFloat((rgb & 0x00FF00) >> 8) / 255.0, blue: CGFloat(rgb & 0x0000FF) / 255.0, alpha: CGFloat(1.0)) 15 | } 16 | 17 | static func dynamicColor(_ lightColor: UIColor, darkColor: UIColor? = UIColor.white) -> UIColor { 18 | return UIColor.init { (traitCollection) -> UIColor in 19 | if traitCollection.userInterfaceStyle == .light { 20 | return lightColor 21 | }else{ 22 | return darkColor! 23 | } 24 | } 25 | } 26 | } 27 | 28 | 29 | -------------------------------------------------------------------------------- /iMemScan/Lib/mem/search_result.h: -------------------------------------------------------------------------------- 1 | // 2 | // search_result.h 3 | // mem 4 | // 5 | // Created by Liu Junqi on 3/27/18. 6 | // Copyright © 2018 DeviLeo. All rights reserved. 7 | // 8 | 9 | #ifndef search_result_h 10 | #define search_result_h 11 | 12 | #include 13 | #include 14 | #include "search_result_def.h" 15 | 16 | search_result_chain_t create_search_result_chain(mach_vm_address_t address, void *value, int size, int type, int protection); 17 | void destroy_search_result_chain(search_result_chain_t chain); 18 | void destroy_all_search_result_chain(search_result_chain_t chain); 19 | void show_search_result_chain(search_result_chain_t chain); 20 | int compare_value(void *value1, int size1, void *value2, int size2, int type); 21 | int size_of_type(int type); 22 | void *value_of_type(const char *value_str, int type, int *value_size); 23 | 24 | #endif /* search_result_h */ 25 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Global/JSON.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JSON.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/2. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | // MARK: Model -> JSON 10 | public func JSONObject(from model: M) -> [String: Any] { 11 | return model.kj_JSONObject() 12 | } 13 | 14 | public func JSONObjectArray(from models: [M]) -> [[String: Any]] { 15 | return models.kj.JSONObjectArray() 16 | } 17 | 18 | //public func JSONArray(from value: [Any]) -> [Any] { 19 | // return value.kj.JSONArray() 20 | //} 21 | // 22 | //public func JSON(from value: Any) -> Any? { 23 | // return Values.JSONValue(value) 24 | //} 25 | 26 | public func JSONString(from value: Any, 27 | prettyPrinted: Bool = false) -> String { 28 | return Values.JSONString(value, prettyPrinted: prettyPrinted) ?? "" 29 | } 30 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | TARGET_CODESIGN = $(shell which ldid) 2 | TARGET_DPKG = $(shell which dpkg) 3 | 4 | APP_TMP = $(TMPDIR)/iMemScan-build 5 | APP_BUNDLE_PATH = $(APP_TMP)/Build/Products/Release-iphoneos/iMemScan.app 6 | 7 | all: 8 | xcodebuild -quiet -jobs $(shell sysctl -n hw.ncpu) -project 'iMemScan.xcodeproj' -scheme iMemScan -configuration Release -arch arm64 -sdk iphoneos -derivedDataPath $(APP_TMP) \ 9 | CODE_SIGNING_ALLOWED=NO DSTROOT=$(APP_TMP)/install 10 | 11 | ldid -Sentitlements.plist $(APP_BUNDLE_PATH)/iMemScan 12 | rm -rf build 13 | mkdir -p build/Payload 14 | 15 | mv $(APP_BUNDLE_PATH) build/Payload 16 | 17 | # make TrollStore tipa 18 | @ln -sf build/Payload Payload 19 | zip -r9 iMemScanTS.tipa Payload 20 | @rm -rf Payload 21 | 22 | # lol 23 | find . -name ".DS_Store" -delete 24 | 25 | @rm -rf build 26 | 27 | @echo TrollStore .tipa written to build/iMemScanTS.tipa 28 | -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/color_2.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "1.000", 9 | "green" : "1.000", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.000", 27 | "green" : "0.000", 28 | "red" : "0.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /iMemScan/Assets.xcassets/color_1.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.000", 9 | "green" : "0.000", 10 | "red" : "0.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "extended-srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.820", 27 | "green" : "0.820", 28 | "red" : "0.820" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Custom/Header/MJRefreshStateHeader.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshStateHeader.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshHeader.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshStateHeader : MJRefreshHeader 14 | #pragma mark - 刷新时间相关 15 | /** 利用这个block来决定显示的更新时间文字 */ 16 | @property (copy, nonatomic, nullable) NSString *(^lastUpdatedTimeText)(NSDate * _Nullable lastUpdatedTime); 17 | /** 显示上一次刷新时间的label */ 18 | @property (weak, nonatomic, readonly) UILabel *lastUpdatedTimeLabel; 19 | 20 | #pragma mark - 状态相关 21 | /** 文字距离圈圈、箭头的距离 */ 22 | @property (assign, nonatomic) CGFloat labelLeftInset; 23 | /** 显示刷新状态的label */ 24 | @property (weak, nonatomic, readonly) UILabel *stateLabel; 25 | /** 设置state状态下的文字 */ 26 | - (void)setTitle:(NSString *)title forState:(MJRefreshState)state; 27 | @end 28 | 29 | NS_ASSUME_NONNULL_END 30 | -------------------------------------------------------------------------------- /iMemScan/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | iMemScan 4 | 5 | Created by yiming on 2021/8/19. 6 | 7 | */ 8 | 9 | "授权状态" = "VIP status"; 10 | "设备已冻结" = "Ban"; 11 | "设备标识" = "Serial number"; 12 | "购买授权" = "Buy VIP"; 13 | "版本" = "Version"; 14 | "卸载应用" = "Uninstall app"; 15 | "信息" = "Info"; 16 | "购买" = "Buy"; 17 | "卸载" = "Uninstall"; 18 | "暂无更新" = "Update isn’t available"; 19 | "您当前版本无需更新" = "You are using latest version"; 20 | "确定要卸载本应用吗?" = "Are you sure you want to uninstall this app?"; 21 | "确定卸载" = "Complete Uninstallation"; 22 | "取消" = "Cancel"; 23 | "复制设备码成功" = "Copy device code successfully"; 24 | "modify Value" = "Modify Value %@"; 25 | "modifyValueRecord" = "Modify Value %@"; 26 | "Complete change" = "Save"; 27 | "Nearby Search" = "<>"; 28 | "Nearby" = "Search range"; 29 | "Add to" = "Add"; 30 | "Select First Half" = " < "; 31 | "Select Second Half" = " > "; 32 | "Numeric Search" = "Search"; 33 | "Value Search" = "Search"; 34 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Base/MJRefreshAutoFooter.h: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshAutoFooter.h 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshFooter.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MJRefreshAutoFooter : MJRefreshFooter 14 | /** 是否自动刷新(默认为YES) */ 15 | @property (assign, nonatomic, getter=isAutomaticallyRefresh) BOOL automaticallyRefresh; 16 | 17 | /** 当底部控件出现多少时就自动刷新(默认为1.0,也就是底部控件完全出现时,才会自动刷新) */ 18 | @property (assign, nonatomic) CGFloat appearencePercentTriggerAutoRefresh MJRefreshDeprecated("请使用triggerAutomaticallyRefreshPercent属性"); 19 | 20 | /** 当底部控件出现多少时就自动刷新(默认为1.0,也就是底部控件完全出现时,才会自动刷新) */ 21 | @property (assign, nonatomic) CGFloat triggerAutomaticallyRefreshPercent; 22 | 23 | /** 自动触发次数, 默认为 1, 仅在拖拽 ScrollView 时才生效, 24 | 25 | 如果为 -1, 则为无限触发 26 | */ 27 | @property (nonatomic) NSInteger autoTriggerTimes; 28 | @end 29 | 30 | NS_ASSUME_NONNULL_END 31 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Convert/TypeProxy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TypeProxy.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/13. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | protocol TypeProxy: Convertible {} 10 | 11 | extension TypeProxy { 12 | static func `is`(_ value: Any) -> Bool { 13 | return value is Self 14 | } 15 | 16 | static func `is`(_ type: Any.Type) -> Bool { 17 | return type is Self.Type 18 | } 19 | 20 | static func `as`(_ value: Any) -> Self? { 21 | return value as? Self 22 | } 23 | 24 | static func `as`(_ type: Any.Type) -> Self.Type? { 25 | return type as? Self.Type 26 | } 27 | } 28 | 29 | func typeProxy(_ type: Any.Type) -> TypeProxy.Type { 30 | // Any.Type(8 bytes) + Int(8 bytes) == Protocol.Type(16 bytes) 31 | return (type, 0) ~>> TypeProxy.Type.self 32 | } 33 | 34 | typealias TypeKey = UInt 35 | func typeKey(_ type: Any.Type) -> TypeKey { 36 | return type ~>> TypeKey.self 37 | } 38 | -------------------------------------------------------------------------------- /iMemScan/flexdecrypt.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | application-identifier 6 | - 7 | com.apple.developer.team-identifier 8 | - 9 | com.apple.diagnosticd.diagnostic 10 | 11 | com.apple.frontboard.debugapplications 12 | 13 | com.apple.multitasking.termination 14 | 15 | com.apple.private.cs.debugger 16 | 17 | com.apple.private.security.no-sandbox 18 | 19 | com.apple.private.skip-library-validation 20 | 21 | com.apple.springboard.launchapplications 22 | 23 | dynamic-codesigning 24 | 25 | get-task-allow 26 | 27 | platform-application 28 | 29 | task_for_pid-allow 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/UIScrollView+MJExtension.h: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | // UIScrollView+Extension.h 4 | // MJRefreshExample 5 | // 6 | // Created by MJ Lee on 14-5-28. 7 | // Copyright (c) 2014年 小码哥. All rights reserved. 8 | // 9 | 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface UIScrollView (MJExtension) 15 | @property (readonly, nonatomic) UIEdgeInsets mj_inset; 16 | 17 | @property (assign, nonatomic) CGFloat mj_insetT; 18 | @property (assign, nonatomic) CGFloat mj_insetB; 19 | @property (assign, nonatomic) CGFloat mj_insetL; 20 | @property (assign, nonatomic) CGFloat mj_insetR; 21 | 22 | @property (assign, nonatomic) CGFloat mj_offsetX; 23 | @property (assign, nonatomic) CGFloat mj_offsetY; 24 | 25 | @property (assign, nonatomic) CGFloat mj_contentW; 26 | @property (assign, nonatomic) CGFloat mj_contentH; 27 | @end 28 | 29 | NS_ASSUME_NONNULL_END 30 | -------------------------------------------------------------------------------- /iMemScan/Ctrl/OneKey/VMOneKeyTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // VMOneKeyTool.h 3 | // MemView 4 | // 5 | // Created by HaoCold on 2020/9/29. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class VMOneKeyModel; 14 | @class VMOneKeyGroupModel; 15 | 16 | typedef NS_ENUM(NSUInteger, VMOneKeyType) { 17 | VMOneKeyType_Record, // 记录 18 | VMOneKeyType_Group, // 组 19 | }; 20 | 21 | @interface VMOneKeyTool : NSObject 22 | 23 | + (void)setup; 24 | 25 | + (void)saveAll; 26 | + (NSArray *)allRecords:(VMOneKeyType)type; 27 | + (void)save:(VMOneKeyType)type; 28 | + (void)exchange:(NSInteger)idx1 index:(NSInteger)idx2 type:(VMOneKeyType)type; 29 | 30 | // ================== 脚本 ================== 31 | + (void)deleteRecord:(VMOneKeyModel *)model; 32 | + (void)saveRecord:(VMOneKeyModel *)model; 33 | 34 | // ================== 组 ================== 35 | + (void)deleteGroup:(VMOneKeyGroupModel *)model; 36 | + (void)saveGroup:(VMOneKeyGroupModel *)model; 37 | 38 | @end 39 | 40 | NS_ASSUME_NONNULL_END 41 | -------------------------------------------------------------------------------- /iMemScan/Tool/VMem/MemModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // MemModel.h 3 | // ViewMem 4 | // 5 | // Created by HaoCold on 2020/8/27. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "VMTypeHeader.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface MemModel : NSObject 15 | 16 | @property (nonatomic) UInt64 o_addr; 17 | @property (nonatomic, copy) NSString *address; 18 | @property (nonatomic, copy) NSString *value; 19 | @property (nonatomic, copy) NSString *key; 20 | @property (nonatomic, assign) VMMemValueType type; 21 | 22 | // ===== 部分修改使用 ===== 23 | @property (nonatomic, assign) BOOL selected; 24 | @property (nonatomic, assign) NSInteger index; 25 | 26 | // ===== 储存记录使用 ===== 27 | @property (nonatomic, copy) NSString *recordName; 28 | 29 | // ===== 查看内存使用 ===== 30 | @property (nonatomic, assign) VMMemValueType valueType; 31 | @property (nonatomic, copy) NSString *value_16; 32 | @property (nonatomic, copy) NSString *value_10; 33 | 34 | 35 | - (MemModel *)clone; 36 | 37 | @end 38 | 39 | NS_ASSUME_NONNULL_END 40 | -------------------------------------------------------------------------------- /iMemScan/Lib/Categories/UIView+CGRect.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+CGRect.h 3 | // MemModify 4 | // 5 | // Created by HaoCold on 2020/6/19. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface UIView (CGRect) 14 | @property (nonatomic) CGFloat left; ///< Shortcut for frame.origin.x. 15 | @property (nonatomic) CGFloat top; ///< Shortcut for frame.origin.y 16 | @property (nonatomic) CGFloat right; ///< Shortcut for frame.origin.x + frame.size.width 17 | @property (nonatomic) CGFloat bottom; ///< Shortcut for frame.origin.y + frame.size.height 18 | @property (nonatomic) CGFloat width; ///< Shortcut for frame.size.width. 19 | @property (nonatomic) CGFloat height; ///< Shortcut for frame.size.height. 20 | @property (nonatomic) CGFloat centerX; ///< Shortcut for center.x 21 | @property (nonatomic) CGFloat centerY; ///< Shortcut for center.y 22 | @property (nonatomic) CGPoint origin; ///< Shortcut for frame.origin. 23 | @property (nonatomic) CGSize size; ///< Shortcut for frame.size. 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Extension/JSONSerialization+KJ.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JSONSerialization+KJ.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/2. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension JSONSerialization { 12 | static func kj_JSON(_ string: String, _ type: T.Type) -> T? { 13 | return string.data(using: .utf8).flatMap { kj_JSON($0, type) } 14 | } 15 | 16 | static func kj_JSON(_ data: Data, _ type: T.Type) -> T? { 17 | return try? jsonObject(with: data, 18 | options: .allowFragments) as? T 19 | } 20 | 21 | static func kj_string(_ json: Any?, 22 | prettyPrinted: Bool = false) -> String? { 23 | guard let value = json.kj_value else { return nil } 24 | guard value is [Any] || value is [String: Any] else { 25 | return "\(value)" 26 | } 27 | guard let data = try? data(withJSONObject: value, 28 | options: prettyPrinted ? [.prettyPrinted] : []) 29 | else { return nil } 30 | return String(data: data, encoding: .utf8) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Type/EnumType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EnumType.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/7/31. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | public class EnumType: BaseType, NominalType, LayoutType { 10 | private(set) var layout: UnsafeMutablePointer! 11 | public private(set) var genericTypes: [Any.Type]? 12 | public private(set) var cases: [String]? 13 | 14 | override func build() { 15 | super.build() 16 | 17 | layout = builtLayout() 18 | genericTypes = builtGenericTypes() 19 | 20 | let description = layout.pointee.description 21 | let count = Int(description.pointee.numEmptyCases) 22 | guard count > 0 else { return } 23 | let descriptor = description.pointee.fields.advanced() 24 | cases = (0..= 30 | VMMemComparisonGT, // > 31 | } VMMemComparison; 32 | 33 | typedef enum : NSUInteger { 34 | VMMemSearchType_1 = 1, // 1 35 | VMMemSearchType_2 = 2, // 2 36 | VMMemSearchType_4 = 4, // 4 37 | VMMemSearchType_8 = 8, // 8 38 | } VMMemSearchType; 39 | 40 | #endif /* VMTypeHeader_h */ 41 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/UIScrollView+MJRefresh.h: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | // UIScrollView+MJRefresh.h 4 | // MJRefreshExample 5 | // 6 | // Created by MJ Lee on 15/3/4. 7 | // Copyright (c) 2015年 小码哥. All rights reserved. 8 | // 给ScrollView增加下拉刷新、上拉刷新、 左滑刷新的功能 9 | 10 | #import 11 | #import "MJRefreshConst.h" 12 | 13 | @class MJRefreshHeader, MJRefreshFooter, MJRefreshTrailer; 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | @interface UIScrollView (MJRefresh) 18 | /** 下拉刷新控件 */ 19 | @property (strong, nonatomic, nullable) MJRefreshHeader *mj_header; 20 | @property (strong, nonatomic, nullable) MJRefreshHeader *header MJRefreshDeprecated("使用mj_header"); 21 | /** 上拉刷新控件 */ 22 | @property (strong, nonatomic, nullable) MJRefreshFooter *mj_footer; 23 | @property (strong, nonatomic, nullable) MJRefreshFooter *footer MJRefreshDeprecated("使用mj_footer"); 24 | 25 | /** 左滑刷新控件 */ 26 | @property (strong, nonatomic, nullable) MJRefreshTrailer *mj_trailer; 27 | 28 | #pragma mark - other 29 | - (NSInteger)mj_totalDataCount; 30 | 31 | @end 32 | 33 | NS_ASSUME_NONNULL_END 34 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Base/MJRefreshHeader.h: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | // MJRefreshHeader.h 4 | // MJRefreshExample 5 | // 6 | // Created by MJ Lee on 15/3/4. 7 | // Copyright (c) 2015年 小码哥. All rights reserved. 8 | // 下拉刷新控件:负责监控用户下拉的状态 9 | 10 | #import "MJRefreshComponent.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface MJRefreshHeader : MJRefreshComponent 15 | /** 创建header */ 16 | + (instancetype)headerWithRefreshingBlock:(MJRefreshComponentAction)refreshingBlock; 17 | /** 创建header */ 18 | + (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action; 19 | 20 | /** 这个key用来存储上一次下拉刷新成功的时间 */ 21 | @property (copy, nonatomic) NSString *lastUpdatedTimeKey; 22 | /** 上一次下拉刷新成功的时间 */ 23 | @property (strong, nonatomic, readonly, nullable) NSDate *lastUpdatedTime; 24 | 25 | /** 忽略多少scrollView的contentInset的top */ 26 | @property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetTop; 27 | 28 | /** 默认是关闭状态, 如果遇到 CollectionView 的动画异常问题可以尝试打开 */ 29 | @property (nonatomic) BOOL isCollectionViewAnimationBug; 30 | @end 31 | 32 | NS_ASSUME_NONNULL_END 33 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Property.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Property.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/7/30. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | /// Info for stored property(存储属性的相关信息) 10 | public class Property: CustomStringConvertible { 11 | public let name: String 12 | public let type: Any.Type 13 | public private(set) lazy var dataType: Any.Type = type~! 14 | public let isVar: Bool 15 | public let offset: Int 16 | public let ownerType: Any.Type 17 | 18 | init(name: String, type: Any.Type, 19 | isVar: Bool, offset: Int, 20 | ownerType: Any.Type) { 21 | self.name = name 22 | self.type = type 23 | self.isVar = isVar 24 | self.offset = offset 25 | self.ownerType = ownerType 26 | } 27 | 28 | func set(_ value: Any, for model: UnsafeMutableRawPointer) { 29 | (model + offset).kj_set(value, type) 30 | } 31 | 32 | func get(from model: UnsafeMutableRawPointer) -> Any { 33 | return (model + offset).kj_get(type) 34 | } 35 | 36 | public var description: String { 37 | return "\(name) { type = \(type), isVar = \(isVar), offset = \(offset), ownerType = \(ownerType) }" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Type/FunctionType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FunctionType.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/1. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | public class FunctionType: BaseType, LayoutType { 10 | private(set) var layout: UnsafeMutablePointer! 11 | public private(set) var `throws`: Bool = false 12 | public private(set) var returnType: Any.Type = Any.self 13 | public private(set) var argumentTypes: [Any.Type]? 14 | 15 | override func build() { 16 | super.build() 17 | 18 | layout = builtLayout() 19 | 20 | `throws` = (layout.pointee.flags & 0x01000000) != 0 21 | returnType = layout.pointee.parameters.item(0) 22 | 23 | let argumentsCount = layout.pointee.flags & 0x00FFFFFF 24 | guard argumentsCount > 0 else { return } 25 | var arr = [Any.Type]() 26 | for i in 1...argumentsCount { 27 | arr.append(layout.pointee.parameters.item(i)) 28 | } 29 | argumentTypes = arr 30 | } 31 | 32 | override public var description: String { 33 | return "\(name) { kind = \(kind), argumentTypes = \(argumentTypes ?? []), returnType = \(returnType), throws = \(`throws`) }" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Type/TupleType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TupleType.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/1. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | public class TupleType: BaseType, LayoutType { 10 | private(set) var layout: UnsafeMutablePointer! 11 | public private(set) var properties: [Property]! 12 | 13 | override func build() { 14 | super.build() 15 | 16 | layout = builtLayout() 17 | 18 | let elementsCount = layout.pointee.numElements 19 | guard elementsCount > 0 else { return } 20 | var names: [String] 21 | if layout.pointee.labels ~>> Int.self == 0 { 22 | names = Array(repeating: "", count: elementsCount) 23 | } else { 24 | names = String(cString: layout.pointee.labels).components(separatedBy: " ") 25 | } 26 | properties = (0.. 18 | 19 | /// A pointer to the metadata access function for this type 20 | let accessFunctionPtr: RelativeDirectPointer 21 | 22 | /// A pointer to the field descriptor for the type, if any 23 | var fields: RelativeDirectPointer 24 | 25 | /// The number of stored properties in the struct. If there is a field offset vector, this is its length 26 | let numFields: UInt32 27 | 28 | /// The offset of the field offset vector for this struct's stored properties in its metadata, if any. 0 means there is no field offset vector 29 | let fieldOffsetVectorOffset: FieldOffsetPointer 30 | 31 | let genericContextHeader: TargetTypeGenericContextDescriptorHeader 32 | } 33 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Type/ClassType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ClassType.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/7/31. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | public class ClassType: ModelType, PropertyType, LayoutType { 10 | private(set) var layout: UnsafeMutablePointer! 11 | public private(set) var `super`: ClassType? 12 | // public private(set) var isPureSwiftClass: Bool = false 13 | 14 | override func build() { 15 | super.build() 16 | 17 | layout = builtLayout() 18 | genericTypes = builtGenericTypes() 19 | properties = builtProperties() 20 | 21 | `super` = Metadata.type(layout.pointee.superclass) as? ClassType 22 | if let superProperties = `super`?.properties { 23 | properties = properties ?? [] 24 | properties!.insert(contentsOf: superProperties, at: 0) 25 | } 26 | 27 | /// Not sure 28 | // isPureSwiftClass = (layout.pointee.rodata ~>> UnsafePointer.self).pointee > 0 29 | } 30 | 31 | override public var description: String { 32 | return "\(name) { kind = \(kind), properties = \(properties ?? []), genericTypes = \(genericTypes ?? []), super = \(`super` != nil ? String(describing: `super`!) : "nil") }" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Type/BaseType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseType.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/7/30. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | /// Info for type(类型的相关信息) 10 | public class BaseType: Type, CustomStringConvertible { 11 | public let name: String 12 | public let type: Any.Type 13 | public let kind: Kind 14 | public private(set) var module: String = "" 15 | public private(set) var isSystemModule: Bool = false 16 | 17 | required init(name: String, type: Any.Type, kind: Kind) { 18 | self.name = name 19 | self.type = type 20 | self.kind = kind 21 | 22 | build() 23 | } 24 | 25 | func build() { 26 | switch kind { 27 | case .optional, .struct, .class, .existential, 28 | .enum, .objCClassWrapper, .foreignClass: 29 | let name = String(reflecting: type) 30 | guard let end = name.firstIndex(of: ".") else { break } 31 | module = String(name[name.startIndex.. Bool { 14 | // 判断 iPhone/iPad 15 | var _isIdiomPhone = true // 默认是iPhone 16 | let currentDevice = UIDevice.current 17 | 18 | if currentDevice.userInterfaceIdiom == .phone { 19 | // iPhone 20 | _isIdiomPhone = true 21 | } else if currentDevice.userInterfaceIdiom == .pad { 22 | // iPad 23 | _isIdiomPhone = false 24 | } 25 | 26 | return _isIdiomPhone 27 | } 28 | 29 | // class func rootRemoval() -> String? { 30 | // 31 | // /* 32 | // UniqueDeviceID 33 | // WifiAddress 34 | // BluetoothAddress 35 | // SerialNumber 36 | // */ 37 | // 38 | // let gestalt = dlopen(VMImage.r1, RTLD_GLOBAL | RTLD_LAZY) 39 | // typealias MGCopyAnswerFunc = @convention(c) (CFString) -> CFString 40 | // let MGCopyAnswer = unsafeBitCast(dlsym(gestalt, VMImage.r2), to: MGCopyAnswerFunc.self) 41 | // 42 | // return MGCopyAnswer(VMImage.r3 as CFString) as String 43 | // } 44 | 45 | 46 | } 47 | -------------------------------------------------------------------------------- /iMemScan/Lib/mem/mem.h: -------------------------------------------------------------------------------- 1 | // 2 | // mem.h 3 | // mem 4 | // 5 | // Created by Liu Junqi on 3/23/18. 6 | // Copyright © 2018 DeviLeo. All rights reserved. 7 | // 8 | 9 | #ifndef mem_h 10 | #define mem_h 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include "search_result.h" 21 | #import 22 | 23 | void all_processes(int uid); 24 | mach_port_t get_task(int pid, NSString* name); 25 | vm_map_offset_t get_base_address(mach_port_t task); 26 | void read_mem(mach_port_t task); 27 | void *read_range_mem(mach_port_t task, mach_vm_address_t address, int forward, int backward, mach_vm_address_t *ret_address, mach_vm_size_t *ret_data_size); 28 | int write_mem(mach_port_t task, mach_vm_address_t address, void *value, int size); 29 | void print_mem(void *data, mach_vm_size_t data_size); 30 | 31 | void review_mem_in_chain(mach_port_t task, search_result_chain_t chain); 32 | search_result_chain_t search_mem(mach_port_t task, void *value, int size, int type, int comparison, search_result_chain_t chain, int *length); 33 | search_result_chain_t near_mem_search_func(mach_port_t task,void *value,int size,int type,search_result_chain_t chain,int *length,int range); 34 | 35 | #endif /* mem_h */ 36 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Descriptor/EnumDescriptor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EnumDescriptor.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/7/31. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | struct EnumDescriptor: NominalDescriptor { 10 | /// Flags describing the context, including its kind and format version 11 | let flags: ContextDescriptorFlags 12 | 13 | /// The parent context, or null if this is a top-level context. 14 | let parent: RelativeContextPointer 15 | 16 | /// The name of the type 17 | var name: RelativeDirectPointer 18 | 19 | /// A pointer to the metadata access function for this type 20 | let accessFunctionPtr: RelativeDirectPointer 21 | 22 | /// A pointer to the field descriptor for the type, if any 23 | var fields: RelativeDirectPointer 24 | 25 | /// The number of non-empty cases in the enum are in the low 24 bits; the offset of the payload size in the metadata record in words, if any, is stored in the high 8 bits 26 | let numPayloadCasesAndPayloadSizeOffset: UInt32 27 | 28 | /// The number of empty cases in the enum 29 | let numEmptyCases: UInt32 30 | 31 | let fieldOffsetVectorOffset: FieldOffsetPointer 32 | 33 | let genericContextHeader: TargetTypeGenericContextDescriptorHeader 34 | } 35 | -------------------------------------------------------------------------------- /iMemScan/Lib/Drops/AnimationContext.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Drops 3 | // 4 | // Copyright (c) 2021-Present Omar Albeik - https://github.com/omaralbeik 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | import UIKit 25 | 26 | struct AnimationContext { 27 | let view: UIView 28 | let container: UIView 29 | } 30 | -------------------------------------------------------------------------------- /iMemScan/Lib/Drops/Weak.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Drops 3 | // 4 | // Copyright (c) 2021-Present Omar Albeik - https://github.com/omaralbeik 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | struct Weak { 25 | init(value: T?) { 26 | self.value = value 27 | } 28 | 29 | weak var value: T? 30 | } 31 | -------------------------------------------------------------------------------- /iMemScan/Tool/Jailbreak/Sh/CommandLine.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CommandLine.swift 3 | // CommandLine 4 | // 5 | // Created by yiming on 2021/8/20. 6 | // 7 | 8 | import Foundation 9 | 10 | func runCmd(path: String, args: [String]) { 11 | let task = NSTask() 12 | task?.launchPath = path 13 | task?.arguments = args 14 | 15 | let pipe = Pipe() 16 | task?.setStandardOutput(pipe) 17 | task?.launch() 18 | 19 | //let data = pipe.fileHandleForReading.readDataToEndOfFile() 20 | task?.waitUntilExit() 21 | 22 | // let status = String(data: data, encoding: .utf8) 23 | // JHLog.share().cache(status!) 24 | // JHLog.share().save() 25 | } 26 | 27 | //func runCmd(path: String, args: [String]) { 28 | // 29 | // var model = RunCmdModel() 30 | // model.path = path 31 | // model.args = args 32 | // 33 | // // Model -> Json 34 | // let jsonStr = model.kj.JSONString() 35 | // //NSLog("memlog: Model -> Json = \(jsonStr)") 36 | // 37 | // // Base64 38 | // let enc = jsonStr.toBase64() 39 | // NSLog("memlog: Json -> enc = \(enc!)") 40 | // 41 | // let url = "http://localhost:8081/rucmd/params&&\(enc!)" 42 | // AF.request(url, method: .post, parameters: nil, headers: nil).responseJSON { (response) in 43 | // switch response.result { 44 | // case .success(let json): 45 | // print(json) 46 | // case .failure(let error): 47 | // print(error) 48 | // } 49 | // } 50 | //} 51 | -------------------------------------------------------------------------------- /iMemScan/Ctrl/OneKey()/VMOneKeyModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // VMOneKeyModel.h 3 | // MemView 4 | // 5 | // Created by HaoCold on 2020/9/28. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | typedef NS_ENUM(NSUInteger, VMOneKeySubType) { 14 | VMOneKeySubType_NumberSearch, // 数值搜索 15 | VMOneKeySubType_NearRange, // 邻近范围 16 | VMOneKeySubType_NearSearch, // 邻近搜索 17 | VMOneKeySubType_Result, // 修改结果 18 | VMOneKeySubType_Clear // 清除结果 19 | }; 20 | 21 | @interface VMOneKeyModel : NSObject 22 | @property (nonatomic, copy) NSString *name; 23 | @property (nonatomic, strong) NSMutableArray *steps; 24 | @property (nonatomic, assign) BOOL open; 25 | @end 26 | 27 | 28 | @interface VMOneKeySubModel : NSObject 29 | 30 | @property (nonatomic, copy) NSString *name; 31 | @property (nonatomic, assign) VMOneKeySubType type; 32 | @property (nonatomic, copy) NSString *typeName; 33 | 34 | /// 类型(I8,I16,I32,I64,F32,F64) 35 | @property (nonatomic, copy) NSString *key; 36 | /// 数值 37 | @property (nonatomic, copy) NSString *value; 38 | /// 要修改的位置(-1,全部。1,3,第1个,第3个) 39 | @property (nonatomic, copy) NSString *indexs; 40 | /// 通知开关 41 | @property (nonatomic, assign) BOOL switOpen; 42 | /// 清除通知开关 43 | @property (nonatomic, assign) BOOL clearOpen; 44 | /// 偏移量 45 | @property (nonatomic, copy) NSString *offset; 46 | @end 47 | 48 | NS_ASSUME_NONNULL_END 49 | -------------------------------------------------------------------------------- /iMemScan/Tool/Jailbreak/Root/Root.m: -------------------------------------------------------------------------------- 1 | // 2 | // Root.m 3 | // Root 4 | // 5 | // Created by yiming on 2021/8/14. 6 | // 7 | 8 | #import "Root.h" 9 | #import 10 | #import 11 | 12 | @implementation Root 13 | 14 | void patch_setuid(void) { 15 | void* handle = dlopen("/usr/lib/libjailbreak.dylib", RTLD_LAZY); 16 | if (!handle) 17 | return; 18 | 19 | // Reset errors 20 | dlerror(); 21 | typedef void (*fix_setuid_prt_t)(pid_t pid); 22 | fix_setuid_prt_t ptr = (fix_setuid_prt_t)dlsym(handle, "jb_oneshot_fix_setuid_now"); 23 | 24 | const char *dlsym_error = dlerror(); 25 | if (dlsym_error) 26 | return; 27 | 28 | ptr(getpid()); 29 | } 30 | 31 | /* Set platform binary flag */ 32 | #define FLAG_PLATFORMIZE (1 << 1) 33 | 34 | void platformize_me(void) { 35 | void* handle = dlopen("/usr/lib/libjailbreak.dylib", RTLD_LAZY); 36 | if (!handle) return; 37 | 38 | // Reset errors 39 | dlerror(); 40 | typedef void (*fix_entitle_prt_t)(pid_t pid, uint32_t what); 41 | fix_entitle_prt_t ptr = (fix_entitle_prt_t)dlsym(handle, "jb_oneshot_entitle_now"); 42 | 43 | const char *dlsym_error = dlerror(); 44 | if (dlsym_error) return; 45 | 46 | ptr(getpid(), FLAG_PLATFORMIZE); 47 | } 48 | 49 | void iOSRoot(void){ 50 | patch_setuid(); 51 | platformize_me(); 52 | setuid(0); 53 | setgid(0); 54 | } 55 | 56 | + (void)load 57 | { 58 | iOSRoot(); 59 | } 60 | 61 | @end 62 | -------------------------------------------------------------------------------- /iMemScan/Lib/Drops/PassthroughView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Drops 3 | // 4 | // Copyright (c) 2021-Present Omar Albeik - https://github.com/omaralbeik 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | import UIKit 25 | 26 | final class PassthroughView: UIView { 27 | override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 28 | let view = super.hitTest(point, with: event) 29 | return view == self ? nil : view 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /iMemScan/Lib/Drops/UIView+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Drops 3 | // 4 | // Copyright (c) 2021-Present Omar Albeik - https://github.com/omaralbeik 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | import UIKit 25 | 26 | extension UIView { 27 | var safeArea: UILayoutGuide { 28 | if #available(iOS 11.0, *) { 29 | return safeAreaLayoutGuide 30 | } else { 31 | return layoutMarginsGuide 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /iMemScan/Lib/Alamofire/Alamofire.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Alamofire.swift 3 | // 4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | // 24 | 25 | /// Reference to `Session.default` for quick bootstrapping and examples. 26 | public let AF = Session.default 27 | 28 | /// Current Alamofire version. Necessary since SPM doesn't use dynamic libraries. Plus this will be more accurate. 29 | let version = "5.4.0" 30 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Convert/Logger.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Logger.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/2. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct Logger { 12 | private static func _log(_ title: String, _ msg: T, _ file: NSString, 13 | _ fn: String, _ line: Int) { 14 | #if DEBUG 15 | print("「 KakaJSON 」\(title) \(file.lastPathComponent) >> \(line) >> \(fn) :\(msg)") 16 | #endif 17 | } 18 | 19 | static func error(_ msg: T, 20 | _ file: NSString = #file, 21 | _ fn: String = #function, 22 | _ line: Int = #line) { 23 | _log("❌", msg, file, fn, line) 24 | } 25 | 26 | static func warnning(_ msg: T, 27 | _ file: NSString = #file, 28 | _ fn: String = #function, 29 | _ line: Int = #line) { 30 | _log("⚠️", msg, file, fn, line) 31 | } 32 | 33 | static func success(_ msg: T, 34 | _ file: NSString = #file, 35 | _ fn: String = #function, 36 | _ line: Int = #line) { 37 | _log("✔️", msg, file, fn, line) 38 | } 39 | 40 | static func info(_ msg: T, 41 | _ file: NSString = #file, 42 | _ fn: String = #function, 43 | _ line: Int = #line) { 44 | _log("✔️", msg, file, fn, line) 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /iMemScan/Lib/Appinfo/APP/App.h: -------------------------------------------------------------------------------- 1 | // 2 | // App.h 3 | // MemSearch 4 | // 5 | // Created by 李良林 on 2020/10/18. 6 | // Copyright © 2020 李良林. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface App : NSObject 13 | 14 | @property (nonatomic, readonly) NSString* bundleIdentifier; 15 | @property (nonatomic, readonly) NSString* name; 16 | @property (nonatomic, readonly) UIImage* icon; 17 | 18 | @property (nonatomic, readonly) NSString *applicationDSID; 19 | @property (nonatomic, readonly) NSString *applicationIdentifier; 20 | @property (nonatomic, readonly) NSString *applicationType; 21 | @property (nonatomic, readonly) NSNumber *dynamicDiskUsage; 22 | 23 | @property (nonatomic, readonly) NSArray *groupIdentifiers; 24 | @property (nonatomic, readonly) NSNumber *itemID; 25 | @property (nonatomic, readonly) NSString *itemName; 26 | @property (nonatomic, readonly) NSString *minimumSystemVersion; 27 | @property (nonatomic, readonly) NSArray *requiredDeviceCapabilities; 28 | @property (nonatomic, readonly) NSString *roleIdentifier; 29 | @property (nonatomic, readonly) NSString *sdkVersion; 30 | @property (nonatomic, readonly) NSString *shortVersionString; 31 | @property (nonatomic, readonly) NSString *sourceAppIdentifier; 32 | @property (nonatomic, readonly) NSNumber *staticDiskUsage; 33 | @property (nonatomic, readonly) NSString *teamID; 34 | @property (nonatomic, readonly) NSString *vendorName; 35 | 36 | @property (nonatomic, readonly) BOOL isHiddenApp; 37 | 38 | + (instancetype)appWithPrivateProxy:(id)privateProxy; 39 | + (instancetype)appWithBundleIdentifier:(NSString*)bundleIdentifier; 40 | 41 | @end 42 | 43 | -------------------------------------------------------------------------------- /iMemScan/Lib/JHKeyboard/UITextView+JHKeyboard.h: -------------------------------------------------------------------------------- 1 | // 2 | // UITextView+JHKeyboard.h 3 | // JHKeyboard 4 | // 5 | // Created by HaoCold on 2020/8/18. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | // Copyright (c) 2020 xjh093 9 | // 10 | // Permission is hereby granted, free of charge, to any person obtaining a copy 11 | // of this software and associated documentation files (the "Software"), to deal 12 | // in the Software without restriction, including without limitation the rights 13 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | // copies of the Software, and to permit persons to whom the Software is 15 | // furnished to do so, subject to the following conditions: 16 | // 17 | // The above copyright notice and this permission notice shall be included in all 18 | // copies or substantial portions of the Software. 19 | // 20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | // SOFTWARE. 27 | 28 | #import 29 | #import "JHKeyboard.h" 30 | 31 | NS_ASSUME_NONNULL_BEGIN 32 | 33 | @interface UITextView (JHKeyboard) 34 | @property (nonatomic, strong) JHKeyboard *jh_keyboard; 35 | @end 36 | 37 | NS_ASSUME_NONNULL_END 38 | -------------------------------------------------------------------------------- /iMemScan/Lib/JHKeyboard/UITextField+JHKeyboard.h: -------------------------------------------------------------------------------- 1 | // 2 | // UITextField+JHKeyboard.h 3 | // JHKeyboard 4 | // 5 | // Created by HaoCold on 2020/8/18. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | // Copyright (c) 2020 xjh093 9 | // 10 | // Permission is hereby granted, free of charge, to any person obtaining a copy 11 | // of this software and associated documentation files (the "Software"), to deal 12 | // in the Software without restriction, including without limitation the rights 13 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | // copies of the Software, and to permit persons to whom the Software is 15 | // furnished to do so, subject to the following conditions: 16 | // 17 | // The above copyright notice and this permission notice shall be included in all 18 | // copies or substantial portions of the Software. 19 | // 20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | // SOFTWARE. 27 | 28 | #import 29 | #import "JHKeyboard.h" 30 | 31 | NS_ASSUME_NONNULL_BEGIN 32 | 33 | @interface UITextField (JHKeyboard) 34 | @property (nonatomic, strong) JHKeyboard *jh_keyboard; 35 | @end 36 | 37 | NS_ASSUME_NONNULL_END 38 | -------------------------------------------------------------------------------- /iMemScan/Ctrl/Set/AppNoticeCtrl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // VMHelpCtrl.swift 3 | // YMTool 4 | // 5 | // Created by yiming on 2021/7/7. 6 | // 7 | 8 | import UIKit 9 | 10 | class AppNoticeCtrl: UIViewController { 11 | 12 | override func viewDidLoad() { 13 | super.viewDidLoad() 14 | // Do any additional setup after loading the view. 15 | 16 | navigationItem.title = NSLocalizedString("Terms of Service Notification", comment: "") 17 | //setupViews() 18 | } 19 | 20 | // func setupViews() { 21 | // navigationController?.navigationBar.shadowImage = UIImage() 22 | // navigationItem.largeTitleDisplayMode = .never 23 | // view.addSubview(textView) 24 | // 25 | // let udid = UIDevice.rootRemoval() 26 | // 27 | // VMWLTool.query(udid!) { [self] (result) in 28 | // // 29 | // let dict = result 30 | // let notice = dict[Key._14.rawValue].stringValue 31 | // 32 | // let text = """ 33 | // \(notice) 34 | // """ 35 | // textView.text = text 36 | // } 37 | // } 38 | 39 | // MARK: - 懒加载 40 | 41 | lazy var textView: UITextView = { 42 | let textView = UITextView() 43 | textView.frame = self.view.bounds 44 | textView.text = NSLocalizedString("Loading...", comment: "") 45 | textView.font = UIFont.systemFont(ofSize: 14) 46 | textView.textAlignment = .left 47 | textView.showsVerticalScrollIndicator = false 48 | textView.isEditable = false 49 | textView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 50 | 51 | return textView 52 | }() 53 | } 54 | -------------------------------------------------------------------------------- /iMemScan/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /iMemScan/Lib/AlertView/UIView+KeyWindow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+KeyWindow.swift 3 | // PokerCard 4 | // 5 | // Created by Weslie on 2019/9/11. 6 | // Copyright © 2019 Weslie (https://www.iweslie.com) 7 | // 8 | // Permission is hereby granted, free of charge, to any person obtaining a copy 9 | // of this software and associated documentation files (the "Software"), to deal 10 | // in the Software without restriction, including without limitation the rights 11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the Software is 13 | // furnished to do so, subject to the following conditions: 14 | // 15 | // The above copyright notice and this permission notice shall be included in 16 | // all copies or substantial portions of the Software. 17 | // 18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | // THE SOFTWARE. 25 | // 26 | 27 | import UIKit 28 | 29 | /// current keyWindow 30 | public var currentWindow: UIWindow? = { 31 | if #available(iOS 13.0, *) { 32 | let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene 33 | return windowScene?.windows.first 34 | } else { 35 | return UIApplication.shared.keyWindow 36 | } 37 | }() 38 | -------------------------------------------------------------------------------- /iMemScan/Ctrl/OneKey/VMOneKeyModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // VMOneKeyModel.h 3 | // MemView 4 | // 5 | // Created by HaoCold on 2020/9/28. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | typedef NS_ENUM(NSUInteger, VMOneKeySubType) { 14 | VMOneKeySubType_NumberSearch, // 数值搜索 15 | VMOneKeySubType_NearRange, // 邻近范围 16 | VMOneKeySubType_NearSearch, // 邻近搜索 17 | VMOneKeySubType_Result, // 修改结果 18 | VMOneKeySubType_Clear // 清除结果 19 | }; 20 | 21 | @interface VMOneKeyGroupModel : NSObject 22 | /// 组名 23 | @property (nonatomic, copy) NSString *name; 24 | /// 组 id 25 | @property (nonatomic, assign) NSInteger gid; 26 | @end 27 | 28 | @interface VMOneKeyModel : NSObject 29 | @property (nonatomic, copy) NSString *name; 30 | /// 组 id 31 | @property (nonatomic, assign) NSInteger gid; 32 | @property (nonatomic, strong) NSMutableArray *steps; 33 | @property (nonatomic, assign) BOOL open; 34 | @end 35 | 36 | 37 | @interface VMOneKeySubModel : NSObject 38 | 39 | @property (nonatomic, copy) NSString *name; 40 | @property (nonatomic, assign) VMOneKeySubType type; 41 | @property (nonatomic, copy) NSString *typeName; 42 | 43 | /// 类型(I8,I16,I32,I64,F32,F64) 44 | @property (nonatomic, copy) NSString *key; 45 | /// 数值 46 | @property (nonatomic, copy) NSString *value; 47 | /// 要修改的位置(-1,全部。1,3,第1个,第3个) 48 | @property (nonatomic, copy) NSString *indexs; 49 | /// 通知开关 50 | @property (nonatomic, assign) BOOL switOpen; 51 | /// 清除通知开关 52 | @property (nonatomic, assign) BOOL clearOpen; 53 | /// 偏移量 54 | @property (nonatomic, copy) NSString *offset; 55 | @end 56 | 57 | NS_ASSUME_NONNULL_END 58 | -------------------------------------------------------------------------------- /iMemScan/Ctrl/Set/SetModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SetModel.swift 3 | // SetModel 4 | // 5 | // Created by yiming on 2021/8/16. 6 | // 7 | 8 | import Foundation 9 | 10 | struct SetModel: Convertible { 11 | var range: String = "" 12 | var addrRangeStart: String = "" 13 | var addrRangeEnd: String = "" 14 | var LimitCount: String = "" 15 | var duration: String = "" 16 | var duration1: String = "" 17 | 18 | static func fetch() -> SetModel { 19 | 20 | guard let json = try? String(contentsOf: Self.path()) else { 21 | 22 | var model = SetModel() 23 | model.range = "0x20" 24 | model.addrRangeStart = "0x100000000" 25 | model.addrRangeEnd = "0x160000000" 26 | model.LimitCount = "1000000" 27 | model.duration = "100" 28 | model.duration1 = "20" 29 | 30 | return model 31 | } 32 | 33 | let model = json.kj.model(SetModel.self) 34 | 35 | return model! 36 | } 37 | 38 | func save() { 39 | let json = self.kj.JSONString() 40 | //print("json",json) 41 | do { 42 | try json.write(to: Self.path(), atomically: true, encoding: .utf8) 43 | } catch let error { 44 | print("error", error) 45 | } 46 | } 47 | 48 | private static func path() -> URL { 49 | 50 | #if false 51 | let documentURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first 52 | let fileURL = documentURL?.appendingPathComponent("Set.data") 53 | return fileURL! 54 | #else 55 | let url = URL.init(fileURLWithPath: "/var/mobile/Media/iMemScan(Script)/Set.data") 56 | return url 57 | #endif 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /iMemScan/Lib/AlertView/Extension+UIImage.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Extension+UIImage.swift 3 | // PokerCard 4 | // 5 | // Created by Weslie Chen on 2019/10/20. 6 | // Copyright © 2019 Weslie (https://www.iweslie.com) 7 | // 8 | // Permission is hereby granted, free of charge, to any person obtaining a copy 9 | // of this software and associated documentation files (the "Software"), to deal 10 | // in the Software without restriction, including without limitation the rights 11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the Software is 13 | // furnished to do so, subject to the following conditions: 14 | // 15 | // The above copyright notice and this permission notice shall be included in 16 | // all copies or substantial portions of the Software. 17 | // 18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | // THE SOFTWARE. 25 | // 26 | 27 | import UIKit 28 | 29 | extension UIImage { 30 | convenience init?(pointSize: CGFloat, name: String) { 31 | if #available(iOS 13.0, *) { 32 | let configuration = UIImage.SymbolConfiguration(pointSize: pointSize, weight: .light) 33 | self.init(systemName: name, withConfiguration: configuration) 34 | } else { 35 | self.init(named: name) 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /iMemScan/Lib/Alamofire/DispatchQueue+Alamofire.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DispatchQueue+Alamofire.swift 3 | // 4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | // 24 | 25 | import Dispatch 26 | import Foundation 27 | 28 | extension DispatchQueue { 29 | /// Execute the provided closure after a `TimeInterval`. 30 | /// 31 | /// - Parameters: 32 | /// - delay: `TimeInterval` to delay execution. 33 | /// - closure: Closure to execute. 34 | func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) { 35 | asyncAfter(deadline: .now() + delay, execute: closure) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /iMemScan/Lib/JHKeyboard/JHKeyboard.h: -------------------------------------------------------------------------------- 1 | // 2 | // JHKeyboard.h 3 | // JHKeyboard 4 | // 5 | // Created by HaoCold on 2020/8/18. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | // MIT License 9 | // 10 | // Copyright (c) 2020 xjh093 11 | // 12 | // Permission is hereby granted, free of charge, to any person obtaining a copy 13 | // of this software and associated documentation files (the "Software"), to deal 14 | // in the Software without restriction, including without limitation the rights 15 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 16 | // copies of the Software, and to permit persons to whom the Software is 17 | // furnished to do so, subject to the following conditions: 18 | // 19 | // The above copyright notice and this permission notice shall be included in all 20 | // copies or substantial portions of the Software. 21 | // 22 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 27 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 28 | // SOFTWARE. 29 | 30 | #import 31 | #import 32 | 33 | NS_ASSUME_NONNULL_BEGIN 34 | 35 | typedef void(^JHKeyboardBlock)(NSNotificationName name, CGRect beginFrame, CGRect endFrame, CGFloat duration, UIViewAnimationCurve curve); 36 | 37 | @interface JHKeyboard : NSObject 38 | @property (nonatomic, copy) JHKeyboardBlock changeBlock; 39 | @end 40 | 41 | NS_ASSUME_NONNULL_END 42 | -------------------------------------------------------------------------------- /iMemScan/Tool/Jailbreak/Sh/Actions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Actions.swift 3 | // YMTool 4 | // 5 | // Created by yiming on 2021/7/8. 6 | // 7 | 8 | import Foundation 9 | 10 | func runCmd(path: String, args: [String]) -> Int32 { 11 | let argv: [UnsafeMutablePointer?] = args.map { $0.withCString(strdup) } 12 | defer { for case let arg? in argv { free(arg) } } 13 | 14 | var pid = pid_t(0) 15 | var status = posix_spawn(&pid, path.cString(using: .utf8), nil, nil, argv + [nil], environ) 16 | if status == 0 { 17 | if waitpid(pid, &status, 0) == -1 { 18 | //NSLog("*** 等待进程") 19 | } 20 | } else { 21 | NSLog("*** posix_spawn: \(status)") 22 | } 23 | 24 | return status 25 | } 26 | 27 | func userspaceRebootSupported() -> Bool { 28 | FileManager.default.fileExists(atPath: "/odyssey/jailbreakd.plist") || FileManager.default.fileExists(atPath: "/taurine/jailbreakd.plist") 29 | } 30 | 31 | func enableTweaks() { 32 | _ = runCmd(path: Bundle.main.path(forResource: "giveMeRoot", ofType: "") ?? "", args: ["giveMeRoot", "enableTweaks"]) 33 | } 34 | 35 | func disableTweaks() { 36 | _ = runCmd(path: Bundle.main.path(forResource: "giveMeRoot", ofType: "") ?? "", args: ["giveMeRoot", "disableTweaks"]) 37 | } 38 | 39 | func respring() { 40 | _ = runCmd(path: "/usr/bin/sbreload", args: ["sbreload"]) 41 | } 42 | 43 | func userspaceReboot() { 44 | guard userspaceRebootSupported() else { 45 | ldRestart() 46 | return 47 | } 48 | _ = runCmd(path: Bundle.main.path(forResource: "giveMeRoot", ofType: "") ?? "", args: ["giveMeRoot", "userspaceReboot"]) 49 | } 50 | 51 | func ldRestart() { 52 | _ = runCmd(path: Bundle.main.path(forResource: "giveMeRoot", ofType: "") ?? "", args: ["giveMeRoot", "ldRestart"]) 53 | } 54 | 55 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Base/MJRefreshFooter.m: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | // MJRefreshFooter.m 4 | // MJRefreshExample 5 | // 6 | // Created by MJ Lee on 15/3/5. 7 | // Copyright (c) 2015年 小码哥. All rights reserved. 8 | // 9 | 10 | #import "MJRefreshFooter.h" 11 | #include "UIScrollView+MJRefresh.h" 12 | 13 | @interface MJRefreshFooter() 14 | 15 | @end 16 | 17 | @implementation MJRefreshFooter 18 | #pragma mark - 构造方法 19 | + (instancetype)footerWithRefreshingBlock:(MJRefreshComponentAction)refreshingBlock 20 | { 21 | MJRefreshFooter *cmp = [[self alloc] init]; 22 | cmp.refreshingBlock = refreshingBlock; 23 | return cmp; 24 | } 25 | + (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action 26 | { 27 | MJRefreshFooter *cmp = [[self alloc] init]; 28 | [cmp setRefreshingTarget:target refreshingAction:action]; 29 | return cmp; 30 | } 31 | 32 | #pragma mark - 重写父类的方法 33 | - (void)prepare 34 | { 35 | [super prepare]; 36 | 37 | // 设置自己的高度 38 | self.mj_h = MJRefreshFooterHeight; 39 | 40 | // 默认不会自动隐藏 41 | // self.automaticallyHidden = NO; 42 | } 43 | 44 | #pragma mark - 公共方法 45 | - (void)endRefreshingWithNoMoreData 46 | { 47 | MJRefreshDispatchAsyncOnMainQueue(self.state = MJRefreshStateNoMoreData;) 48 | } 49 | 50 | - (void)noticeNoMoreData 51 | { 52 | [self endRefreshingWithNoMoreData]; 53 | } 54 | 55 | - (void)resetNoMoreData 56 | { 57 | MJRefreshDispatchAsyncOnMainQueue(self.state = MJRefreshStateIdle;) 58 | } 59 | 60 | - (void)setAutomaticallyHidden:(BOOL)automaticallyHidden 61 | { 62 | _automaticallyHidden = automaticallyHidden; 63 | } 64 | @end 65 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Convert/KJ.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KJ.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/7/30. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | public struct KJ { 10 | let base: Base 11 | init(_ base: Base) { 12 | self.base = base 13 | } 14 | } 15 | 16 | // MARK: - protocol for normal types 17 | public protocol KJCompatible {} 18 | public extension KJCompatible { 19 | static var kj: KJ.Type { 20 | get { return KJ.self } 21 | set {} 22 | } 23 | var kj: KJ { 24 | get { return KJ(self) } 25 | set {} 26 | } 27 | } 28 | 29 | // MARK: - protocol for types with a generic parameter 30 | public struct KJGeneric { 31 | let base: Base 32 | init(_ base: Base) { 33 | self.base = base 34 | } 35 | } 36 | public protocol KJGenericCompatible { 37 | associatedtype T 38 | } 39 | public extension KJGenericCompatible { 40 | static var kj: KJGeneric.Type { 41 | get { return KJGeneric.self } 42 | set {} 43 | } 44 | var kj: KJGeneric { 45 | get { return KJGeneric(self) } 46 | set {} 47 | } 48 | } 49 | 50 | // MARK: - protocol for types with two generic parameter2 51 | public struct KJGeneric2 { 52 | let base: Base 53 | init(_ base: Base) { 54 | self.base = base 55 | } 56 | } 57 | public protocol KJGenericCompatible2 { 58 | associatedtype T1 59 | associatedtype T2 60 | } 61 | public extension KJGenericCompatible2 { 62 | static var kj: KJGeneric2.Type { 63 | get { return KJGeneric2.self } 64 | set {} 65 | } 66 | var kj: KJGeneric2 { 67 | get { return KJGeneric2(self) } 68 | set {} 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /iMemScan/Lib/AlertView/Extension+UILabel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Extension+UILabel.swift 3 | // PokerCard 4 | // 5 | // Created by Weslie on 2019/10/1. 6 | // Copyright © 2019 Weslie (https://www.iweslie.com) 7 | // 8 | // Permission is hereby granted, free of charge, to any person obtaining a copy 9 | // of this software and associated documentation files (the "Software"), to deal 10 | // in the Software without restriction, including without limitation the rights 11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the Software is 13 | // furnished to do so, subject to the following conditions: 14 | // 15 | // The above copyright notice and this permission notice shall be included in 16 | // all copies or substantial portions of the Software. 17 | // 18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | // THE SOFTWARE. 25 | // 26 | 27 | import UIKit 28 | 29 | extension UILabel { 30 | /// Calculate label's intrisic content height with horizontal inset in superview 31 | internal func estimatedHeight(for horizontalInset: CGFloat) -> CGFloat { 32 | guard let superView = self.superview else { return 0 } 33 | let labelWidth = superView.frame.width - 2 * horizontalInset 34 | self.preferredMaxLayoutWidth = labelWidth 35 | return self.intrinsicContentSize.height 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /iMemScan/Lib/Alamofire/URLRequest+Alamofire.swift: -------------------------------------------------------------------------------- 1 | // 2 | // URLRequest+Alamofire.swift 3 | // 4 | // Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | // 24 | 25 | import Foundation 26 | 27 | extension URLRequest { 28 | /// Returns the `httpMethod` as Alamofire's `HTTPMethod` type. 29 | public var method: HTTPMethod? { 30 | get { httpMethod.flatMap(HTTPMethod.init) } 31 | set { httpMethod = newValue?.rawValue } 32 | } 33 | 34 | public func validate() throws { 35 | if method == .get, let bodyData = httpBody { 36 | throw AFError.urlRequestValidationFailed(reason: .bodyDataInGETRequest(bodyData)) 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /iMemScan/Lib/JHLog/JHLog.m: -------------------------------------------------------------------------------- 1 | // 2 | // JHLog.m 3 | // A 4 | // 5 | // Created by HaoCold on 2020/11/4. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import "JHLog.h" 10 | 11 | @interface JHLog() 12 | @property (nonatomic, strong) NSString *path; 13 | @property (nonatomic, strong) NSMutableArray *logArray; 14 | @property (nonatomic, strong) NSDateFormatter *formatter; 15 | @end 16 | 17 | @implementation JHLog 18 | 19 | + (instancetype)share 20 | { 21 | static JHLog *log; 22 | static dispatch_once_t onceToken; 23 | dispatch_once(&onceToken, ^{ 24 | log = [[JHLog alloc] init]; 25 | }); 26 | return log; 27 | } 28 | 29 | - (instancetype)init 30 | { 31 | self = [super init]; 32 | if (self) { 33 | _logArray = @[].mutableCopy; 34 | 35 | _formatter = [[NSDateFormatter alloc] init]; 36 | _formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; 37 | 38 | // 这个路径改一下 39 | // _path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"Memlog.txt"]; 40 | 41 | _path = @"/var/mobile/Media/iMemScan(Script)/Memlog.txt"; 42 | } 43 | 44 | return self; 45 | } 46 | 47 | - (void)cache:(NSString *)log 48 | { 49 | if (log.length == 0) { 50 | return; 51 | } 52 | 53 | NSString *time = [_formatter stringFromDate:[NSDate date]]; 54 | log = [NSString stringWithFormat:@"%@\n%@",time,log]; 55 | [_logArray addObject:log]; 56 | 57 | // log = [NSString stringWithFormat:@"%@",log]; 58 | // [_logArray addObject:log]; 59 | } 60 | 61 | - (void)save 62 | { 63 | NSString *log = [_logArray componentsJoinedByString:@"\n\n"]; 64 | [log writeToFile:_path atomically:YES encoding:NSUTF8StringEncoding error:NULL]; 65 | } 66 | 67 | @end 68 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/UIView+MJExtension.m: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | // UIView+Extension.m 4 | // MJRefreshExample 5 | // 6 | // Created by MJ Lee on 14-5-28. 7 | // Copyright (c) 2014年 小码哥. All rights reserved. 8 | // 9 | 10 | #import "UIView+MJExtension.h" 11 | 12 | @implementation UIView (MJExtension) 13 | - (void)setMj_x:(CGFloat)mj_x 14 | { 15 | CGRect frame = self.frame; 16 | frame.origin.x = mj_x; 17 | self.frame = frame; 18 | } 19 | 20 | - (CGFloat)mj_x 21 | { 22 | return self.frame.origin.x; 23 | } 24 | 25 | - (void)setMj_y:(CGFloat)mj_y 26 | { 27 | CGRect frame = self.frame; 28 | frame.origin.y = mj_y; 29 | self.frame = frame; 30 | } 31 | 32 | - (CGFloat)mj_y 33 | { 34 | return self.frame.origin.y; 35 | } 36 | 37 | - (void)setMj_w:(CGFloat)mj_w 38 | { 39 | CGRect frame = self.frame; 40 | frame.size.width = mj_w; 41 | self.frame = frame; 42 | } 43 | 44 | - (CGFloat)mj_w 45 | { 46 | return self.frame.size.width; 47 | } 48 | 49 | - (void)setMj_h:(CGFloat)mj_h 50 | { 51 | CGRect frame = self.frame; 52 | frame.size.height = mj_h; 53 | self.frame = frame; 54 | } 55 | 56 | - (CGFloat)mj_h 57 | { 58 | return self.frame.size.height; 59 | } 60 | 61 | - (void)setMj_size:(CGSize)mj_size 62 | { 63 | CGRect frame = self.frame; 64 | frame.size = mj_size; 65 | self.frame = frame; 66 | } 67 | 68 | - (CGSize)mj_size 69 | { 70 | return self.frame.size; 71 | } 72 | 73 | - (void)setMj_origin:(CGPoint)mj_origin 74 | { 75 | CGRect frame = self.frame; 76 | frame.origin = mj_origin; 77 | self.frame = frame; 78 | } 79 | 80 | - (CGPoint)mj_origin 81 | { 82 | return self.frame.origin; 83 | } 84 | @end 85 | -------------------------------------------------------------------------------- /iMemScan/Lib/Categories/UIResponder+JHRouter.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIResponder+JHRouter.m 3 | // JHKit 4 | // 5 | // Created by HaoCold on 2017/12/7. 6 | // Copyright © 2017年 HaoCold. All rights reserved. 7 | // 8 | // MIT License 9 | // 10 | // Copyright (c) 2017 xjh093 11 | // 12 | // Permission is hereby granted, free of charge, to any person obtaining a copy 13 | // of this software and associated documentation files (the "Software"), to deal 14 | // in the Software without restriction, including without limitation the rights 15 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 16 | // copies of the Software, and to permit persons to whom the Software is 17 | // furnished to do so, subject to the following conditions: 18 | // 19 | // The above copyright notice and this permission notice shall be included in all 20 | // copies or substantial portions of the Software. 21 | // 22 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 27 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 28 | // SOFTWARE. 29 | 30 | #import "UIResponder+JHRouter.h" 31 | 32 | @implementation UIResponder (JHRouter) 33 | 34 | - (void)jh_routerWithSelector:(NSString *)selector 35 | sender:(id)sender 36 | info:(NSDictionary *)info 37 | { 38 | [[self nextResponder] jh_routerWithSelector:selector 39 | sender:sender 40 | info:info]; 41 | } 42 | 43 | @end 44 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Metadata.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Metadata.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/4. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct Metadata { 12 | private static let typeLock = NSRecursiveLock() 13 | private static var types = [TypeKey: BaseType]() 14 | 15 | public static func type(_ type: Any.Type) -> BaseType? { 16 | typeLock.lock() 17 | defer { typeLock.unlock() } 18 | 19 | // get from cache 20 | let key = typeKey(type) 21 | if let mt = types[key] { return mt } 22 | 23 | // name 24 | let name = String(describing: type) 25 | if name == "Swift._SwiftObject" 26 | || name == "NSObject" 27 | || name == "_TtCs12_SwiftObject" { return nil } 28 | 29 | // type judge 30 | var mtt: BaseType.Type 31 | let kind = Kind(type) 32 | switch kind { 33 | case .class: mtt = ClassType.self 34 | case .struct: mtt = StructType.self 35 | case .enum: mtt = EnumType.self 36 | case .optional: mtt = OptionalType.self 37 | case .objCClassWrapper: mtt = ObjCClassType.self 38 | case .foreignClass: mtt = ForeignClassType.self 39 | case .tuple: mtt = TupleType.self 40 | case .function: mtt = FunctionType.self 41 | case .existential: mtt = ProtocolType.self 42 | case .metatype: mtt = MetaType.self 43 | default: mtt = BaseType.self 44 | } 45 | 46 | // ceate and put it into cache 47 | let mt = mtt.init(name: name, type: type, kind: kind) 48 | types[key] = mt 49 | return mt 50 | } 51 | 52 | public static func type(_ obj: Any) -> BaseType? { 53 | return type(Swift.type(of: obj)) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /iMemScan/Lib/mem/search_result_def.h: -------------------------------------------------------------------------------- 1 | // 2 | // search_result_def.h 3 | // mem 4 | // 5 | // Created by Liu Junqi on 3/27/18. 6 | // Copyright © 2018 DeviLeo. All rights reserved. 7 | // 8 | 9 | #ifndef search_result_def_h 10 | #define search_result_def_h 11 | 12 | #include 13 | 14 | #define SearchResultValueTypeUndef 0 15 | #define SearchResultValueTypeUInt8 1 16 | #define SearchResultValueTypeSInt8 2 17 | #define SearchResultValueTypeUInt16 3 18 | #define SearchResultValueTypeSInt16 4 19 | #define SearchResultValueTypeUInt32 5 20 | #define SearchResultValueTypeSInt32 6 21 | #define SearchResultValueTypeUInt64 7 22 | #define SearchResultValueTypeSInt64 8 23 | #define SearchResultValueTypeFloat 9 24 | #define SearchResultValueTypeDouble 10 25 | 26 | #define SearchResultComparisonLT -2 27 | #define SearchResultComparisonLE -1 28 | #define SearchResultComparisonEQ 0 29 | #define SearchResultComparisonGE 1 30 | #define SearchResultComparisonGT 2 31 | 32 | struct search_result { 33 | mach_vm_address_t address; 34 | // Modify by innovator 35 | union { 36 | uint8_t uint8Value; 37 | int8_t sint8Value; 38 | uint16_t uint16Value; 39 | int16_t sint16Value; 40 | uint32_t uint32Value; 41 | int32_t sint32Value; 42 | uint64_t uint64Value; 43 | int64_t sint64Value; 44 | float floatValue; 45 | double doubleValue; 46 | char * charValue; 47 | } value; 48 | //void *value; 49 | int size; 50 | int type; 51 | int protection; 52 | }; 53 | typedef struct search_result *search_result_t; 54 | 55 | struct search_result_chain { 56 | search_result_t result; 57 | struct search_result_chain *next; 58 | }; 59 | typedef struct search_result_chain *search_result_chain_t; 60 | 61 | #endif /* search_result_def_h */ 62 | -------------------------------------------------------------------------------- /iMemScan/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | NSAppTransportSecurity 24 | 25 | NSAllowsArbitraryLoads 26 | 27 | 28 | UIApplicationSupportsIndirectInputEvents 29 | 30 | UIBackgroundModes 31 | 32 | audio 33 | 34 | UILaunchStoryboardName 35 | LaunchScreen 36 | UIMainStoryboardFile 37 | Main 38 | UIRequiredDeviceCapabilities 39 | 40 | armv7 41 | 42 | UISupportedInterfaceOrientations 43 | 44 | UIInterfaceOrientationPortrait 45 | UIInterfaceOrientationLandscapeLeft 46 | 47 | UISupportedInterfaceOrientations~ipad 48 | 49 | UIInterfaceOrientationPortrait 50 | UIInterfaceOrientationPortraitUpsideDown 51 | UIInterfaceOrientationLandscapeLeft 52 | UIInterfaceOrientationLandscapeRight 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /iMemScan/Lib/Alamofire/URLSessionConfiguration+Alamofire.swift: -------------------------------------------------------------------------------- 1 | // 2 | // URLSessionConfiguration+Alamofire.swift 3 | // 4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | // 24 | 25 | import Foundation 26 | 27 | extension URLSessionConfiguration: AlamofireExtended {} 28 | extension AlamofireExtension where ExtendedType: URLSessionConfiguration { 29 | /// Alamofire's default configuration. Same as `URLSessionConfiguration.default` but adds Alamofire default 30 | /// `Accept-Language`, `Accept-Encoding`, and `User-Agent` headers. 31 | public static var `default`: URLSessionConfiguration { 32 | let configuration = URLSessionConfiguration.default 33 | configuration.headers = .default 34 | 35 | return configuration 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /iMemScan/Lib/Drops/PassthroughWindow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Drops 3 | // 4 | // Copyright (c) 2021-Present Omar Albeik - https://github.com/omaralbeik 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | import UIKit 25 | 26 | final class PassthroughWindow: UIWindow { 27 | init(hitTestView: UIView) { 28 | self.hitTestView = hitTestView 29 | super.init(frame: .zero) 30 | } 31 | 32 | required init?(coder: NSCoder) { 33 | return nil 34 | } 35 | 36 | override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 37 | let view = super.hitTest(point, with: event) 38 | if let view = view, let hitTestView = hitTestView, hitTestView.isDescendant(of: view) && hitTestView != view { 39 | return nil 40 | } 41 | return view 42 | } 43 | 44 | private weak var hitTestView: UIView? 45 | } 46 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Type/ModelType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ModelType.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/13. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public class ModelType: BaseType { 12 | public internal(set) var properties: [Property]? 13 | public internal(set) var genericTypes: [Any.Type]? 14 | private var modelKeysLock = DispatchSemaphore(value: 1) 15 | private var modelKeys: [String: ModelPropertyKey] = [:] 16 | private var jsonKeysLock = DispatchSemaphore(value: 1) 17 | private var jsonKeys: [String: String] = [:] 18 | 19 | func modelKey(from propertyName: String, 20 | _ createdKey: @autoclosure () -> ModelPropertyKey) -> ModelPropertyKey { 21 | modelKeysLock.wait() 22 | defer { modelKeysLock.signal() } 23 | if let key = modelKeys[propertyName] { return key } 24 | 25 | var resultKey = createdKey() 26 | if let stringKey = resultKey as? String { 27 | if stringKey != propertyName { 28 | resultKey = [stringKey, propertyName] 29 | } 30 | } else if var arrayKey = resultKey as? [String] { 31 | if arrayKey.count == 0 { 32 | resultKey = propertyName 33 | } else if arrayKey.last != propertyName { 34 | arrayKey.append(propertyName) 35 | resultKey = arrayKey 36 | } 37 | } 38 | modelKeys[propertyName] = resultKey; 39 | return resultKey 40 | } 41 | 42 | func JSONKey(from propertyName: String, 43 | _ createdKey: @autoclosure () -> String) -> String { 44 | jsonKeysLock.wait() 45 | defer { jsonKeysLock.signal() } 46 | if let key = jsonKeys[propertyName] { return key } 47 | 48 | let resultKey = createdKey() 49 | jsonKeys[propertyName] = resultKey 50 | return resultKey 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /iMemScan/Lib/JHKeyboard/UITextView+JHKeyboard.m: -------------------------------------------------------------------------------- 1 | // 2 | // UITextView+JHKeyboard.m 3 | // JHKeyboard 4 | // 5 | // Created by HaoCold on 2020/8/18. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | // Copyright (c) 2020 xjh093 9 | // 10 | // Permission is hereby granted, free of charge, to any person obtaining a copy 11 | // of this software and associated documentation files (the "Software"), to deal 12 | // in the Software without restriction, including without limitation the rights 13 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | // copies of the Software, and to permit persons to whom the Software is 15 | // furnished to do so, subject to the following conditions: 16 | // 17 | // The above copyright notice and this permission notice shall be included in all 18 | // copies or substantial portions of the Software. 19 | // 20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | // SOFTWARE. 27 | 28 | #import "UITextView+JHKeyboard.h" 29 | #import 30 | 31 | @implementation UITextView (JHKeyboard) 32 | 33 | - (JHKeyboard *)jh_keyboard{ 34 | JHKeyboard *keyboard = objc_getAssociatedObject(self, _cmd); 35 | if (!keyboard) { 36 | keyboard = [[JHKeyboard alloc] init]; 37 | [keyboard setValue:self forKey:@"textView"]; 38 | self.jh_keyboard = keyboard; 39 | } 40 | return keyboard; 41 | } 42 | 43 | - (void)setJh_keyboard:(JHKeyboard *)jh_keyboard{ 44 | objc_setAssociatedObject(self, @selector(jh_keyboard), jh_keyboard, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 45 | } 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /iMemScan/Lib/JHKeyboard/UITextField+JHKeyboard.m: -------------------------------------------------------------------------------- 1 | // 2 | // UITextField+JHKeyboard.m 3 | // JHKeyboard 4 | // 5 | // Created by HaoCold on 2020/8/18. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | // Copyright (c) 2020 xjh093 9 | // 10 | // Permission is hereby granted, free of charge, to any person obtaining a copy 11 | // of this software and associated documentation files (the "Software"), to deal 12 | // in the Software without restriction, including without limitation the rights 13 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | // copies of the Software, and to permit persons to whom the Software is 15 | // furnished to do so, subject to the following conditions: 16 | // 17 | // The above copyright notice and this permission notice shall be included in all 18 | // copies or substantial portions of the Software. 19 | // 20 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | // SOFTWARE. 27 | 28 | #import "UITextField+JHKeyboard.h" 29 | #import 30 | 31 | @implementation UITextField (JHKeyboard) 32 | 33 | - (JHKeyboard *)jh_keyboard{ 34 | JHKeyboard *keyboard = objc_getAssociatedObject(self, _cmd); 35 | if (!keyboard) { 36 | keyboard = [[JHKeyboard alloc] init]; 37 | [keyboard setValue:self forKey:@"textField"]; 38 | self.jh_keyboard = keyboard; 39 | } 40 | return keyboard; 41 | } 42 | 43 | - (void)setJh_keyboard:(JHKeyboard *)jh_keyboard{ 44 | objc_setAssociatedObject(self, @selector(jh_keyboard), jh_keyboard, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 45 | } 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Global/Coding.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Coding.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/22. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | @discardableResult 12 | public func write(_ value: Any, 13 | to file: String, 14 | atomically: Bool = true, 15 | encoding: String.Encoding = .utf8) -> String? { 16 | return write(value, to: URL(fileURLWithPath: file), encoding: encoding) 17 | } 18 | 19 | @discardableResult 20 | public func write(_ value: Any, 21 | to URL: URL, 22 | atomically: Bool = true, 23 | encoding: String.Encoding = .utf8) -> String? { 24 | if URL.isFileURL { 25 | let dir = (URL.path as NSString).deletingLastPathComponent 26 | let mgr = FileManager.default 27 | if !mgr.fileExists(atPath: dir) { 28 | try? mgr.createDirectory(atPath: dir, 29 | withIntermediateDirectories: true, 30 | attributes: nil) 31 | } 32 | } 33 | let string = Values.JSONString(value) 34 | try? string?.write(to: URL, 35 | atomically: atomically, 36 | encoding: .utf8) 37 | return string 38 | } 39 | 40 | public func read(_ type: T.Type, 41 | from file: String, 42 | encoding: String.Encoding = .utf8) -> T? { 43 | return read(type, 44 | from: URL(fileURLWithPath: file), 45 | encoding: encoding) 46 | } 47 | 48 | public func read(_ type: T.Type, 49 | from URL: URL, 50 | encoding: String.Encoding = .utf8) -> T? { 51 | guard let data = try? Data(contentsOf: URL) else { return nil } 52 | 53 | var value = JSONSerialization.kj_JSON(data, Any.self) 54 | if value == nil { 55 | value = String(data: data, encoding: encoding) 56 | } 57 | return Values.value(value, T.self) as? T 58 | } 59 | -------------------------------------------------------------------------------- /iMemScan/Lib/AlertView/PokerPresenter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PokerPresenter.swift 3 | // PokerCard 4 | // 5 | // Created by Weslie on 2019/10/7. 6 | // Copyright © 2019 Weslie (https://www.iweslie.com) 7 | // 8 | // Permission is hereby granted, free of charge, to any person obtaining a copy 9 | // of this software and associated documentation files (the "Software"), to deal 10 | // in the Software without restriction, including without limitation the rights 11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the Software is 13 | // furnished to do so, subject to the following conditions: 14 | // 15 | // The above copyright notice and this permission notice shall be included in 16 | // all copies or substantial portions of the Software. 17 | // 18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | // THE SOFTWARE. 25 | // 26 | 27 | import UIKit 28 | 29 | /// Abstract class of a poker view presenter 30 | public class PokerPresenter { 31 | /// current window for presenting a poker view 32 | internal var keyWindow: UIWindow 33 | /// poker view container background view 34 | internal var backgroundView: PokerPresenterView 35 | /// Create a `PokerPresenter` instance. 36 | init() { 37 | guard let keyWindow = currentWindow else { 38 | fatalError("cannot retrive current window") 39 | } 40 | let backgroundView = PokerPresenterView(frame: keyWindow.frame) 41 | keyWindow.addSubview(backgroundView) 42 | 43 | self.keyWindow = keyWindow 44 | self.backgroundView = backgroundView 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Descriptor/ClassDescriptor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ClassDescriptor.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/7/31. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | struct ClassDescriptor: ModelDescriptor { 10 | /// Flags describing the context, including its kind and format version 11 | let flags: ContextDescriptorFlags 12 | 13 | /// The parent context, or null if this is a top-level context. 14 | let parent: RelativeContextPointer 15 | 16 | /// The name of the type 17 | var name: RelativeDirectPointer 18 | 19 | /// A pointer to the metadata access function for this type 20 | let accessFunctionPtr: RelativeDirectPointer 21 | 22 | /// A pointer to the field descriptor for the type, if any 23 | var fields: RelativeDirectPointer 24 | 25 | /// The type of the superclass, expressed as a mangled type name that can refer to the generic arguments of the subclass type 26 | let superclassType: RelativeDirectPointer 27 | 28 | /// If this descriptor does not have a resilient superclass, this is the negative size of metadata objects of this class (in words) 29 | let metadataNegativeSizeInWords: UInt32 30 | 31 | /// If this descriptor does not have a resilient superclass, this is the positive size of metadata objects of this class (in words) 32 | let metadataPositiveSizeInWords: UInt32 33 | 34 | /// The number of additional members added by this class to the class metadata 35 | let numImmediateMembers: UInt32 36 | 37 | /// The number of stored properties in the class, not including its superclasses. If there is a field offset vector, this is its length. 38 | let numFields: UInt32 39 | 40 | /// The offset of the field offset vector for this class's stored properties in its metadata, in words. 0 means there is no field offset vector 41 | let fieldOffsetVectorOffset: FieldOffsetPointer 42 | 43 | let genericContextHeader: TargetTypeGenericContextDescriptorHeader 44 | } 45 | -------------------------------------------------------------------------------- /iMemScan/Lib/Appinfo/APP/AppController.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppController.m 3 | // MemSearch 4 | // 5 | // Created by 李良林 on 2020/10/18. 6 | // Copyright © 2020 李良林. All rights reserved. 7 | // 8 | 9 | #import "AppController.h" 10 | 11 | @interface PrivateApi_LSApplicationWorkspace 12 | - (NSArray*)allInstalledApplications; 13 | - (bool)openApplicationWithBundleID:(id)arg1; 14 | - (NSArray*)privateURLSchemes; 15 | - (NSArray*)publicURLSchemes; 16 | @end 17 | 18 | 19 | #pragma mark - 20 | 21 | @implementation AppController 22 | { 23 | PrivateApi_LSApplicationWorkspace* _workspace; 24 | NSArray* _installedApplications; 25 | } 26 | 27 | - (instancetype)init 28 | { 29 | self = [super init]; 30 | if(self != nil) 31 | { 32 | _workspace = [NSClassFromString(@"LSApplicationWorkspace") new]; 33 | } 34 | 35 | return self; 36 | } 37 | 38 | - (NSArray*)privateURLSchemes 39 | { 40 | return [_workspace privateURLSchemes]; 41 | } 42 | 43 | - (NSArray*)publicURLSchemes 44 | { 45 | return [_workspace publicURLSchemes]; 46 | } 47 | 48 | - (NSArray*)readApplications 49 | { 50 | NSArray* allInstalledApplications = [_workspace allInstalledApplications]; 51 | NSMutableArray* applications = [NSMutableArray arrayWithCapacity:allInstalledApplications.count]; 52 | for(id proxy in allInstalledApplications) 53 | { 54 | App* app = [App appWithPrivateProxy:proxy]; 55 | if(!app.isHiddenApp) 56 | { 57 | [applications addObject:app]; 58 | } 59 | } 60 | 61 | return applications; 62 | } 63 | 64 | - (NSArray*)installedApplications 65 | { 66 | if(nil == _installedApplications) 67 | { 68 | _installedApplications = [self readApplications]; 69 | } 70 | 71 | return _installedApplications; 72 | } 73 | 74 | - (BOOL)openAppWithBundleIdentifier:(NSString *)bundleIdentifier 75 | { 76 | return (BOOL)[_workspace openApplicationWithBundleID:bundleIdentifier]; 77 | } 78 | 79 | + (instancetype)sharedInstance 80 | { 81 | static dispatch_once_t once; 82 | static id sharedInstance; 83 | dispatch_once(&once, ^{ 84 | sharedInstance = [[self alloc] init]; 85 | }); 86 | return sharedInstance; 87 | } 88 | 89 | @end 90 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/MJRefreshConst.m: -------------------------------------------------------------------------------- 1 | // 代码地址: https://github.com/CoderMJLee/MJRefresh 2 | // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 3 | #import 4 | 5 | const CGFloat MJRefreshLabelLeftInset = 25; 6 | const CGFloat MJRefreshHeaderHeight = 54.0; 7 | const CGFloat MJRefreshFooterHeight = 44.0; 8 | const CGFloat MJRefreshTrailWidth = 60.0; 9 | const CGFloat MJRefreshFastAnimationDuration = 0.25; 10 | const CGFloat MJRefreshSlowAnimationDuration = 0.4; 11 | 12 | NSString *const MJRefreshKeyPathContentOffset = @"contentOffset"; 13 | NSString *const MJRefreshKeyPathContentInset = @"contentInset"; 14 | NSString *const MJRefreshKeyPathContentSize = @"contentSize"; 15 | NSString *const MJRefreshKeyPathPanState = @"state"; 16 | 17 | NSString *const MJRefreshHeaderLastUpdatedTimeKey = @"MJRefreshHeaderLastUpdatedTimeKey"; 18 | 19 | NSString *const MJRefreshHeaderIdleText = @"MJRefreshHeaderIdleText"; 20 | NSString *const MJRefreshHeaderPullingText = @"MJRefreshHeaderPullingText"; 21 | NSString *const MJRefreshHeaderRefreshingText = @"MJRefreshHeaderRefreshingText"; 22 | 23 | NSString *const MJRefreshTrailerIdleText = @"MJRefreshTrailerIdleText"; 24 | NSString *const MJRefreshTrailerPullingText = @"MJRefreshTrailerPullingText"; 25 | 26 | NSString *const MJRefreshAutoFooterIdleText = @"MJRefreshAutoFooterIdleText"; 27 | NSString *const MJRefreshAutoFooterRefreshingText = @"MJRefreshAutoFooterRefreshingText"; 28 | NSString *const MJRefreshAutoFooterNoMoreDataText = @"MJRefreshAutoFooterNoMoreDataText"; 29 | 30 | NSString *const MJRefreshBackFooterIdleText = @"MJRefreshBackFooterIdleText"; 31 | NSString *const MJRefreshBackFooterPullingText = @"MJRefreshBackFooterPullingText"; 32 | NSString *const MJRefreshBackFooterRefreshingText = @"MJRefreshBackFooterRefreshingText"; 33 | NSString *const MJRefreshBackFooterNoMoreDataText = @"MJRefreshBackFooterNoMoreDataText"; 34 | 35 | NSString *const MJRefreshHeaderLastTimeText = @""; 36 | NSString *const MJRefreshHeaderDateTodayText = @""; 37 | NSString *const MJRefreshHeaderNoneLastDateText = @""; 38 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Extension/Pointer+KJ.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Pointer+KJ.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/1. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | extension UnsafePointer { 10 | var kj_raw: UnsafeRawPointer { 11 | return UnsafeRawPointer(self) 12 | } 13 | var kj_mutable: UnsafeMutablePointer { 14 | return UnsafeMutablePointer(mutating: self) 15 | } 16 | } 17 | 18 | extension UnsafeMutablePointer { 19 | var kj_raw: UnsafeMutableRawPointer { 20 | return UnsafeMutableRawPointer(self) 21 | } 22 | 23 | var kj_immutable: UnsafePointer { 24 | return UnsafePointer(self) 25 | } 26 | } 27 | 28 | extension UnsafeRawPointer { 29 | var kj_mutable: UnsafeMutableRawPointer { 30 | return UnsafeMutableRawPointer(mutating: self) 31 | } 32 | 33 | static func ~>(ptr: UnsafeRawPointer, type: T.Type) -> UnsafePointer { 34 | return ptr.assumingMemoryBound(to: type) 35 | } 36 | } 37 | 38 | extension UnsafeMutableRawPointer { 39 | var kj_immutable: UnsafeRawPointer { 40 | return UnsafeRawPointer(self) 41 | } 42 | 43 | func kj_set(_ value: Any, _ type: Any.Type) { 44 | return typeProxy(type)._set(value, self) 45 | } 46 | 47 | func kj_get(_ type: Any.Type) -> Any { 48 | return typeProxy(type)._get(self) 49 | } 50 | 51 | static func ~>(ptr: UnsafeMutableRawPointer, type: T.Type) -> UnsafeMutablePointer { 52 | return ptr.assumingMemoryBound(to: type) 53 | } 54 | } 55 | 56 | private extension TypeProxy { 57 | static func _set(_ value: Any, _ ptr: UnsafeMutableRawPointer) { 58 | (value as? Self).flatMap { (ptr ~> self).pointee = $0 } 59 | } 60 | 61 | static func _get(_ ptr: UnsafeMutableRawPointer) -> Any { 62 | return (ptr ~> self).pointee 63 | } 64 | } 65 | 66 | infix operator ~>> : MultiplicationPrecedence 67 | func ~>> (type1: T1, type2: T2.Type) -> T2 { 68 | return unsafeBitCast(type1, to: type2) 69 | } 70 | 71 | infix operator ~> : MultiplicationPrecedence 72 | -------------------------------------------------------------------------------- /iMemScan/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /iMemScan/Tool/VMem/VMTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // VMTool.h 3 | // ViewMem 4 | // 5 | // Created by HaoCold on 2020/8/26. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "VMTypeHeader.h" 11 | 12 | @class MemRecordModel; 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | typedef void(^VMToolSearchBlock)(NSInteger count, NSArray *array); 17 | 18 | @interface VMTool : NSObject 19 | 20 | + (instancetype)share; 21 | 22 | - (void)setPid:(int)pid name:(NSString *)name; 23 | - (mach_port_t)getTask; 24 | 25 | //-(void)kais:(uint64_t)address bt:(NSString *)Bytes; 26 | 27 | // 搜索 28 | - (void)nearMemSearch:(NSString *)value type:(VMMemValueType)type range:(int)range callback:(VMToolSearchBlock)block; 29 | - (void)searchValue:(NSString *)value type:(VMMemValueType)type comparison:(VMMemComparison)comparison callback:(VMToolSearchBlock)block; 30 | - (void)modifyValue:(NSString *)value address:(NSString *)address type:(VMMemValueType)type; 31 | 32 | - (void)reset; 33 | - (void)refreshWithCallback:(VMToolSearchBlock)block; 34 | 35 | // 查看内存 36 | - (NSArray *)memory:(NSString *)address size:(NSString *)size type:(VMMemSearchType)type valueType:(VMMemValueType)valueType; 37 | 38 | // 邻近范围 39 | - (int)rangeValue; 40 | - (NSString *)rangeStringValue; 41 | - (void)setRange:(NSString *)range; 42 | 43 | // 下限 44 | - (uint64_t)addrLowValue; 45 | - (NSString *)addrRange; 46 | - (void)setAddrRange:(NSString *)low; 47 | 48 | // 上限 49 | - (uint64_t)addrUppValue; 50 | - (NSString *)addrRangeUpp; 51 | - (void)setAddrRangeUpp:(NSString *)Upp; 52 | 53 | // 结果数里限制 54 | - (void)setLimitCount:(NSString *)count; 55 | - (NSInteger)limitCount; 56 | 57 | // 定时修改 58 | - (void)setDuration:(NSString *)duration; 59 | - (NSInteger)duration; 60 | - (void)setDuration1:(NSString *)duration; 61 | - (NSInteger)duration1; 62 | 63 | // 类型对应的 枚举 64 | - (NSArray *)allKeys; 65 | - (NSDictionary *)keyValues; 66 | 67 | 68 | // 修改中 69 | @property (nonatomic, assign) BOOL modifying; 70 | // 一键修改 71 | //- (void)oneKeyModify:(MemRecordModel *)model; 72 | // 一键设置 73 | - (void)oneKeySetup:(NSArray *)array; 74 | 75 | @end 76 | 77 | NS_ASSUME_NONNULL_END 78 | -------------------------------------------------------------------------------- /iMemScan/Lib/AlertView/PokerConfirmRepresentable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PokerConfirmRepresentable.swift 3 | // PokerCard 4 | // 5 | // Created by Weslie Chen on 2019/10/16. 6 | // Copyright © 2019 Weslie (https://www.iweslie.com) 7 | // 8 | // Permission is hereby granted, free of charge, to any person obtaining a copy 9 | // of this software and associated documentation files (the "Software"), to deal 10 | // in the Software without restriction, including without limitation the rights 11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | // copies of the Software, and to permit persons to whom the Software is 13 | // furnished to do so, subject to the following conditions: 14 | // 15 | // The above copyright notice and this permission notice shall be included in 16 | // all copies or substantial portions of the Software. 17 | // 18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | // THE SOFTWARE. 25 | // 26 | 27 | import UIKit 28 | 29 | protocol PokerConfirmRepresentable { 30 | func setupCancelButton(with title: String?) 31 | } 32 | 33 | extension PokerConfirmRepresentable { 34 | func setupCancelButton(with title: String) {} 35 | 36 | func setupConfirmButton(for pokerView: PokerView, with title: String) -> PKButton { 37 | let button = PKButton(title: "Confirm", fontSize: 20) 38 | button.isConfirmButton = true 39 | button.addTarget(pokerView, action: #selector(pokerView.dismiss), for: .touchUpInside) 40 | button.backgroundColor = PKColor.blue 41 | pokerView.addSubview(button) 42 | button.constraint(withLeadingTrailing: 40) 43 | button.heightAnchor.constraint(equalToConstant: 38).isActive = true 44 | 45 | return button 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /iMemScan/Ctrl/Set/AppHtmlCtrl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppHtmlCtrl.swift 3 | // YMTool 4 | // 5 | // Created by yiming on 2021/7/8. 6 | // 7 | 8 | import UIKit 9 | import WebKit 10 | 11 | class AppHtmlCtrl: UIViewController, WKUIDelegate, WKNavigationDelegate { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | // Do any additional setup after loading the view. 17 | 18 | navigationItem.title = NSLocalizedString("Release Notes", comment: "") 19 | setupViews() 20 | } 21 | 22 | func setupViews() { 23 | navigationController?.navigationBar.shadowImage = UIImage() 24 | navigationItem.largeTitleDisplayMode = .never 25 | 26 | view.addSubview(webView) 27 | } 28 | 29 | @objc func buttonAction(_ button: UIButton?) { 30 | if button?.tag == 0 { 31 | dismiss(animated: true) 32 | } 33 | } 34 | 35 | // MARK: - 懒加载 36 | 37 | lazy var webView: WKWebView = { 38 | let webView = WKWebView() 39 | webView.frame = self.view.bounds 40 | webView.uiDelegate = self 41 | webView.navigationDelegate = self 42 | webView.allowsBackForwardNavigationGestures = true 43 | 44 | let backForwardList = webView.backForwardList 45 | 46 | let bundlePath = Bundle.main.bundlePath 47 | 48 | let path = "file://\(bundlePath)/LocalFiles/updaterecord.html" 49 | let request = URLRequest(url: URL(string: path)!) 50 | 51 | // 加载本地html文件 52 | webView.load(request) 53 | // 页面后退 54 | webView.goBack() 55 | // 页面前进 56 | webView.goForward() 57 | // 刷新当前页面 58 | webView.reload() 59 | 60 | return webView 61 | }() 62 | 63 | 64 | /* 65 | // MARK: - Navigation 66 | 67 | // In a storyboard-based application, you will often want to do a little preparation before navigation 68 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 69 | // Get the new view controller using segue.destination. 70 | // Pass the selected object to the new view controller. 71 | } 72 | */ 73 | 74 | } 75 | -------------------------------------------------------------------------------- /iMemScan/Lib/MD5/StringMD5.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringMD5.swift 3 | // iMemScan 4 | // 5 | // Created by 李良林 on 2020/12/9. 6 | // Copyright © 2020 李良林. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import CommonCrypto 11 | 12 | extension String { 13 | 14 | // MARK: - 32位 小写 15 | 16 | func md5ForLower32Bate() -> String { 17 | let str = self.cString(using: String.Encoding.utf8) 18 | let strLen = CUnsignedInt(self.lengthOfBytes(using: String.Encoding.utf8)) 19 | let result = UnsafeMutablePointer.allocate(capacity: Int(CC_MD5_DIGEST_LENGTH)) 20 | 21 | CC_MD5(str!, strLen, result) 22 | 23 | let hash = NSMutableString() 24 | 25 | for i in 0 ..< Int(CC_MD5_DIGEST_LENGTH) { 26 | hash.appendFormat("%02x", result[i]) 27 | } 28 | 29 | return String(format: hash as String) 30 | } 31 | } 32 | 33 | class Filezmd5: NSObject { 34 | 35 | static func fileMD5(path: String) -> String? { 36 | 37 | let handle = FileHandle(forReadingAtPath: path) 38 | 39 | if handle == nil { 40 | return nil 41 | } 42 | 43 | let ctx = UnsafeMutablePointer.allocate(capacity: MemoryLayout.size) 44 | 45 | CC_MD5_Init(ctx) 46 | 47 | var done = false 48 | 49 | while !done { 50 | let fileData = handle?.readData(ofLength: 256) 51 | fileData?.withUnsafeBytes {(bytes: UnsafePointer)->Void in 52 | CC_MD5_Update(ctx, bytes, CC_LONG(fileData!.count)) 53 | } 54 | 55 | if fileData?.count == 0 { 56 | done = true 57 | } 58 | } 59 | 60 | //unsigned char digest[CC_MD5_DIGEST_LENGTH]; 61 | let digestLen = Int(CC_MD5_DIGEST_LENGTH) 62 | let digest = UnsafeMutablePointer.allocate(capacity: digestLen) 63 | CC_MD5_Final(digest, ctx); 64 | 65 | var hash = "" 66 | for i in 0.. 10 | 11 | @class NSString, NSArray, NSDictionary; 12 | 13 | @interface NSTask : NSObject 14 | 15 | // Create an NSTask which can be run at a later time 16 | // An NSTask can only be run once. Subsequent attempts to 17 | // run an NSTask will raise. 18 | // Upon task death a notification will be sent 19 | // { Name = NSTaskDidTerminateNotification; object = task; } 20 | // 21 | 22 | - (instancetype)init; 23 | 24 | // set parameters 25 | // these methods can only be done before a launch 26 | // if not set, use current 27 | // if not set, use current 28 | 29 | // set standard I/O channels; may be either an NSFileHandle or an NSPipe 30 | - (void)setStandardInput:(id)input; 31 | - (void)setStandardOutput:(id)output; 32 | - (void)setStandardError:(id)error; 33 | 34 | // get parameters 35 | @property (NS_NONATOMIC_IOSONLY, copy) NSString *launchPath; 36 | @property (NS_NONATOMIC_IOSONLY, copy) NSArray *arguments; 37 | @property (NS_NONATOMIC_IOSONLY, copy) NSDictionary *environment; 38 | @property (NS_NONATOMIC_IOSONLY, copy) NSString *currentDirectoryPath; 39 | 40 | // get standard I/O channels; could be either an NSFileHandle or an NSPipe 41 | - (id)standardInput; 42 | - (id)standardOutput; 43 | - (id)standardError; 44 | 45 | // actions 46 | - (void)launch; 47 | 48 | - (void)interrupt; // Not always possible. Sends SIGINT. 49 | - (void)terminate; // Not always possible. Sends SIGTERM. 50 | 51 | @property (NS_NONATOMIC_IOSONLY, readonly) BOOL suspend; 52 | @property (NS_NONATOMIC_IOSONLY, readonly) BOOL resume; 53 | 54 | // status 55 | @property (NS_NONATOMIC_IOSONLY, readonly) int processIdentifier; 56 | @property (NS_NONATOMIC_IOSONLY, getter=isRunning, readonly) BOOL running; 57 | 58 | @property (NS_NONATOMIC_IOSONLY, readonly) int terminationStatus; 59 | 60 | @end 61 | 62 | @interface NSTask (NSTaskConveniences) 63 | 64 | + (NSTask *)launchedTaskWithLaunchPath:(NSString *)path arguments:(NSArray *)arguments; 65 | // convenience; create and launch 66 | 67 | - (void)waitUntilExit; 68 | // poll the runLoop in defaultMode until task completes 69 | 70 | @end 71 | 72 | FOUNDATION_EXPORT NSString * const NSTaskDidTerminateNotification; 73 | -------------------------------------------------------------------------------- /iMemScan/Tool/Jailbreak/Sh/NSTask.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSTask.h 3 | // MemSearchTest 4 | // 5 | // Created by 李良林 on 2020/11/21. 6 | // Copyright © 2020 李良林. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class NSString, NSArray, NSDictionary; 12 | 13 | @interface NSTask : NSObject 14 | 15 | // Create an NSTask which can be run at a later time 16 | // An NSTask can only be run once. Subsequent attempts to 17 | // run an NSTask will raise. 18 | // Upon task death a notification will be sent 19 | // { Name = NSTaskDidTerminateNotification; object = task; } 20 | // 21 | 22 | - (instancetype)init; 23 | 24 | // set parameters 25 | // these methods can only be done before a launch 26 | // if not set, use current 27 | // if not set, use current 28 | 29 | // set standard I/O channels; may be either an NSFileHandle or an NSPipe 30 | - (void)setStandardInput:(id)input; 31 | - (void)setStandardOutput:(id)output; 32 | - (void)setStandardError:(id)error; 33 | 34 | // get parameters 35 | @property (NS_NONATOMIC_IOSONLY, copy) NSString *launchPath; 36 | @property (NS_NONATOMIC_IOSONLY, copy) NSArray *arguments; 37 | @property (NS_NONATOMIC_IOSONLY, copy) NSDictionary *environment; 38 | @property (NS_NONATOMIC_IOSONLY, copy) NSString *currentDirectoryPath; 39 | 40 | // get standard I/O channels; could be either an NSFileHandle or an NSPipe 41 | - (id)standardInput; 42 | - (id)standardOutput; 43 | - (id)standardError; 44 | 45 | // actions 46 | - (void)launch; 47 | 48 | - (void)interrupt; // Not always possible. Sends SIGINT. 49 | - (void)terminate; // Not always possible. Sends SIGTERM. 50 | 51 | @property (NS_NONATOMIC_IOSONLY, readonly) BOOL suspend; 52 | @property (NS_NONATOMIC_IOSONLY, readonly) BOOL resume; 53 | 54 | // status 55 | @property (NS_NONATOMIC_IOSONLY, readonly) int processIdentifier; 56 | @property (NS_NONATOMIC_IOSONLY, getter=isRunning, readonly) BOOL running; 57 | 58 | @property (NS_NONATOMIC_IOSONLY, readonly) int terminationStatus; 59 | 60 | @end 61 | 62 | @interface NSTask (NSTaskConveniences) 63 | 64 | + (NSTask *)launchedTaskWithLaunchPath:(NSString *)path arguments:(NSArray *)arguments; 65 | // convenience; create and launch 66 | 67 | - (void)waitUntilExit; 68 | // poll the runLoop in defaultMode until task completes 69 | 70 | @end 71 | 72 | FOUNDATION_EXPORT NSString * const NSTaskDidTerminateNotification; 73 | -------------------------------------------------------------------------------- /iMemScan/Ctrl/OneKey()/VMOneKeyTool.m: -------------------------------------------------------------------------------- 1 | // 2 | // VMOneKeyTool.m 3 | // MemView 4 | // 5 | // Created by HaoCold on 2020/9/29. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import "VMOneKeyTool.h" 10 | #import "YYModel.h" 11 | #import "VMOneKeyModel.h" 12 | #import 13 | 14 | #define doc [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"iMemScan(Script)"] 15 | 16 | #define kPath [doc stringByAppendingPathComponent:@"recordData.data"] 17 | 18 | NSMutableArray *_allData; 19 | 20 | @implementation VMOneKeyTool 21 | 22 | + (void)setup 23 | { 24 | static dispatch_once_t onceToken; 25 | dispatch_once(&onceToken, ^{ 26 | 27 | if (![[NSFileManager defaultManager] fileExistsAtPath:kPath]) { 28 | [[NSFileManager defaultManager] createDirectoryAtPath:doc withIntermediateDirectories:YES attributes:nil error:nil]; 29 | [[NSFileManager defaultManager] createFileAtPath:kPath contents:nil attributes:nil]; 30 | } 31 | 32 | NSArray *array = @[]; 33 | NSString *string = [[NSString alloc] initWithContentsOfFile:kPath encoding:NSUTF8StringEncoding error:NULL]; 34 | //NSLog(@"*** string = %@",string); 35 | if (string.length > 0) { 36 | array = [NSArray yy_modelArrayWithClass:[VMOneKeyModel class] json:string]; 37 | } 38 | _allData = @[].mutableCopy; 39 | if (array.count > 0) { 40 | [_allData addObjectsFromArray:array]; 41 | } 42 | 43 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(save) name:UIApplicationWillTerminateNotification object:nil]; 44 | }); 45 | } 46 | 47 | + (NSArray *)allRecords 48 | { 49 | return [NSArray arrayWithArray:_allData]; 50 | } 51 | 52 | + (void)deleteRecord:(VMOneKeyModel *)model 53 | { 54 | [_allData removeObject:model]; 55 | } 56 | 57 | + (void)saveRecord:(VMOneKeyModel *)model 58 | { 59 | [_allData addObject:model]; 60 | } 61 | 62 | + (void)save 63 | { 64 | NSString *string = [_allData yy_modelToJSONString]; 65 | [string writeToFile:kPath atomically:YES encoding:NSUTF8StringEncoding error:NULL]; 66 | } 67 | 68 | + (void)exchange:(NSInteger)idx1 index:(NSInteger)idx2 69 | { 70 | [_allData exchangeObjectAtIndex:idx1 withObjectAtIndex:idx2]; 71 | } 72 | 73 | @end 74 | -------------------------------------------------------------------------------- /iMemScan/Lib/Alamofire/StringEncoding+Alamofire.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringEncoding+Alamofire.swift 3 | // 4 | // Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | // 24 | 25 | import Foundation 26 | 27 | extension String.Encoding { 28 | /// Creates an encoding from the IANA charset name. 29 | /// 30 | /// - Notes: These mappings match those [provided by CoreFoundation](https://opensource.apple.com/source/CF/CF-476.18/CFStringUtilities.c.auto.html) 31 | /// 32 | /// - Parameter name: IANA charset name. 33 | init?(ianaCharsetName name: String) { 34 | switch name.lowercased() { 35 | case "utf-8": 36 | self = .utf8 37 | case "iso-8859-1": 38 | self = .isoLatin1 39 | case "unicode-1-1", "iso-10646-ucs-2", "utf-16": 40 | self = .utf16 41 | case "utf-16be": 42 | self = .utf16BigEndian 43 | case "utf-16le": 44 | self = .utf16LittleEndian 45 | case "utf-32": 46 | self = .utf32 47 | case "utf-32be": 48 | self = .utf32BigEndian 49 | case "utf-32le": 50 | self = .utf32LittleEndian 51 | default: 52 | return nil 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshBackStateFooter.m 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/6/13. 6 | // Copyright © 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshBackStateFooter.h" 10 | 11 | @interface MJRefreshBackStateFooter() 12 | { 13 | /** 显示刷新状态的label */ 14 | __unsafe_unretained UILabel *_stateLabel; 15 | } 16 | /** 所有状态对应的文字 */ 17 | @property (strong, nonatomic) NSMutableDictionary *stateTitles; 18 | @end 19 | 20 | @implementation MJRefreshBackStateFooter 21 | #pragma mark - 懒加载 22 | - (NSMutableDictionary *)stateTitles 23 | { 24 | if (!_stateTitles) { 25 | self.stateTitles = [NSMutableDictionary dictionary]; 26 | } 27 | return _stateTitles; 28 | } 29 | 30 | - (UILabel *)stateLabel 31 | { 32 | if (!_stateLabel) { 33 | [self addSubview:_stateLabel = [UILabel mj_label]]; 34 | } 35 | return _stateLabel; 36 | } 37 | 38 | #pragma mark - 公共方法 39 | - (void)setTitle:(NSString *)title forState:(MJRefreshState)state 40 | { 41 | if (title == nil) return; 42 | self.stateTitles[@(state)] = title; 43 | self.stateLabel.text = self.stateTitles[@(self.state)]; 44 | } 45 | 46 | - (NSString *)titleForState:(MJRefreshState)state { 47 | return self.stateTitles[@(state)]; 48 | } 49 | 50 | #pragma mark - 重写父类的方法 51 | - (void)prepare 52 | { 53 | [super prepare]; 54 | 55 | // 初始化间距 56 | self.labelLeftInset = MJRefreshLabelLeftInset; 57 | 58 | // 初始化文字 59 | [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshBackFooterIdleText] forState:MJRefreshStateIdle]; 60 | [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshBackFooterPullingText] forState:MJRefreshStatePulling]; 61 | [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshBackFooterRefreshingText] forState:MJRefreshStateRefreshing]; 62 | [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshBackFooterNoMoreDataText] forState:MJRefreshStateNoMoreData]; 63 | } 64 | 65 | - (void)placeSubviews 66 | { 67 | [super placeSubviews]; 68 | 69 | if (self.stateLabel.constraints.count) return; 70 | 71 | // 状态标签 72 | self.stateLabel.frame = self.bounds; 73 | } 74 | 75 | - (void)setState:(MJRefreshState)state 76 | { 77 | MJRefreshCheckState 78 | 79 | // 设置状态文字 80 | self.stateLabel.text = self.stateTitles[@(state)]; 81 | } 82 | @end 83 | -------------------------------------------------------------------------------- /iMemScan/Lib/Drops/WindowViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Drops 3 | // 4 | // Copyright (c) 2021-Present Omar Albeik - https://github.com/omaralbeik 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | import UIKit 25 | 26 | final class WindowViewController: UIViewController { 27 | init() { 28 | let view = PassthroughView() 29 | let window = PassthroughWindow(hitTestView: view) 30 | self.window = window 31 | super.init(nibName: nil, bundle: nil) 32 | self.view = view 33 | window.rootViewController = self 34 | } 35 | 36 | required init?(coder: NSCoder) { 37 | return nil 38 | } 39 | 40 | func install() { 41 | window?.frame = UIScreen.main.bounds 42 | window?.isHidden = false 43 | if #available(iOS 13, *) { 44 | let activeScene = UIApplication.shared.connectedScenes 45 | .compactMap { $0 as? UIWindowScene } 46 | .first { $0.activationState == .foregroundActive } 47 | window?.windowScene = activeScene 48 | } 49 | } 50 | 51 | func uninstall() { 52 | window?.isHidden = true 53 | if #available(iOS 13, *) { 54 | window?.windowScene = nil 55 | } 56 | window = nil 57 | } 58 | 59 | var window: UIWindow? 60 | } 61 | -------------------------------------------------------------------------------- /iMemScan/Lib/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m: -------------------------------------------------------------------------------- 1 | // 2 | // MJRefreshAutoNormalFooter.m 3 | // MJRefreshExample 4 | // 5 | // Created by MJ Lee on 15/4/24. 6 | // Copyright (c) 2015年 小码哥. All rights reserved. 7 | // 8 | 9 | #import "MJRefreshAutoNormalFooter.h" 10 | 11 | @interface MJRefreshAutoNormalFooter() 12 | @property (weak, nonatomic) UIActivityIndicatorView *loadingView; 13 | @end 14 | 15 | @implementation MJRefreshAutoNormalFooter 16 | #pragma mark - 懒加载子控件 17 | - (UIActivityIndicatorView *)loadingView 18 | { 19 | if (!_loadingView) { 20 | UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:_activityIndicatorViewStyle]; 21 | loadingView.hidesWhenStopped = YES; 22 | [self addSubview:_loadingView = loadingView]; 23 | } 24 | return _loadingView; 25 | } 26 | 27 | - (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)activityIndicatorViewStyle 28 | { 29 | _activityIndicatorViewStyle = activityIndicatorViewStyle; 30 | 31 | [self.loadingView removeFromSuperview]; 32 | self.loadingView = nil; 33 | [self setNeedsLayout]; 34 | } 35 | #pragma mark - 重写父类的方法 36 | - (void)prepare 37 | { 38 | [super prepare]; 39 | 40 | #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 41 | if (@available(iOS 13.0, *)) { 42 | _activityIndicatorViewStyle = UIActivityIndicatorViewStyleMedium; 43 | return; 44 | } 45 | #endif 46 | 47 | _activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; 48 | } 49 | 50 | - (void)placeSubviews 51 | { 52 | [super placeSubviews]; 53 | 54 | if (self.loadingView.constraints.count) return; 55 | 56 | // 圈圈 57 | CGFloat loadingCenterX = self.mj_w * 0.5; 58 | if (!self.isRefreshingTitleHidden) { 59 | loadingCenterX -= self.stateLabel.mj_textWidth * 0.5 + self.labelLeftInset; 60 | } 61 | CGFloat loadingCenterY = self.mj_h * 0.5; 62 | self.loadingView.center = CGPointMake(loadingCenterX, loadingCenterY); 63 | } 64 | 65 | - (void)setState:(MJRefreshState)state 66 | { 67 | MJRefreshCheckState 68 | 69 | // 根据状态做事情 70 | if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) { 71 | [self.loadingView stopAnimating]; 72 | } else if (state == MJRefreshStateRefreshing) { 73 | [self.loadingView startAnimating]; 74 | } 75 | } 76 | 77 | @end 78 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Extension/Data+KJ.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Data+KJ.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/18. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension Data: KJCompatible {} 12 | extension NSData: KJCompatible {} 13 | 14 | public extension KJ where Base == Data { 15 | /// JSONObject -> Model 16 | func model(_ type: M.Type) -> M? { 17 | return model(type: type) as? M 18 | } 19 | 20 | /// JSONObject -> Model 21 | func model(type: Convertible.Type) -> Convertible? { 22 | if let json = JSONSerialization.kj_JSON(base, [String: Any].self) { 23 | return json.kj.model(type: type) 24 | } 25 | Logger.error("Failed to get JSON from JSONData.") 26 | return nil 27 | } 28 | 29 | /// JSONObjectArray -> ModelArray 30 | func modelArray(_ type: M.Type) -> [M] { 31 | return modelArray(type: type) as! [M] 32 | } 33 | 34 | /// JSONObjectArray -> ModelArray 35 | func modelArray(type: Convertible.Type) -> [Convertible] { 36 | if let json = JSONSerialization.kj_JSON(base, [Any].self) { 37 | return json.kj.modelArray(type: type) 38 | } 39 | Logger.error("Failed to get JSON from JSONData.") 40 | return [] 41 | } 42 | } 43 | 44 | public extension KJ where Base: NSData { 45 | /// JSONObject -> Model 46 | func model(_ type: M.Type) -> M? { 47 | return (base as Data).kj.model(type) 48 | } 49 | 50 | /// JSONObject -> Model 51 | func model(type: Convertible.Type) -> Convertible? { 52 | return (base as Data).kj.model(type: type) 53 | } 54 | 55 | /// JSONObjectArray -> ModelArray 56 | func modelArray(_ type: M.Type) -> [M] { 57 | return (base as Data).kj.modelArray(type) 58 | } 59 | 60 | /// JSONObjectArray -> ModelArray 61 | func modelArray(type: Convertible.Type) -> [Convertible] { 62 | return (base as Data).kj.modelArray(type: type) 63 | } 64 | } 65 | 66 | extension Data { 67 | func kj_fastModel(_ type: Convertible.Type) -> Convertible? { 68 | if let json = JSONSerialization.kj_JSON(self, [String: Any].self) { 69 | return json.kj_fastModel(type) 70 | } 71 | Logger.error("Failed to get JSON from JSONData.") 72 | return nil 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /iMemScan/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // iMemScan 4 | // 5 | // Created by yiming on 2021/8/12. 6 | // 7 | 8 | import UIKit 9 | 10 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 11 | 12 | var window: UIWindow? 13 | 14 | 15 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 16 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 17 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 18 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 19 | guard let _ = (scene as? UIWindowScene) else { return } 20 | } 21 | 22 | func sceneDidDisconnect(_ scene: UIScene) { 23 | // Called as the scene is being released by the system. 24 | // This occurs shortly after the scene enters the background, or when its session is discarded. 25 | // Release any resources associated with this scene that can be re-created the next time the scene connects. 26 | // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). 27 | } 28 | 29 | func sceneDidBecomeActive(_ scene: UIScene) { 30 | // Called when the scene has moved from an inactive state to an active state. 31 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. 32 | } 33 | 34 | func sceneWillResignActive(_ scene: UIScene) { 35 | // Called when the scene will move from an active state to an inactive state. 36 | // This may occur due to temporary interruptions (ex. an incoming phone call). 37 | } 38 | 39 | func sceneWillEnterForeground(_ scene: UIScene) { 40 | // Called as the scene transitions from the background to the foreground. 41 | // Use this method to undo the changes made on entering the background. 42 | } 43 | 44 | func sceneDidEnterBackground(_ scene: UIScene) { 45 | // Called as the scene transitions from the foreground to the background. 46 | // Use this method to save data, release shared resources, and store enough scene-specific state information 47 | // to restore the scene back to its current state. 48 | } 49 | 50 | 51 | } 52 | 53 | -------------------------------------------------------------------------------- /iMemScan/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // iMemScan 4 | // 5 | // Created by yiming on 2021/8/4. 6 | // 7 | 8 | import UIKit 9 | import AVFoundation 10 | import MediaPlayer 11 | 12 | @main 13 | class AppDelegate: UIResponder, UIApplicationDelegate { 14 | 15 | var window: UIWindow? 16 | var audioPlayer:AVAudioPlayer? 17 | 18 | // 用于保存后台下载的completionHandler 19 | var backgroundSessionCompletionHandler: (() -> Void)? 20 | 21 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 22 | // Override point for customization after application launch. 23 | 24 | Audio() 25 | overrideUserInterfacrStyle() 26 | 27 | return true 28 | } 29 | 30 | // 禁用掉第三方输入法 31 | // func application(_ application: UIApplication, shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplication.ExtensionPointIdentifier) -> Bool { 32 | // return false 33 | // } 34 | 35 | func Audio() { 36 | 37 | let bundlePath = Bundle.main.bundlePath 38 | let path = "file://\(bundlePath)/LocalFiles/music.m4a" 39 | let url = URL(string: path)! 40 | 41 | do { 42 | audioPlayer = try AVAudioPlayer(contentsOf: url) 43 | } catch { 44 | audioPlayer = nil 45 | } 46 | 47 | audioPlayer?.prepareToPlay() 48 | audioPlayer?.volume = 0 49 | audioPlayer?.numberOfLoops = -1 // 循环播放 50 | 51 | do { 52 | // 后台播放音频 53 | try AVAudioSession.sharedInstance().setCategory(.playback, options: .mixWithOthers) 54 | } catch { 55 | 56 | } 57 | 58 | // 接受远程控制 59 | UIApplication.shared.beginReceivingRemoteControlEvents() 60 | } 61 | 62 | // 进入后台模式 63 | func applicationDidEnterBackground(_ application: UIApplication) { 64 | 65 | do { 66 | try AVAudioSession.sharedInstance().setActive(true) 67 | audioPlayer?.play() // 播放 68 | } catch { 69 | 70 | } 71 | } 72 | 73 | // APP从后台进入到前台 74 | func applicationWillEnterForeground(_ application: UIApplication) { 75 | 76 | do { 77 | try AVAudioSession.sharedInstance().setActive(false) 78 | audioPlayer?.pause() // 暂停 79 | } catch { 80 | 81 | } 82 | } 83 | } 84 | 85 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Metadata/Descriptor/FieldDescriptor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FieldDescriptor.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/7/31. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct FieldRecord { 12 | let flags: Int32 13 | var _mangledTypeName: RelativeDirectPointer 14 | var _fieldName: RelativeDirectPointer 15 | var isVar: Bool { return (flags & 0x2) == 0x2 } 16 | mutating func fieldName() -> String { return String(cString: _fieldName.advanced()) } 17 | mutating func mangledTypeName() -> String { return String(cString: _mangledTypeName.advanced()) } 18 | 19 | mutating func type(_ genericContext: UnsafeRawPointer?, 20 | _ genericArguments: UnsafeRawPointer?) -> Any.Type { 21 | let name = _mangledTypeName.advanced() 22 | return _getTypeByMangledNameInContext( 23 | name, 24 | nameLength(name), 25 | genericContext, 26 | genericArguments 27 | )! 28 | } 29 | 30 | func nameLength(_ begin: UnsafeRawPointer) -> UInt { 31 | var end = begin 32 | let size = MemoryLayout.size 33 | while true { 34 | let cur = end.load(as: UInt8.self) 35 | if cur == 0 { break } 36 | end += 1 37 | if cur <= 0x17 { 38 | end += 4 39 | } else if cur <= 0x1F { 40 | end += size 41 | } 42 | } 43 | return UInt(end - begin) 44 | } 45 | } 46 | 47 | struct FieldDescriptor { 48 | let mangledTypeName: RelativeDirectPointer 49 | let superclass: RelativeDirectPointer 50 | let _kind : UInt16 51 | let fieldRecordSize : UInt16 52 | let numFields : UInt32 53 | var fieldRecords: FieldList 54 | var kind: FieldDescriptorKind { return FieldDescriptorKind(rawValue: _kind)! } 55 | } 56 | 57 | enum FieldDescriptorKind: UInt16 { 58 | case `struct` 59 | case `class` 60 | case `enum` 61 | case multiPayloadEnum 62 | case `protocol` 63 | case classProtocol 64 | case objCProtocol 65 | case objCClass 66 | } 67 | 68 | @_silgen_name("swift_getTypeByMangledNameInContext") 69 | private func _getTypeByMangledNameInContext( 70 | _ name: UnsafePointer, 71 | _ nameLength: UInt, 72 | _ genericContext: UnsafeRawPointer?, 73 | _ genericArguments: UnsafeRawPointer?) 74 | -> Any.Type? 75 | -------------------------------------------------------------------------------- /iMemScan/Lib/Categories/UIResponder+JHRouter.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIResponder+JHRouter.h 3 | // JHKit 4 | // 5 | // Created by HaoCold on 2017/12/7. 6 | // Copyright © 2017年 HaoCold. All rights reserved. 7 | // 8 | // MIT License 9 | // 10 | // Copyright (c) 2017 xjh093 11 | // 12 | // Permission is hereby granted, free of charge, to any person obtaining a copy 13 | // of this software and associated documentation files (the "Software"), to deal 14 | // in the Software without restriction, including without limitation the rights 15 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 16 | // copies of the Software, and to permit persons to whom the Software is 17 | // furnished to do so, subject to the following conditions: 18 | // 19 | // The above copyright notice and this permission notice shall be included in all 20 | // copies or substantial portions of the Software. 21 | // 22 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 27 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 28 | // SOFTWARE. 29 | 30 | #import 31 | 32 | @interface UIResponder (JHRouter) 33 | 34 | /** 35 | if 36 | [object respondsToSelector:NSSelectorFromString(selector)] 37 | or 38 | [selector isEqualToString:@"xxx"] 39 | you should do something. 40 | 41 | if you override this method, see this example: 42 | 43 | @code 44 | - (void)jh_routerWithSelector:(NSString *)selector sender:(id)sender info:(NSDictionary *)info{ 45 | if ([self respondsToSelector:NSSelectorFromString(selector)]){ 46 | [self performSelector:NSSelectorFromString(selector) withObjects:info]; 47 | } 48 | else if ([selector isEqualToString:@"xxx"]) { 49 | // do something with info. 50 | } 51 | else{ 52 | 53 | // This is important!!! 54 | // if you can't handle it, pass it to nextResponder to handle it. 55 | 56 | [self.nextResponder jh_routerWithSelector:selector sender:sender info:info]; 57 | } 58 | } 59 | 60 | @endcode 61 | 62 | */ 63 | - (void)jh_routerWithSelector:(NSString *)selector 64 | sender:(id)sender 65 | info:(NSDictionary *)info; 66 | 67 | @end 68 | -------------------------------------------------------------------------------- /iMemScan/Lib/Categories/UIView+CGRect.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+CGRect.m 3 | // MemModify 4 | // 5 | // Created by HaoCold on 2020/6/19. 6 | // Copyright © 2020 HaoCold. All rights reserved. 7 | // 8 | 9 | #import "UIView+CGRect.h" 10 | 11 | @implementation UIView (CGRect) 12 | - (CGFloat)left { 13 | return self.frame.origin.x; 14 | } 15 | 16 | - (void)setLeft:(CGFloat)x { 17 | CGRect frame = self.frame; 18 | frame.origin.x = x; 19 | self.frame = frame; 20 | } 21 | 22 | - (CGFloat)top { 23 | return self.frame.origin.y; 24 | } 25 | 26 | - (void)setTop:(CGFloat)y { 27 | CGRect frame = self.frame; 28 | frame.origin.y = y; 29 | self.frame = frame; 30 | } 31 | 32 | - (CGFloat)right { 33 | return self.frame.origin.x + self.frame.size.width; 34 | } 35 | 36 | - (void)setRight:(CGFloat)right { 37 | CGRect frame = self.frame; 38 | frame.origin.x = right - frame.size.width; 39 | self.frame = frame; 40 | } 41 | 42 | - (CGFloat)bottom { 43 | return self.frame.origin.y + self.frame.size.height; 44 | } 45 | 46 | - (void)setBottom:(CGFloat)bottom { 47 | CGRect frame = self.frame; 48 | frame.origin.y = bottom - frame.size.height; 49 | self.frame = frame; 50 | } 51 | 52 | - (CGFloat)width { 53 | return self.frame.size.width; 54 | } 55 | 56 | - (void)setWidth:(CGFloat)width { 57 | CGRect frame = self.frame; 58 | frame.size.width = width; 59 | self.frame = frame; 60 | } 61 | 62 | - (CGFloat)height { 63 | return self.frame.size.height; 64 | } 65 | 66 | - (void)setHeight:(CGFloat)height { 67 | CGRect frame = self.frame; 68 | frame.size.height = height; 69 | self.frame = frame; 70 | } 71 | 72 | - (CGFloat)centerX { 73 | return self.center.x; 74 | } 75 | 76 | - (void)setCenterX:(CGFloat)centerX { 77 | self.center = CGPointMake(centerX, self.center.y); 78 | } 79 | 80 | - (CGFloat)centerY { 81 | return self.center.y; 82 | } 83 | 84 | - (void)setCenterY:(CGFloat)centerY { 85 | self.center = CGPointMake(self.center.x, centerY); 86 | } 87 | 88 | - (CGPoint)origin { 89 | return self.frame.origin; 90 | } 91 | 92 | - (void)setOrigin:(CGPoint)origin { 93 | CGRect frame = self.frame; 94 | frame.origin = origin; 95 | self.frame = frame; 96 | } 97 | 98 | - (CGSize)size { 99 | return self.frame.size; 100 | } 101 | 102 | - (void)setSize:(CGSize)size { 103 | CGRect frame = self.frame; 104 | frame.size = size; 105 | self.frame = frame; 106 | } 107 | @end 108 | -------------------------------------------------------------------------------- /iMemScan/Lib/KakaJSON/Extension/Array+KJ.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Array+KJ.swift 3 | // KakaJSON 4 | // 5 | // Created by MJ Lee on 2019/8/12. 6 | // Copyright © 2019 MJ Lee. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension NSArray: KJCompatible {} 12 | extension Array: KJCompatible {} 13 | extension Set: KJCompatible {} 14 | extension NSSet: KJCompatible {} 15 | 16 | public extension KJ where Base: ExpressibleByArrayLiteral & Sequence { 17 | /// JSONObjectArray -> EnumArray 18 | func enumArray(_ type: M.Type) -> [M] { 19 | return enumArray(type: type) as! [M] 20 | } 21 | 22 | /// JSONObjectArray -> EnumArray 23 | func enumArray(type: ConvertibleEnum.Type) -> [ConvertibleEnum] { 24 | guard let _ = Metadata.type(type) as? EnumType else { return [] } 25 | return base.compactMap { 26 | let vv = Values.value($0, type.kj_valueType) 27 | return type.kj_convert(from: vv as Any) 28 | } 29 | } 30 | 31 | /// JSONObjectArray -> ModelArray 32 | func modelArray(_ type: M.Type) -> [M] { 33 | return modelArray(type: type) as! [M] 34 | } 35 | 36 | /// JSONObjectArray -> ModelArray 37 | func modelArray(type: Convertible.Type) -> [Convertible] { 38 | guard let mt = Metadata.type(type) as? ModelType, 39 | let _ = mt.properties 40 | else { return [] } 41 | return base.compactMap { 42 | switch $0 { 43 | case let dict as [String: Any]: return dict.kj_fastModel(type) 44 | case let dict as Data: return dict.kj_fastModel(type) 45 | case let dict as String: return dict.kj_fastModel(type) 46 | default: return nil 47 | } 48 | } 49 | } 50 | 51 | /// ModelArray -> JSONObjectArray 52 | func JSONObjectArray() -> [[String: Any]] { 53 | return base.compactMap { 54 | ($0~! as? Convertible)?.kj_JSONObject() 55 | } 56 | } 57 | 58 | /// Array -> JSONArray 59 | func JSONArray() -> [Any] { 60 | return Values.JSONValue(base) as! [Any] 61 | } 62 | 63 | /// Array -> JSONString 64 | func JSONString(prettyPrinted: Bool = false) -> String { 65 | if let str = JSONSerialization.kj_string(JSONArray(), 66 | prettyPrinted: prettyPrinted) { 67 | return str 68 | } 69 | Logger.error("Failed to get JSONString from JSON.") 70 | return "" 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /iMemScan/Lib/Alamofire/HTTPMethod.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HTTPMethod.swift 3 | // 4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | // 24 | 25 | /// Type representing HTTP methods. Raw `String` value is stored and compared case-sensitively, so 26 | /// `HTTPMethod.get != HTTPMethod(rawValue: "get")`. 27 | /// 28 | /// See https://tools.ietf.org/html/rfc7231#section-4.3 29 | public struct HTTPMethod: RawRepresentable, Equatable, Hashable { 30 | /// `CONNECT` method. 31 | public static let connect = HTTPMethod(rawValue: "CONNECT") 32 | /// `DELETE` method. 33 | public static let delete = HTTPMethod(rawValue: "DELETE") 34 | /// `GET` method. 35 | public static let get = HTTPMethod(rawValue: "GET") 36 | /// `HEAD` method. 37 | public static let head = HTTPMethod(rawValue: "HEAD") 38 | /// `OPTIONS` method. 39 | public static let options = HTTPMethod(rawValue: "OPTIONS") 40 | /// `PATCH` method. 41 | public static let patch = HTTPMethod(rawValue: "PATCH") 42 | /// `POST` method. 43 | public static let post = HTTPMethod(rawValue: "POST") 44 | /// `PUT` method. 45 | public static let put = HTTPMethod(rawValue: "PUT") 46 | /// `TRACE` method. 47 | public static let trace = HTTPMethod(rawValue: "TRACE") 48 | 49 | public let rawValue: String 50 | 51 | public init(rawValue: String) { 52 | self.rawValue = rawValue 53 | } 54 | } 55 | --------------------------------------------------------------------------------