-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathmain.m
139 lines (115 loc) · 3.88 KB
/
main.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
* 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>
/*
* 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);
// 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)
{
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;
}
ChazDebugCleanup();
}