// ********************************************************************** // 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 #import #import #import #include "ChazLog.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); } } bool amIWorthy(void) { // 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; } ChazDebugCleanup(); }