]> Dogcows Code - chaz/thecheat/blobdiff - main.m
update contact information and project URL
[chaz/thecheat] / main.m
diff --git a/main.m b/main.m
index c990b8c8382529e5ae69a8fe4dabf2a871da30e7..a984ac26dadd4cd138b9e3e182adc88a8ac34b66 100644 (file)
--- a/main.m
+++ b/main.m
 
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Project:   The Cheat
-//
-// File:      main.m
-// Created:   Sun Sep 07 2003
-//
-// Copyright: 2003 Chaz McGarvey.  All rights reserved.
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+/*
+ * The Cheat - The legendary universal game trainer for Mac OS X.
+ * http://www.brokenzipper.com/trac/wiki/TheCheat
+ *
+ * Copyright (c) 2003-2011, Charles McGarvey et al.
+ *
+ * Distributable under the terms and conditions of the 2-clause BSD
+ * license; see the file COPYING for the legal text of the license.
+ */
 
 #import <Cocoa/Cocoa.h>
+#import <Foundation/foundation.h>
+#import <SecurityFoundation/SFAuthorization.h>
+#import <Security/AuthorizationTags.h>
+#include "ChazLog.h"
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <unistd.h>
 
-#include <stdlib.h>
-#include <time.h>
 
+/*
+ * I think this function was ripped from the iHaxGamez project, so it
+ * remains licensed under the GPL.
+ */
+void authMe(char * FullPathToMe)
+{
+       // get authorization as root
+
+       OSStatus myStatus;
+       
+       // set up Authorization Item
+       AuthorizationItem myItems[1];
+       myItems[0].name = kAuthorizationRightExecute;
+       myItems[0].valueLength = 0;
+       myItems[0].value = NULL;
+       myItems[0].flags = 0;
+       
+       // Set up Authorization Rights
+       AuthorizationRights myRights;
+       myRights.count = sizeof (myItems) / sizeof (myItems[0]);
+       myRights.items = myItems;
+       
+       // set up Authorization Flags
+       AuthorizationFlags myFlags;
+       myFlags =
+               kAuthorizationFlagDefaults |
+               kAuthorizationFlagInteractionAllowed |
+               kAuthorizationFlagExtendRights;
+       
+       // Create an Authorization Ref using Objects above. NOTE: Login bod comes up with this call.
+       AuthorizationRef myAuthorizationRef;
+       myStatus = AuthorizationCreate (&myRights, kAuthorizationEmptyEnvironment, myFlags, &myAuthorizationRef);
+       
+       if (myStatus == errAuthorizationSuccess)
+       {
+               // prepare communication path - used to signal that process is loaded
+               FILE *myCommunicationsPipe = NULL;
+               char myReadBuffer[] = " ";
+
+               // run this app in GOD mode by passing authorization ref and comm pipe (asynchoronous call to external application)
+               myStatus = AuthorizationExecuteWithPrivileges(myAuthorizationRef,FullPathToMe,kAuthorizationFlagDefaults,nil,&myCommunicationsPipe);
 
-int main( int argc, const char *argv[] )
+               // external app is running asynchronously - it will send to stdout when loaded
+               if (myStatus == errAuthorizationSuccess)
+               {
+                       read (fileno (myCommunicationsPipe), myReadBuffer, sizeof (myReadBuffer));
+                       fclose(myCommunicationsPipe);
+               }
+               
+               // release authorization reference
+               myStatus = AuthorizationFree (myAuthorizationRef, kAuthorizationFlagDestroyRights);
+       }
+}
+
+/*
+ * I think this function was ripped from the iHaxGamez project, so it
+ * remains licensed under the GPL.
+ */
+bool checkExecutablePermissions(void)
 {
-       srandom( time(0) );
+       NSDictionary    *applicationAttributes = [[NSFileManager defaultManager] fileAttributesAtPath:[[NSBundle mainBundle] executablePath] traverseLink: YES];
+       
+       // We expect 2755 as octal (1517 as decimal, -rwxr-sr-x as extended notation)
+       return ([applicationAttributes filePosixPermissions] == 1517 && [[applicationAttributes fileGroupOwnerAccountName] isEqualToString: @"procmod"]);
+}
+
+/*
+ * I think this function was ripped from the iHaxGamez project, so it
+ * remains licensed under the GPL.
+ */
+bool amIWorthy(void)
+{
+       // running as root?
+       AuthorizationRef myAuthRef;
+       OSStatus stat = AuthorizationCopyPrivilegedReference(&myAuthRef,kAuthorizationFlagDefaults);
+       
+       return stat == errAuthorizationSuccess || checkExecutablePermissions();
+}
+
+int main( int argc, char *argv[] )
+{
+       NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+       
+       ChazLogDisable();
+       
+       ChazDebugSetup();
+       ChazMapLogToDebug();
+       
+#ifdef __ppc__
+       // PPC machines whose operating system is below leopard do not need authorization
+       SInt32 osxMajorVersion;
+       Gestalt(gestaltSystemVersionMinor, &osxMajorVersion);
+       if (osxMajorVersion < 5)
+       {
+               [pool release];
+               return NSApplicationMain(argc,  (const char **) argv);
+       }
+#endif
+       
+       if (amIWorthy())
+       {
+#ifndef _DEBUG
+               printf("Don't forget to flush! ;-) "); // signal back to close caller
+#endif
+               fflush(stdout);
+               
+               [pool release];
+               return NSApplicationMain(argc,  (const char **) argv);
+       }
+       else
+       {
+               authMe(argv[0]);
+               [pool release];
+               return 0;
+       }
        
-    return NSApplicationMain( argc, argv );
-}
\ No newline at end of file
+       ChazDebugCleanup();
+}
This page took 0.01999 seconds and 4 git commands to generate.