├── README.md ├── Sunday.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcuserdata │ └── qyc.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ └── xcschememanagement.plist ├── Sunday ├── PatternFind.h ├── PatternFind.mm ├── Sunday.h └── main.mm └── SundaySratic.xcodeproj ├── project.pbxproj ├── project.xcworkspace ├── contents.xcworkspacedata ├── xcshareddata │ ├── IDEWorkspaceChecks.plist │ └── WorkspaceSettings.xcsettings └── xcuserdata │ └── qyc.xcuserdatad │ └── WorkspaceSettings.xcsettings ├── xcshareddata └── xcschemes │ └── SundaySratic.xcscheme └── xcuserdata └── qyc.xcuserdatad └── xcschemes └── xcschememanagement.plist /README.md: -------------------------------------------------------------------------------- 1 | # Sunday 2 | 3 | X64dbg Sunday 查找算法 macOS 移植版 4 | 5 | **★★★★★庆祝飘云阁论坛成立19周年★★★★★** 6 | 7 | 自转 macOS 以来,感谢C版的一路指导,学习到了不少相关知识,好东西要分享,为自己留下一点痕迹。你觉得帮到了你,请点亮小星星 ★ 8 | 9 | 在 @implementation 的入口有一个神奇的函数: 10 | 11 | +(void)load { 12 | //发挥你超级想象力 13 | } 14 | 15 | 当你把它变成 .dylib 时,你就是神一般的存在了,注载这个软件的生与死! -------------------------------------------------------------------------------- /Sunday.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 56; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1B74A59F2AED537400236F7A /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1B74A59E2AED537400236F7A /* main.mm */; }; 11 | 1B74A5A72AEF6B7B00236F7A /* PatternFind.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1B74A5A62AEF6B7B00236F7A /* PatternFind.mm */; }; 12 | /* End PBXBuildFile section */ 13 | 14 | /* Begin PBXCopyFilesBuildPhase section */ 15 | 1B74A5992AED537400236F7A /* CopyFiles */ = { 16 | isa = PBXCopyFilesBuildPhase; 17 | buildActionMask = 2147483647; 18 | dstPath = /usr/share/man/man1/; 19 | dstSubfolderSpec = 0; 20 | files = ( 21 | ); 22 | runOnlyForDeploymentPostprocessing = 1; 23 | }; 24 | /* End PBXCopyFilesBuildPhase section */ 25 | 26 | /* Begin PBXFileReference section */ 27 | 1B74A59B2AED537400236F7A /* Sunday */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Sunday; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | 1B74A59E2AED537400236F7A /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; 29 | 1B74A5A52AED541E00236F7A /* Sunday.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sunday.h; sourceTree = ""; }; 30 | 1B74A5A62AEF6B7B00236F7A /* PatternFind.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = PatternFind.mm; sourceTree = ""; }; 31 | 1B74A5A82AEF6BAF00236F7A /* PatternFind.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PatternFind.h; sourceTree = ""; }; 32 | /* End PBXFileReference section */ 33 | 34 | /* Begin PBXFrameworksBuildPhase section */ 35 | 1B74A5982AED537400236F7A /* Frameworks */ = { 36 | isa = PBXFrameworksBuildPhase; 37 | buildActionMask = 2147483647; 38 | files = ( 39 | ); 40 | runOnlyForDeploymentPostprocessing = 0; 41 | }; 42 | /* End PBXFrameworksBuildPhase section */ 43 | 44 | /* Begin PBXGroup section */ 45 | 1B74A5922AED537400236F7A = { 46 | isa = PBXGroup; 47 | children = ( 48 | 1B74A59D2AED537400236F7A /* Sunday */, 49 | 1B74A59C2AED537400236F7A /* Products */, 50 | ); 51 | sourceTree = ""; 52 | }; 53 | 1B74A59C2AED537400236F7A /* Products */ = { 54 | isa = PBXGroup; 55 | children = ( 56 | 1B74A59B2AED537400236F7A /* Sunday */, 57 | ); 58 | name = Products; 59 | sourceTree = ""; 60 | }; 61 | 1B74A59D2AED537400236F7A /* Sunday */ = { 62 | isa = PBXGroup; 63 | children = ( 64 | 1B74A59E2AED537400236F7A /* main.mm */, 65 | 1B74A5A52AED541E00236F7A /* Sunday.h */, 66 | 1B74A5A62AEF6B7B00236F7A /* PatternFind.mm */, 67 | 1B74A5A82AEF6BAF00236F7A /* PatternFind.h */, 68 | ); 69 | path = Sunday; 70 | sourceTree = ""; 71 | }; 72 | /* End PBXGroup section */ 73 | 74 | /* Begin PBXNativeTarget section */ 75 | 1B74A59A2AED537400236F7A /* Sunday */ = { 76 | isa = PBXNativeTarget; 77 | buildConfigurationList = 1B74A5A22AED537400236F7A /* Build configuration list for PBXNativeTarget "Sunday" */; 78 | buildPhases = ( 79 | 1B74A5972AED537400236F7A /* Sources */, 80 | 1B74A5982AED537400236F7A /* Frameworks */, 81 | 1B74A5992AED537400236F7A /* CopyFiles */, 82 | ); 83 | buildRules = ( 84 | ); 85 | dependencies = ( 86 | ); 87 | name = Sunday; 88 | productName = Sunday; 89 | productReference = 1B74A59B2AED537400236F7A /* Sunday */; 90 | productType = "com.apple.product-type.tool"; 91 | }; 92 | /* End PBXNativeTarget section */ 93 | 94 | /* Begin PBXProject section */ 95 | 1B74A5932AED537400236F7A /* Project object */ = { 96 | isa = PBXProject; 97 | attributes = { 98 | BuildIndependentTargetsInParallel = 1; 99 | LastUpgradeCheck = 1430; 100 | TargetAttributes = { 101 | 1B74A59A2AED537400236F7A = { 102 | CreatedOnToolsVersion = 14.3.1; 103 | }; 104 | }; 105 | }; 106 | buildConfigurationList = 1B74A5962AED537400236F7A /* Build configuration list for PBXProject "Sunday" */; 107 | compatibilityVersion = "Xcode 14.0"; 108 | developmentRegion = en; 109 | hasScannedForEncodings = 0; 110 | knownRegions = ( 111 | en, 112 | Base, 113 | ); 114 | mainGroup = 1B74A5922AED537400236F7A; 115 | productRefGroup = 1B74A59C2AED537400236F7A /* Products */; 116 | projectDirPath = ""; 117 | projectRoot = ""; 118 | targets = ( 119 | 1B74A59A2AED537400236F7A /* Sunday */, 120 | ); 121 | }; 122 | /* End PBXProject section */ 123 | 124 | /* Begin PBXSourcesBuildPhase section */ 125 | 1B74A5972AED537400236F7A /* Sources */ = { 126 | isa = PBXSourcesBuildPhase; 127 | buildActionMask = 2147483647; 128 | files = ( 129 | 1B74A59F2AED537400236F7A /* main.mm in Sources */, 130 | 1B74A5A72AEF6B7B00236F7A /* PatternFind.mm in Sources */, 131 | ); 132 | runOnlyForDeploymentPostprocessing = 0; 133 | }; 134 | /* End PBXSourcesBuildPhase section */ 135 | 136 | /* Begin XCBuildConfiguration section */ 137 | 1B74A5A02AED537400236F7A /* Debug */ = { 138 | isa = XCBuildConfiguration; 139 | buildSettings = { 140 | ALWAYS_SEARCH_USER_PATHS = NO; 141 | CLANG_ANALYZER_NONNULL = YES; 142 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 143 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 144 | CLANG_ENABLE_MODULES = YES; 145 | CLANG_ENABLE_OBJC_ARC = YES; 146 | CLANG_ENABLE_OBJC_WEAK = YES; 147 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 148 | CLANG_WARN_BOOL_CONVERSION = YES; 149 | CLANG_WARN_COMMA = YES; 150 | CLANG_WARN_CONSTANT_CONVERSION = YES; 151 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 152 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 153 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 154 | CLANG_WARN_EMPTY_BODY = YES; 155 | CLANG_WARN_ENUM_CONVERSION = YES; 156 | CLANG_WARN_INFINITE_RECURSION = YES; 157 | CLANG_WARN_INT_CONVERSION = YES; 158 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 159 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 160 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 161 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 162 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 163 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 164 | CLANG_WARN_STRICT_PROTOTYPES = YES; 165 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 166 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 167 | CLANG_WARN_UNREACHABLE_CODE = YES; 168 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 169 | COPY_PHASE_STRIP = NO; 170 | DEBUG_INFORMATION_FORMAT = dwarf; 171 | ENABLE_STRICT_OBJC_MSGSEND = YES; 172 | ENABLE_TESTABILITY = YES; 173 | GCC_C_LANGUAGE_STANDARD = gnu11; 174 | GCC_DYNAMIC_NO_PIC = NO; 175 | GCC_NO_COMMON_BLOCKS = YES; 176 | GCC_OPTIMIZATION_LEVEL = 0; 177 | GCC_PREPROCESSOR_DEFINITIONS = ( 178 | "DEBUG=1", 179 | "$(inherited)", 180 | ); 181 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 182 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 183 | GCC_WARN_UNDECLARED_SELECTOR = YES; 184 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 185 | GCC_WARN_UNUSED_FUNCTION = YES; 186 | GCC_WARN_UNUSED_VARIABLE = YES; 187 | MACOSX_DEPLOYMENT_TARGET = 13.3; 188 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 189 | MTL_FAST_MATH = YES; 190 | ONLY_ACTIVE_ARCH = YES; 191 | SDKROOT = macosx; 192 | }; 193 | name = Debug; 194 | }; 195 | 1B74A5A12AED537400236F7A /* Release */ = { 196 | isa = XCBuildConfiguration; 197 | buildSettings = { 198 | ALWAYS_SEARCH_USER_PATHS = NO; 199 | CLANG_ANALYZER_NONNULL = YES; 200 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 201 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 202 | CLANG_ENABLE_MODULES = YES; 203 | CLANG_ENABLE_OBJC_ARC = YES; 204 | CLANG_ENABLE_OBJC_WEAK = YES; 205 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 206 | CLANG_WARN_BOOL_CONVERSION = YES; 207 | CLANG_WARN_COMMA = YES; 208 | CLANG_WARN_CONSTANT_CONVERSION = YES; 209 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 210 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 211 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 212 | CLANG_WARN_EMPTY_BODY = YES; 213 | CLANG_WARN_ENUM_CONVERSION = YES; 214 | CLANG_WARN_INFINITE_RECURSION = YES; 215 | CLANG_WARN_INT_CONVERSION = YES; 216 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 217 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 218 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 219 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 220 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 221 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 222 | CLANG_WARN_STRICT_PROTOTYPES = YES; 223 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 224 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 225 | CLANG_WARN_UNREACHABLE_CODE = YES; 226 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 227 | COPY_PHASE_STRIP = NO; 228 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 229 | ENABLE_NS_ASSERTIONS = NO; 230 | ENABLE_STRICT_OBJC_MSGSEND = YES; 231 | GCC_C_LANGUAGE_STANDARD = gnu11; 232 | GCC_NO_COMMON_BLOCKS = YES; 233 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 234 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 235 | GCC_WARN_UNDECLARED_SELECTOR = YES; 236 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 237 | GCC_WARN_UNUSED_FUNCTION = YES; 238 | GCC_WARN_UNUSED_VARIABLE = YES; 239 | MACOSX_DEPLOYMENT_TARGET = 13.3; 240 | MTL_ENABLE_DEBUG_INFO = NO; 241 | MTL_FAST_MATH = YES; 242 | SDKROOT = macosx; 243 | }; 244 | name = Release; 245 | }; 246 | 1B74A5A32AED537400236F7A /* Debug */ = { 247 | isa = XCBuildConfiguration; 248 | buildSettings = { 249 | CODE_SIGN_STYLE = Automatic; 250 | MACOSX_DEPLOYMENT_TARGET = 10.13; 251 | PRODUCT_NAME = "$(TARGET_NAME)"; 252 | }; 253 | name = Debug; 254 | }; 255 | 1B74A5A42AED537400236F7A /* Release */ = { 256 | isa = XCBuildConfiguration; 257 | buildSettings = { 258 | CODE_SIGN_STYLE = Automatic; 259 | MACOSX_DEPLOYMENT_TARGET = 10.13; 260 | PRODUCT_NAME = "$(TARGET_NAME)"; 261 | }; 262 | name = Release; 263 | }; 264 | /* End XCBuildConfiguration section */ 265 | 266 | /* Begin XCConfigurationList section */ 267 | 1B74A5962AED537400236F7A /* Build configuration list for PBXProject "Sunday" */ = { 268 | isa = XCConfigurationList; 269 | buildConfigurations = ( 270 | 1B74A5A02AED537400236F7A /* Debug */, 271 | 1B74A5A12AED537400236F7A /* Release */, 272 | ); 273 | defaultConfigurationIsVisible = 0; 274 | defaultConfigurationName = Release; 275 | }; 276 | 1B74A5A22AED537400236F7A /* Build configuration list for PBXNativeTarget "Sunday" */ = { 277 | isa = XCConfigurationList; 278 | buildConfigurations = ( 279 | 1B74A5A32AED537400236F7A /* Debug */, 280 | 1B74A5A42AED537400236F7A /* Release */, 281 | ); 282 | defaultConfigurationIsVisible = 0; 283 | defaultConfigurationName = Release; 284 | }; 285 | /* End XCConfigurationList section */ 286 | }; 287 | rootObject = 1B74A5932AED537400236F7A /* Project object */; 288 | } 289 | -------------------------------------------------------------------------------- /Sunday.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Sunday.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Sunday.xcodeproj/xcuserdata/qyc.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /Sunday.xcodeproj/xcuserdata/qyc.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Sunday.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 1B74A59A2AED537400236F7A 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Sunday/PatternFind.h: -------------------------------------------------------------------------------- 1 | // 2 | // PatternFind.h 3 | // Sunday 4 | // 5 | // Created by qyc on 2023/10/30. 6 | // 7 | 8 | #ifndef PatternFind_h 9 | #define PatternFind_h 10 | 11 | 12 | #import 13 | #import 14 | #import 15 | #import 16 | #import 17 | #import 18 | #import 19 | #import 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include 34 | #include 35 | 36 | #define Sunday_int64 uint64_t 37 | 38 | void* emalloc(size_t size, const char* reason = "emalloc:???"); 39 | void efree(void* ptr, const char* reason = "efree:???"); 40 | 41 | template 42 | class Memory 43 | { 44 | public: 45 | // 46 | // This class guarantees that the returned allocated memory 47 | // will always be zeroed 48 | // 49 | explicit Memory(const char* Reason = "Memory:???") 50 | { 51 | m_Ptr = nullptr; 52 | m_Size = 0; 53 | m_Reason = Reason; 54 | } 55 | 56 | explicit Memory(size_t Size, const char* Reason = "Memory:???") 57 | { 58 | m_Ptr = reinterpret_cast(emalloc(Size)); 59 | m_Size = Size; 60 | m_Reason = Reason; 61 | 62 | memset(m_Ptr, 0, Size); 63 | } 64 | 65 | ~Memory() 66 | { 67 | if (m_Ptr) 68 | efree(m_Ptr); 69 | } 70 | 71 | T operator()() 72 | { 73 | return m_Ptr; 74 | } 75 | 76 | private: 77 | T m_Ptr; 78 | size_t m_Size; 79 | const char* m_Reason; 80 | }; 81 | 82 | 83 | 84 | //@interface PatternFind: NSObject 85 | 86 | struct PatternByte 87 | { 88 | struct PatternNibble 89 | { 90 | unsigned char data; 91 | bool wildcard; 92 | } nibble[2]; 93 | }; 94 | 95 | 96 | 97 | void trim(char* lpStr); 98 | 99 | //returns: offset to data when found, -1 when not found 100 | size_t patternfind( 101 | const unsigned char* data, //data 102 | size_t datasize, //size of data 103 | const char* pattern, //pattern to search 104 | int* patternsize = 0 //outputs the number of bytes the pattern is 105 | ); 106 | 107 | //returns: offset to data when found, -1 when not found 108 | size_t patternfind( 109 | const unsigned char* data, //data 110 | size_t datasize, //size of data 111 | unsigned char* pattern, //bytes to search 112 | size_t patternsize //size of bytes to search 113 | ); 114 | 115 | //returns: nothing 116 | void patternwrite( 117 | unsigned char* data, //data 118 | size_t datasize, //size of data 119 | const char* pattern //pattern to write 120 | ); 121 | 122 | //returns: true on success, false on failure 123 | bool patternsnr( 124 | unsigned char* data, //data 125 | size_t datasize, //size of data 126 | const char* searchpattern, //pattern to search 127 | const char* replacepattern //pattern to write 128 | ); 129 | 130 | //returns: true on success, false on failure 131 | bool patterntransform(const std::string & patterntext, //pattern string 132 | std::vector & pattern //pattern to feed to patternfind 133 | ); 134 | 135 | //returns: offset to data when found, -1 when not found 136 | size_t patternfind( 137 | const unsigned char* data, //data 138 | size_t datasize, //size of data 139 | const std::vector & pattern //pattern to search 140 | ); 141 | 142 | int strtohex(char *lpStr, unsigned char *cbuf, int len); 143 | 144 | bool Patch_Code(void* patch_addr, uint8_t* patch_data, int patch_data_size); 145 | 146 | std::vector X64dbgSundayFind(char* Value, Sunday_int64 Start = 0, Sunday_int64 End = 0 , size_t maxFind = 0);//private: 注意,永远不要手动调用下面的函数 147 | 148 | //@end 149 | 150 | #endif /* PatternFind_h */ 151 | -------------------------------------------------------------------------------- /Sunday/PatternFind.mm: -------------------------------------------------------------------------------- 1 | // 2 | // PatternFind.m 3 | // Sunday 4 | // 5 | // Created by qyc on 2023/10/30. 6 | // 7 | 8 | #import 9 | #import "PatternFind.h" 10 | 11 | static inline bool isHex(char ch) 12 | { 13 | return (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f'); 14 | } 15 | 16 | static inline std::string formathexpattern(const std::string & patterntext) 17 | { 18 | std::string result; 19 | int len = (int)patterntext.length(); 20 | for(int i = 0; i < len; i++) 21 | if(patterntext[i] == '?' || isHex(patterntext[i])) 22 | result += patterntext[i]; 23 | return result; 24 | } 25 | 26 | static inline int hexchtoint(char ch) 27 | { 28 | if(ch >= '0' && ch <= '9') 29 | return ch - '0'; 30 | else if(ch >= 'A' && ch <= 'F') 31 | return ch - 'A' + 10; 32 | else if(ch >= 'a' && ch <= 'f') 33 | return ch - 'a' + 10; 34 | return -1; 35 | } 36 | 37 | bool patterntransform(const std::string & patterntext, std::vector & pattern) 38 | { 39 | pattern.clear(); 40 | std::string formattext = formathexpattern(patterntext); 41 | int len = (int)formattext.length(); 42 | if(!len) 43 | return false; 44 | 45 | if(len % 2) //not a multiple of 2 46 | { 47 | formattext += '?'; 48 | len++; 49 | } 50 | 51 | /*PatternByte newByte;*/ 52 | PatternByte newByte = {}; 53 | for(int i = 0, j = 0; i < len; i++) 54 | { 55 | if(formattext[i] == '?') //wildcard 56 | { 57 | newByte.nibble[j].wildcard = true; //match anything 58 | } 59 | else //hex 60 | { 61 | newByte.nibble[j].wildcard = false; 62 | newByte.nibble[j].data = hexchtoint(formattext[i]) & 0xF; 63 | } 64 | 65 | j++; 66 | if(j == 2) //two nibbles = one byte 67 | { 68 | j = 0; 69 | pattern.push_back(newByte); 70 | } 71 | } 72 | return true; 73 | } 74 | 75 | static inline bool patternmatchbyte(unsigned char byte, const PatternByte & pbyte) 76 | { 77 | int matched = 0; 78 | 79 | unsigned char n1 = (byte >> 4) & 0xF; 80 | if(pbyte.nibble[0].wildcard) 81 | matched++; 82 | else if(pbyte.nibble[0].data == n1) 83 | matched++; 84 | 85 | unsigned char n2 = byte & 0xF; 86 | if(pbyte.nibble[1].wildcard) 87 | matched++; 88 | else if(pbyte.nibble[1].data == n2) 89 | matched++; 90 | 91 | return (matched == 2); 92 | } 93 | 94 | size_t patternfind(const unsigned char* data, size_t datasize, unsigned char* pattern, size_t patternsize) 95 | { 96 | if(patternsize > datasize) 97 | patternsize = datasize; 98 | for(size_t i = 0, pos = 0; i < datasize; i++) 99 | { 100 | if(data[i] == pattern[pos]) 101 | { 102 | pos++; 103 | if(pos == patternsize) 104 | return i - patternsize + 1; 105 | } 106 | else if(pos > 0) 107 | { 108 | i -= pos; 109 | pos = 0; //reset current pattern position 110 | } 111 | } 112 | return -1; 113 | } 114 | 115 | static inline void patternwritebyte(unsigned char* byte, const PatternByte & pbyte) 116 | { 117 | unsigned char n1 = (*byte >> 4) & 0xF; 118 | unsigned char n2 = *byte & 0xF; 119 | if(!pbyte.nibble[0].wildcard) 120 | n1 = pbyte.nibble[0].data; 121 | if(!pbyte.nibble[1].wildcard) 122 | n2 = pbyte.nibble[1].data; 123 | *byte = ((n1 << 4) & 0xF0) | (n2 & 0xF); 124 | } 125 | 126 | void patternwrite(unsigned char* data, size_t datasize, const char* pattern) 127 | { 128 | std::vector writepattern; 129 | std::string patterntext(pattern); 130 | if(!patterntransform(patterntext, writepattern)) 131 | return; 132 | size_t writepatternsize = writepattern.size(); 133 | if(writepatternsize > datasize) 134 | writepatternsize = datasize; 135 | for(size_t i = 0; i < writepatternsize; i++) 136 | patternwritebyte(&data[i], writepattern.at(i)); 137 | } 138 | 139 | bool patternsnr(unsigned char* data, size_t datasize, const char* searchpattern, const char* replacepattern) 140 | { 141 | size_t found = patternfind(data, datasize, searchpattern); 142 | if(found == -1) 143 | return false; 144 | patternwrite(data + found, datasize - found, replacepattern); 145 | return true; 146 | } 147 | 148 | size_t patternfind(const unsigned char* data, size_t datasize, const char* pattern, int* patternsize) 149 | { 150 | std::string patterntext(pattern); 151 | std::vector searchpattern; 152 | if (!patterntransform(patterntext, searchpattern)) 153 | return -1; 154 | return patternfind(data, datasize, searchpattern); 155 | } 156 | 157 | size_t patternfind(const unsigned char* data, size_t datasize, const std::vector & pattern) 158 | { 159 | size_t searchpatternsize = pattern.size(); 160 | for(size_t i = 0, pos = 0; i < datasize; i++) //search for the pattern 161 | { 162 | if(patternmatchbyte(data[i], pattern.at(pos))) //check if our pattern matches the current byte 163 | { 164 | pos++; 165 | if(pos == searchpatternsize) //everything matched 166 | return i - searchpatternsize + 1; 167 | } 168 | else if(pos > 0) //fix by Computer_Angel 169 | { 170 | i -= pos; 171 | pos = 0; //reset current pattern position 172 | } 173 | } 174 | return -1; 175 | } 176 | 177 | static int emalloc_count = 0; 178 | 179 | void* emalloc(size_t size, const char* reason) 180 | { 181 | unsigned char* a = (unsigned char*)malloc(size); 182 | if (!a) 183 | { 184 | printf("Error:Could not allocate memory\n"); 185 | return 0; 186 | } 187 | memset(a, 0, size); 188 | emalloc_count++; 189 | /* 190 | FILE* file = fopen(alloctrace, "a+"); 191 | fprintf(file, "DBG%.5d: alloc:" fhex ":%s:" fhex "\n", emalloc_count, a, reason, size); 192 | fclose(file); 193 | */ 194 | return a; 195 | } 196 | 197 | void efree(void* ptr, const char* reason) 198 | { 199 | emalloc_count--; 200 | /* 201 | FILE* file = fopen(alloctrace, "a+"); 202 | fprintf(file, "DBG%.5d: free:" fhex ":%s\n", emalloc_count, ptr, reason); 203 | fclose(file); 204 | */ 205 | //GlobalFree(ptr); 206 | free(ptr); 207 | } 208 | 209 | char* convertStringToHex(char* value) 210 | { 211 | if (isHex(value[0])) { 212 | // 如果输入值已经是十六进制,则直接返回 213 | return value; 214 | } 215 | else { 216 | // 将非十六进制字符串转换为十六进制 217 | std::stringstream hexStream; 218 | hexStream << std::hex << std::setfill('0'); 219 | for (int i = 0; value[i] != '\0'; ++i) { 220 | hexStream << std::setw(2) << static_cast(value[i]); 221 | } 222 | std::string hexCode = hexStream.str(); 223 | char* result = new char[hexCode.length() + 1]; 224 | std::strcpy(result, hexCode.c_str()); 225 | return result; 226 | } 227 | } 228 | 229 | //新的 230 | std::vector X64dbgSundayFind(char* Value, Sunday_int64 Start, Sunday_int64 End, size_t maxFind) 231 | { 232 | std::vector SaveArray; 233 | Sunday_int64 SegmentSize = 0; 234 | 235 | char* converted = convertStringToHex(Value); 236 | 237 | trim(converted);//去除空格 238 | size_t dx = strlen(converted);//获取去除空格后字符数 239 | if (dx % 2 == 0){//判断奇偶数 240 | if (End != 0 || Start != 0 || Start > End){ 241 | SegmentSize = End - Start ;//计算区段大小 242 | Memory data(SegmentSize);//申请内存空间 243 | memcpy(reinterpret_cast(data()), reinterpret_cast(Start), SegmentSize); 244 | size_t foundOffset = 0; 245 | size_t foundCount = static_cast(SaveArray.size()); 246 | size_t i = 0; 247 | while (true) { 248 | foundOffset = static_cast(patternfind(data() + i, SegmentSize - i, converted)); 249 | if (foundOffset == -1) 250 | break; 251 | 252 | i += foundOffset + 1; 253 | size_t foundIndex = static_cast(Start + i - 1); 254 | SaveArray.push_back(foundIndex); 255 | foundCount++; 256 | 257 | if (maxFind > 0 && foundCount >= maxFind) 258 | break; 259 | } 260 | } 261 | } 262 | return SaveArray; 263 | } 264 | 265 | 266 | /************************************************************************/ 267 | /* 函数名称: trim */ 268 | /* 函数功能: 删除空格--指针操作 */ 269 | /* 输入参数: lpStr 字符串指针 */ 270 | /* 输出参数: 0成功 -1失败 */ 271 | /* 函数作者: 飘云/P.Y.G http://www.chinapyg.com */ 272 | /* 编写时间: 2014-11-02 */ 273 | /************************************************************************/ 274 | void trim(char * lpStr) 275 | { 276 | char *p1, *p2; 277 | p1 = p2 = lpStr; // 初值 278 | while (*p2) 279 | { 280 | if (*p2 != ' ') 281 | *p1++ = *p2++; 282 | else 283 | p2++; // 跳过空格 284 | } 285 | *p1 = '\0'; // 补上结束符 286 | //return p; 287 | } 288 | 289 | /************************************************************************/ 290 | /* 函数名称: str_to_hex */ 291 | /* 函数功能: 字符串转换为十六进制 */ 292 | /* 输入参数: lpStr 字符串指针 cbuf 十六进制 len 字符串的长度 */ 293 | /* 输出参数: 0成功 -1失败 */ 294 | /* 函数作者: 飘云/P.Y.G http://www.chinapyg.com */ 295 | /* 编写时间: 2014-11-02 */ 296 | /************************************************************************/ 297 | int strtohex(char *lpStr, unsigned char *cbuf, int len) 298 | { 299 | Byte high, low; 300 | int idx, ii=0; 301 | for (idx=0; idx='0' && high<='9') 307 | high = high-'0'; 308 | else if(high>='A' && high<='F') 309 | high = high - 'A' + 10; 310 | else if(high>='a' && high<='f') 311 | high = high - 'a' + 10; 312 | else 313 | return -1; 314 | 315 | if(low>='0' && low<='9') 316 | low = low-'0'; 317 | else if(low>='A' && low<='F') 318 | low = low - 'A' + 10; 319 | else if(low>='a' && low<='f') 320 | low = low - 'a' + 10; 321 | else 322 | return -1; 323 | 324 | cbuf[ii++] = high<<4 | low; 325 | } 326 | return 0; 327 | } 328 | 329 | bool Patch_Code(void* patch_addr, uint8_t* patch_data, int patch_data_size) 330 | { 331 | // init value 332 | kern_return_t kret; 333 | task_t self_task = (task_t)mach_task_self(); 334 | 335 | /* Set platform binary flag */ 336 | #define FLAG_PLATFORMIZE (1 << 1) 337 | 338 | // platformize_me 339 | // https://github.com/pwn20wndstuff/Undecimus/issues/112 340 | /* 341 | 342 | void* handle = (void*)dlopen("/usr/lib/libjailbreak.dylib", RTLD_LAZY); 343 | if (!handle){ 344 | //[retStr appendString:@"[-] /usr/lib/libjailbreak.dylib dlopen failed!\n"]; 345 | return false; 346 | } 347 | 348 | // Reset errors 349 | (const char *)dlerror(); 350 | typedef void (*fix_entitle_prt_t)(pid_t pid, uint32_t what); 351 | fix_entitle_prt_t ptr = (fix_entitle_prt_t)dlsym(handle, "jb_oneshot_entitle_now"); 352 | 353 | const char *dlsym_error = (const char *)dlerror(); 354 | if (dlsym_error) return; 355 | 356 | ptr((pid_t)getpid(), FLAG_PLATFORMIZE); 357 | //[retStr appendString:@"\n[+] platformize me success!"]; 358 | 359 | */ 360 | 361 | void* target_addr = patch_addr; 362 | 363 | // 1. get target address page and patch offset 364 | unsigned long page_start = (unsigned long) (target_addr) & ~PAGE_MASK; 365 | unsigned long patch_offset = (unsigned long)target_addr - page_start; 366 | 367 | // map new page for patch 368 | void *new_page = (void *)mmap(NULL, PAGE_SIZE, 0x1 | 0x2, 0x1000 | 0x0001, -1, 0); 369 | if (!new_page ){ 370 | //[retStr appendString:@"[-] mmap failed!\n"]; 371 | return false; 372 | } 373 | 374 | kret = (kern_return_t)vm_copy(self_task, (unsigned long)page_start, PAGE_SIZE, (vm_address_t) new_page); 375 | if (kret != KERN_SUCCESS){ 376 | //[retStr appendString:@"[-] vm_copy faild!\n"]; 377 | return false; 378 | } 379 | 380 | // 4. start patch 381 | /* 382 | nop -> {0x1f, 0x20, 0x03, 0xd5} 383 | ret -> {0xc0, 0x03, 0x5f, 0xd6} 384 | */ 385 | // char patch_ins_data[4] = {0x1f, 0x20, 0x03, 0xd5}; 386 | // mach_vm_write(task_self, (vm_address_t)(new+patch_offset), patch_ret_ins_data, 4); 387 | memcpy((void *)((uint64_t)new_page+patch_offset), patch_data, patch_data_size); 388 | //[retStr appendString:@"[+] patch ret[0xc0 0x03 0x5f 0xd6] with memcpy\n"]; 389 | 390 | // set back to r-x 391 | int mpt = (int)mprotect(new_page, PAGE_SIZE, PROT_READ | PROT_EXEC); 392 | if (mpt != KERN_SUCCESS){ 393 | //[retStr appendString:@"[*] set new page back to r-x success!\n"]; 394 | return false; 395 | } 396 | 397 | // remap 398 | vm_prot_t prot; 399 | vm_inherit_t inherit; 400 | 401 | // get page info 402 | vm_address_t region = (vm_address_t) page_start; 403 | vm_size_t region_len = 0; 404 | struct vm_region_submap_short_info_64 vm_info; 405 | mach_msg_type_number_t info_count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64; 406 | natural_t max_depth = 99999; 407 | kret = (kern_return_t)vm_region_recurse_64(self_task, ®ion, ®ion_len, 408 | &max_depth, 409 | (vm_region_recurse_info_t) &vm_info, 410 | &info_count); 411 | if (kret != KERN_SUCCESS){ 412 | //[retStr appendString:@"[-] vm_region_recurse_64 faild!\n"]; 413 | return false; 414 | } 415 | 416 | prot = vm_info.protection & (PROT_READ | PROT_WRITE | PROT_EXEC); 417 | inherit = vm_info.inheritance; 418 | //[retStr appendString:@"[*] get page info done.\n"]; 419 | 420 | vm_prot_t c; 421 | vm_prot_t m; 422 | mach_vm_address_t target = (mach_vm_address_t)page_start; 423 | 424 | kret = (kern_return_t)mach_vm_remap(self_task, &target, PAGE_SIZE, 0, 425 | VM_FLAGS_OVERWRITE, self_task, 426 | (mach_vm_address_t) new_page, true, 427 | &c, &m, inherit); 428 | if (kret != KERN_SUCCESS){ 429 | //[retStr appendString:@"[-] remap mach_vm_remap faild!\n"]; 430 | return false; 431 | } 432 | //[retStr appendString:@"[+] remap to target success!\n"]; 433 | 434 | // clear cache 435 | void* clear_start_ = (void*)(page_start + patch_offset); 436 | sys_icache_invalidate(clear_start_, 4); 437 | sys_dcache_flush(clear_start_, 4); 438 | 439 | return true; 440 | }; 441 | -------------------------------------------------------------------------------- /Sunday/Sunday.h: -------------------------------------------------------------------------------- 1 | 2 | @interface Sunday: NSObject 3 | 4 | @end 5 | -------------------------------------------------------------------------------- /Sunday/main.mm: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Sunday 4 | // 5 | // Created by qyc on 2023/10/28. 6 | // 7 | 8 | #import 9 | #import "PatternFind.h" 10 | #import "Sunday.h" 11 | 12 | #ifdef DEBUG 13 | #define DebugLog(fmt, ...) NSLog((@"[DEBUG] " fmt), ##__VA_ARGS__) 14 | #else 15 | #define DebugLog(fmt, ...) 16 | #endif 17 | 18 | int main(int argc, const char * argv[]) { 19 | @autoreleasepool { 20 | // insert code here... 21 | NSLog(@"[+] Hello, World!"); 22 | NSLog(@"[+] 你好,世界!"); 23 | } 24 | return 0; 25 | } 26 | 27 | @implementation Sunday 28 | 29 | +(void)load { 30 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 31 | //遍历自身加载的dylib--获取载入地址和ASLR地址等 32 | DebugLog(@"[+] Dyld image count is: %d.\n", _dyld_image_count()); 33 | for (int i = 0; i < _dyld_image_count(); i++) { 34 | char *image_name = (char *)_dyld_get_image_name(i); 35 | const struct mach_header *mh = _dyld_get_image_header(i); 36 | intptr_t vmaddr_slide = _dyld_get_image_vmaddr_slide(i); 37 | //过滤想要的库 38 | if (strstr(image_name, "Sunday") != NULL) { 39 | 40 | DebugLog(@"[+] Image name %s at address 0x%llx and ASLR slide 0x%lx.\n",image_name, (mach_vm_address_t)mh, vmaddr_slide); 41 | 42 | uint64_t size1 = 0; 43 | char *referencesSection1 = getsectdatafromheader_64((struct mach_header_64 *)mh,"__TEXT", "__text", &size1); 44 | DebugLog(@"[+] getsectdatafromheader_64$__TEXT$__text:%p\n", (void *)referencesSection1); 45 | char *StartAddr__ = referencesSection1 + vmaddr_slide; //这才是真实要访问的地址。 46 | DebugLog(@"[+] $__TEXT$__text_start + vmaddr_slide:%p\n", (void *)StartAddr__); 47 | uint64_t StartAddr = reinterpret_cast(StartAddr__); 48 | 49 | uint64_t size2 = 0; 50 | char *referencesSection2 = getsectdatafromheader_64((struct mach_header_64 *)mh,"__DATA", "__data", &size2); 51 | DebugLog(@"[+] getsectdatafromheader_64$__DATA$__data:%p\n", (void *)referencesSection2); 52 | char *StartEnd__ = referencesSection2 + vmaddr_slide; //这才是真实要访问的地址。 53 | DebugLog(@"[+] $__DATA$__data_end + vmaddr_slide:%p\n", (void *)StartEnd__); 54 | uint64_t StartEnd = reinterpret_cast(StartEnd__); 55 | 56 | 57 | #if defined (__arm64__) 58 | DebugLog(@"[+] runing arm64 64-bit [__arm64__ arch]\n"); 59 | #elif defined(__x86_64__) 60 | DebugLog(@"[+] runing x86_64 64-bit [__x86_64__ arch]\n"); 61 | #endif 62 | 63 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 64 | // const wchar_t* UTF16_FeatureCode = L"你好,世界!";//长度必须为2的倍数 65 | // size_t len = wcslen(UTF16_FeatureCode); 66 | // char* FeatureCode = (char*)malloc((len * 5 + 1) * sizeof(char)); // 预留足够的空间来存储转换后的结果 67 | // FeatureCode[0] = '\0'; // 初始化结果字符串为空 68 | // setlocale(LC_ALL, ""); // 设置本地化环境以支持宽字符转换 69 | // for (int i = 0; i < len; i++) { 70 | // wchar_t swapped = ((UTF16_FeatureCode[i] & 0xFF) << 8) | ((UTF16_FeatureCode[i] & 0xFF00) >> 8); 71 | // snprintf(FeatureCode + strlen(FeatureCode), (len * 5 + 1) - strlen(FeatureCode), "%04X", swapped); // 将转换后的结果拼接到结果字符串中 72 | // } 73 | // //DebugLog(@"[+] %s\n", FeatureCode); 74 | // //free(FeatureCode); // 释放动态分配的内存 75 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 76 | // char FeatureCode[] = "Hello, World!";//长度必须为2的倍数 77 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 78 | // char FeatureCode[100] = "83 F? 1D 7?";//长度必须为2的倍数 79 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 80 | char FeatureCode[] = "48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21";//长度必须为2的倍数 81 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 82 | std::vector addr = X64dbgSundayFind(FeatureCode, StartAddr, StartEnd, 0); 83 | // 返回vector数组 ⬅️= 1️⃣特征码,2️⃣起始位置 0x0000000000000000,3️⃣结束位置 0x7FFFFFFFFFFFFFFF,4️⃣控制搜索次数(0则为无限搜索到结束) 84 | if (addr.size() != 0){ 85 | for (size_t i = 0; i < addr.size(); i++){ 86 | 87 | uintptr_t ptr = (uintptr_t)addr[i]; 88 | unsigned char* bytePtr = (unsigned char*)ptr; 89 | int numBytes = 13; // 读取的字节数 90 | char hexString[numBytes * 2 + 1]; // 存储十六进制字符串的变量 91 | for (int i = 0; i < numBytes; i++) {// 读取指针地址指向的内容 92 | snprintf(hexString + (i * 2), 3, "%02X", *(bytePtr + i)); 93 | } 94 | DebugLog(@"[+] 结果地址%zu: %p 指针内存:-> %s -> %s\n",i, (char*)(uintptr_t)addr[i] ,hexString,(char*)(uintptr_t)addr[i]); 95 | 96 | } 97 | 98 | //方式1 99 | char PatchCode[] ="48 65 6C 6C 6F 2C 20 50 59 47 21 00";//破解 100 | trim(PatchCode);// 去除空格 101 | int iBufSize = (int)strlen(PatchCode)/2;// 缓冲区大小 102 | void *lpBuf = malloc(iBufSize); 103 | memset(lpBuf, 0, iBufSize); 104 | strtohex(PatchCode, (Byte *)lpBuf, (int)strlen(PatchCode)); 105 | bool abok = Patch_Code((void *)addr[0],(uint8_t *)lpBuf,iBufSize); 106 | 107 | //方式2 108 | char PatchCodeStr[] ="Hello, PYG!!!"; 109 | abok = Patch_Code((void *)addr[0],(uint8_t *)PatchCodeStr,sizeof(PatchCodeStr)); 110 | 111 | if (abok == true) { 112 | DebugLog(@"[+] Patch Successfully : %d",abok); 113 | }else{ 114 | NSLog(@"[+] Patch Error : %d",abok); 115 | break; 116 | } 117 | 118 | break; 119 | 120 | }else{ 121 | NSLog(@"[+] 没有搜索到条目\n\n"); 122 | //break; 123 | } 124 | } 125 | } 126 | } 127 | 128 | @end 129 | -------------------------------------------------------------------------------- /SundaySratic.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 56; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1B3CEC282B00A2AB001D5925 /* PatternFind.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1B3CEC262B00A2AB001D5925 /* PatternFind.mm */; }; 11 | 1B3CEC292B00A2AB001D5925 /* PatternFind.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B3CEC272B00A2AB001D5925 /* PatternFind.h */; }; 12 | /* End PBXBuildFile section */ 13 | 14 | /* Begin PBXFileReference section */ 15 | 1B3CEC1A2B00A25D001D5925 /* libPatternFind.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPatternFind.a; sourceTree = BUILT_PRODUCTS_DIR; }; 16 | 1B3CEC262B00A2AB001D5925 /* PatternFind.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PatternFind.mm; sourceTree = ""; }; 17 | 1B3CEC272B00A2AB001D5925 /* PatternFind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PatternFind.h; sourceTree = ""; }; 18 | /* End PBXFileReference section */ 19 | 20 | /* Begin PBXFrameworksBuildPhase section */ 21 | 1B3CEC182B00A25D001D5925 /* Frameworks */ = { 22 | isa = PBXFrameworksBuildPhase; 23 | buildActionMask = 2147483647; 24 | files = ( 25 | ); 26 | runOnlyForDeploymentPostprocessing = 0; 27 | }; 28 | /* End PBXFrameworksBuildPhase section */ 29 | 30 | /* Begin PBXGroup section */ 31 | 1B3CEC112B00A25D001D5925 = { 32 | isa = PBXGroup; 33 | children = ( 34 | 1B3CEC1C2B00A25D001D5925 /* Sunday */, 35 | 1B3CEC1B2B00A25D001D5925 /* Products */, 36 | ); 37 | sourceTree = ""; 38 | }; 39 | 1B3CEC1B2B00A25D001D5925 /* Products */ = { 40 | isa = PBXGroup; 41 | children = ( 42 | 1B3CEC1A2B00A25D001D5925 /* libPatternFind.a */, 43 | ); 44 | name = Products; 45 | sourceTree = ""; 46 | }; 47 | 1B3CEC1C2B00A25D001D5925 /* Sunday */ = { 48 | isa = PBXGroup; 49 | children = ( 50 | 1B3CEC272B00A2AB001D5925 /* PatternFind.h */, 51 | 1B3CEC262B00A2AB001D5925 /* PatternFind.mm */, 52 | ); 53 | path = Sunday; 54 | sourceTree = ""; 55 | }; 56 | /* End PBXGroup section */ 57 | 58 | /* Begin PBXHeadersBuildPhase section */ 59 | 1B3CEC162B00A25D001D5925 /* Headers */ = { 60 | isa = PBXHeadersBuildPhase; 61 | buildActionMask = 2147483647; 62 | files = ( 63 | 1B3CEC292B00A2AB001D5925 /* PatternFind.h in Headers */, 64 | ); 65 | runOnlyForDeploymentPostprocessing = 0; 66 | }; 67 | /* End PBXHeadersBuildPhase section */ 68 | 69 | /* Begin PBXNativeTarget section */ 70 | 1B3CEC192B00A25D001D5925 /* SundaySratic */ = { 71 | isa = PBXNativeTarget; 72 | buildConfigurationList = 1B3CEC232B00A25D001D5925 /* Build configuration list for PBXNativeTarget "SundaySratic" */; 73 | buildPhases = ( 74 | 1B3CEC162B00A25D001D5925 /* Headers */, 75 | 1B3CEC172B00A25D001D5925 /* Sources */, 76 | 1B3CEC182B00A25D001D5925 /* Frameworks */, 77 | ); 78 | buildRules = ( 79 | ); 80 | dependencies = ( 81 | ); 82 | name = SundaySratic; 83 | productName = SundaySratic; 84 | productReference = 1B3CEC1A2B00A25D001D5925 /* libPatternFind.a */; 85 | productType = "com.apple.product-type.library.static"; 86 | }; 87 | /* End PBXNativeTarget section */ 88 | 89 | /* Begin PBXProject section */ 90 | 1B3CEC122B00A25D001D5925 /* Project object */ = { 91 | isa = PBXProject; 92 | attributes = { 93 | BuildIndependentTargetsInParallel = 1; 94 | LastUpgradeCheck = 1430; 95 | TargetAttributes = { 96 | 1B3CEC192B00A25D001D5925 = { 97 | CreatedOnToolsVersion = 14.3.1; 98 | }; 99 | }; 100 | }; 101 | buildConfigurationList = 1B3CEC152B00A25D001D5925 /* Build configuration list for PBXProject "SundaySratic" */; 102 | compatibilityVersion = "Xcode 14.0"; 103 | developmentRegion = en; 104 | hasScannedForEncodings = 0; 105 | knownRegions = ( 106 | en, 107 | Base, 108 | ); 109 | mainGroup = 1B3CEC112B00A25D001D5925; 110 | productRefGroup = 1B3CEC1B2B00A25D001D5925 /* Products */; 111 | projectDirPath = ""; 112 | projectRoot = ""; 113 | targets = ( 114 | 1B3CEC192B00A25D001D5925 /* SundaySratic */, 115 | ); 116 | }; 117 | /* End PBXProject section */ 118 | 119 | /* Begin PBXSourcesBuildPhase section */ 120 | 1B3CEC172B00A25D001D5925 /* Sources */ = { 121 | isa = PBXSourcesBuildPhase; 122 | buildActionMask = 2147483647; 123 | files = ( 124 | 1B3CEC282B00A2AB001D5925 /* PatternFind.mm in Sources */, 125 | ); 126 | runOnlyForDeploymentPostprocessing = 0; 127 | }; 128 | /* End PBXSourcesBuildPhase section */ 129 | 130 | /* Begin XCBuildConfiguration section */ 131 | 1B3CEC212B00A25D001D5925 /* Debug */ = { 132 | isa = XCBuildConfiguration; 133 | buildSettings = { 134 | ALWAYS_SEARCH_USER_PATHS = NO; 135 | CLANG_ANALYZER_NONNULL = YES; 136 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 137 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 138 | CLANG_ENABLE_MODULES = YES; 139 | CLANG_ENABLE_OBJC_ARC = YES; 140 | CLANG_ENABLE_OBJC_WEAK = YES; 141 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 142 | CLANG_WARN_BOOL_CONVERSION = YES; 143 | CLANG_WARN_COMMA = YES; 144 | CLANG_WARN_CONSTANT_CONVERSION = YES; 145 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 146 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 147 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 148 | CLANG_WARN_EMPTY_BODY = YES; 149 | CLANG_WARN_ENUM_CONVERSION = YES; 150 | CLANG_WARN_INFINITE_RECURSION = YES; 151 | CLANG_WARN_INT_CONVERSION = YES; 152 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 153 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 154 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 155 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 156 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 157 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 158 | CLANG_WARN_STRICT_PROTOTYPES = YES; 159 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 160 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 161 | CLANG_WARN_UNREACHABLE_CODE = YES; 162 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 163 | COPY_PHASE_STRIP = NO; 164 | DEBUG_INFORMATION_FORMAT = dwarf; 165 | ENABLE_STRICT_OBJC_MSGSEND = YES; 166 | ENABLE_TESTABILITY = YES; 167 | GCC_C_LANGUAGE_STANDARD = gnu11; 168 | GCC_DYNAMIC_NO_PIC = NO; 169 | GCC_NO_COMMON_BLOCKS = YES; 170 | GCC_OPTIMIZATION_LEVEL = 0; 171 | GCC_PREPROCESSOR_DEFINITIONS = ( 172 | "DEBUG=1", 173 | "$(inherited)", 174 | ); 175 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 176 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 177 | GCC_WARN_UNDECLARED_SELECTOR = YES; 178 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 179 | GCC_WARN_UNUSED_FUNCTION = YES; 180 | GCC_WARN_UNUSED_VARIABLE = YES; 181 | MACOSX_DEPLOYMENT_TARGET = 10.13; 182 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 183 | MTL_FAST_MATH = YES; 184 | ONLY_ACTIVE_ARCH = YES; 185 | SDKROOT = macosx; 186 | }; 187 | name = Debug; 188 | }; 189 | 1B3CEC222B00A25D001D5925 /* Release */ = { 190 | isa = XCBuildConfiguration; 191 | buildSettings = { 192 | ALWAYS_SEARCH_USER_PATHS = NO; 193 | CLANG_ANALYZER_NONNULL = YES; 194 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 195 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 196 | CLANG_ENABLE_MODULES = YES; 197 | CLANG_ENABLE_OBJC_ARC = YES; 198 | CLANG_ENABLE_OBJC_WEAK = YES; 199 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 200 | CLANG_WARN_BOOL_CONVERSION = YES; 201 | CLANG_WARN_COMMA = YES; 202 | CLANG_WARN_CONSTANT_CONVERSION = YES; 203 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 204 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 205 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 206 | CLANG_WARN_EMPTY_BODY = YES; 207 | CLANG_WARN_ENUM_CONVERSION = YES; 208 | CLANG_WARN_INFINITE_RECURSION = YES; 209 | CLANG_WARN_INT_CONVERSION = YES; 210 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 211 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 212 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 213 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 214 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 215 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 216 | CLANG_WARN_STRICT_PROTOTYPES = YES; 217 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 218 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 219 | CLANG_WARN_UNREACHABLE_CODE = YES; 220 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 221 | COPY_PHASE_STRIP = NO; 222 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 223 | ENABLE_NS_ASSERTIONS = NO; 224 | ENABLE_STRICT_OBJC_MSGSEND = YES; 225 | GCC_C_LANGUAGE_STANDARD = gnu11; 226 | GCC_NO_COMMON_BLOCKS = YES; 227 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 228 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 229 | GCC_WARN_UNDECLARED_SELECTOR = YES; 230 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 231 | GCC_WARN_UNUSED_FUNCTION = YES; 232 | GCC_WARN_UNUSED_VARIABLE = YES; 233 | MACOSX_DEPLOYMENT_TARGET = 10.13; 234 | MTL_ENABLE_DEBUG_INFO = NO; 235 | MTL_FAST_MATH = YES; 236 | SDKROOT = macosx; 237 | }; 238 | name = Release; 239 | }; 240 | 1B3CEC242B00A25D001D5925 /* Debug */ = { 241 | isa = XCBuildConfiguration; 242 | buildSettings = { 243 | CODE_SIGN_STYLE = Automatic; 244 | EXECUTABLE_PREFIX = lib; 245 | PRODUCT_NAME = PatternFind; 246 | SKIP_INSTALL = YES; 247 | }; 248 | name = Debug; 249 | }; 250 | 1B3CEC252B00A25D001D5925 /* Release */ = { 251 | isa = XCBuildConfiguration; 252 | buildSettings = { 253 | CODE_SIGN_STYLE = Automatic; 254 | EXECUTABLE_PREFIX = lib; 255 | PRODUCT_NAME = PatternFind; 256 | SKIP_INSTALL = YES; 257 | }; 258 | name = Release; 259 | }; 260 | /* End XCBuildConfiguration section */ 261 | 262 | /* Begin XCConfigurationList section */ 263 | 1B3CEC152B00A25D001D5925 /* Build configuration list for PBXProject "SundaySratic" */ = { 264 | isa = XCConfigurationList; 265 | buildConfigurations = ( 266 | 1B3CEC212B00A25D001D5925 /* Debug */, 267 | 1B3CEC222B00A25D001D5925 /* Release */, 268 | ); 269 | defaultConfigurationIsVisible = 0; 270 | defaultConfigurationName = Release; 271 | }; 272 | 1B3CEC232B00A25D001D5925 /* Build configuration list for PBXNativeTarget "SundaySratic" */ = { 273 | isa = XCConfigurationList; 274 | buildConfigurations = ( 275 | 1B3CEC242B00A25D001D5925 /* Debug */, 276 | 1B3CEC252B00A25D001D5925 /* Release */, 277 | ); 278 | defaultConfigurationIsVisible = 0; 279 | defaultConfigurationName = Release; 280 | }; 281 | /* End XCConfigurationList section */ 282 | }; 283 | rootObject = 1B3CEC122B00A25D001D5925 /* Project object */; 284 | } 285 | -------------------------------------------------------------------------------- /SundaySratic.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SundaySratic.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /SundaySratic.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /SundaySratic.xcodeproj/project.xcworkspace/xcuserdata/qyc.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildLocationStyle 6 | CustomLocation 7 | CustomBuildIntermediatesPath 8 | Build/Intermediates.noindex 9 | CustomBuildLocationType 10 | RelativeToWorkspace 11 | CustomBuildProductsPath 12 | Build/Products 13 | DerivedDataLocationStyle 14 | Default 15 | SharedBuildFolderName 16 | Build 17 | ShowSharedSchemesAutomaticallyEnabled 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /SundaySratic.xcodeproj/xcshareddata/xcschemes/SundaySratic.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 42 | 43 | 49 | 50 | 56 | 57 | 58 | 59 | 61 | 62 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /SundaySratic.xcodeproj/xcuserdata/qyc.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | SundaySratic.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 1B3CEC192B00A25D001D5925 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | --------------------------------------------------------------------------------