-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Project: The Cheat
-//
-// File: main.m
-// Created: Sun Sep 07 2003
-//
-// Copyright: 2003 Chaz McGarvey. All rights reserved.
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// **********************************************************************
+// The Cheat - A universal game cheater for Mac OS X
+// (C) 2003-2005 Chaz McGarvey (BrokenZipper)
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 1, or (at your option)
+// any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//
#import <Cocoa/Cocoa.h>
+#import <Foundation/foundation.h>
+#import <SecurityFoundation/SFAuthorization.h>
+#import <Security/AuthorizationTags.h>
+#include "ChazLog.h"
-#include <stdlib.h>
-#include <time.h>
+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);
+ // 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);
+ }
+}
-int main( int argc, const char *argv[] )
+bool amIWorthy(void)
{
- srandom( time(0) );
+ // running as root?
+ AuthorizationRef myAuthRef;
+ OSStatus stat = AuthorizationCopyPrivilegedReference(&myAuthRef,kAuthorizationFlagDefaults);
+
+ return stat == errAuthorizationSuccess;
+}
+
+int main( int argc, char *argv[] )
+{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ ChazLogDisable();
+
+ ChazDebugSetup();
+ ChazMapLogToDebug();
+
+ [pool release];
+
+ if (amIWorthy())
+ {
+ printf("Don't forget to flush! ;-) "); // signal back to close caller
+ fflush(stdout);
+
+ return NSApplicationMain(argc, (const char **) argv);
+ }
+ else
+ {
+ authMe(argv[0]);
+ return 0;
+ }
- return NSApplicationMain( argc, argv );
+ ChazDebugCleanup();
}
\ No newline at end of file