X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=main.m;h=444451b79e3400b9a69613a58a81e74759122ff5;hb=179538478d0db2e5f8f2b50ccb3ff889b474aa01;hp=c990b8c8382529e5ae69a8fe4dabf2a871da30e7;hpb=42cf7bbe564d70233a0d73baee613f209eb00eb6;p=chaz%2Fthecheat diff --git a/main.m b/main.m index c990b8c..444451b 100644 --- a/main.m +++ b/main.m @@ -1,22 +1,135 @@ -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// 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 +#import +#import +#import +#include "ChazLog.h" +#include +#include +#include -#include -#include +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 checkExecutablePermissions(void) +{ + 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"]); +} + +bool amIWorthy(void) +{ + // running as root? + AuthorizationRef myAuthRef; + OSStatus stat = AuthorizationCopyPrivilegedReference(&myAuthRef,kAuthorizationFlagDefaults); + + return stat == errAuthorizationSuccess || checkExecutablePermissions(); +} -int main( int argc, const char *argv[] ) +int main( int argc, char *argv[] ) { - srandom( time(0) ); + 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 ); + ChazDebugCleanup(); } \ No newline at end of file