[
  {
    "path": "Makefile",
    "content": "CFLAGS = -dynamiclib -framework AppKit -framework Foundation\n\nall:\n\t$(CC) $(CFLAGS) sketchtrial.m -o libsketchtrial.dylib\n\nclean:\n\trm -rf *.o libsketchtrial.dylib\n"
  },
  {
    "path": "README.md",
    "content": "# sketchtrial\n\nThis is a shared library that spoofs some ObjC method calls to disable Sketch license verification.\n\nTested on Sketch 58.\n\nMake sure to disable SIP (`csrutil disable` from Recovery), for more information see below.\n\n## Building\n```\ngit clone https://github.com/gch1p/sketchtrial\ncd sketchtrial\nmake\n```\n\n## Launching Sketch\nYou can use `sketch.sh`, it's a wrapper script that sets necessary environment variables to insert the lib and launches Sketch (it assumes that Sketch.app installed to /Applications, edit the script if it differs for you).\n\n## Important\nThis hack doesn't work on systems with SIP (System Integrity Protection) enabled, and it's enabled by default since El Capitan. It can be easily disabled from Recovery Mode but it's another layer of security which is always good to have so disabling it permanently is not the wisest idea. I'll implement some solution to bypass this restriction when I have time.\n"
  },
  {
    "path": "sketch.sh",
    "content": "#!/bin/bash\nDIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" >/dev/null 2>&1 && pwd )\"\nexport DYLD_INSERT_LIBRARIES=$DIR/libsketchtrial.dylib\n/Applications/Sketch.app/Contents/MacOS/Sketch\n"
  },
  {
    "path": "sketchtrial.m",
    "content": "#import <objc/runtime.h>\n#import <Foundation/Foundation.h>\n#include <AppKit/AppKit.h>\n\n\n//\n// BCRegularLicense\n//\n\n@interface BCRegularLicensePatched : NSObject\n- (bool)isExpired;\n- (bool)isValid;\n@end\n\n@interface BCLicenseManagerPatched : NSObject\n- (long long)numberOfDaysLeftInTrialMode;\n@end\n\n@implementation BCRegularLicensePatched\n\n+ (void)load {\n    Class origClass = NSClassFromString(@\"BCRegularLicense\");\n    \n    method_exchangeImplementations(\n        class_getInstanceMethod(origClass, @selector(isExpired)),\n        class_getInstanceMethod(NSClassFromString(@\"BCRegularLicensePatched\"), @selector(isExpired))\n    );\n\n    method_exchangeImplementations(\n        class_getInstanceMethod(origClass, @selector(isValid)),\n        class_getInstanceMethod(NSClassFromString(@\"BCRegularLicensePatched\"), @selector(isValid))\n    );\n}\n\n- (bool)isExpired {\n    return false;\n}\n\n- (bool)isValid {\n    return true;\n}\n\n@end\n\n\n//\n// BCLicenseManager\n//\n\n@implementation BCLicenseManagerPatched\n\n+ (void)load {\n    Class origClass = NSClassFromString(@\"BCLicenseManager\");\n\n    method_exchangeImplementations(\n        class_getInstanceMethod(origClass, @selector(numberOfDaysLeftInTrialMode)),\n        class_getInstanceMethod(NSClassFromString(@\"BCLicenseManagerPatched\"), @selector(numberOfDaysLeftInTrialMode))\n    );\n}\n\n- (long long)numberOfDaysLeftInTrialMode {\n    return 9000;\n}\n\n@end\n"
  }
]