From ad02580588e2ca41f15ba8f9bd084561d8d485c2 Mon Sep 17 00:00:00 2001 From: Charles McGarvey Date: Fri, 28 Nov 2008 12:00:00 -0700 Subject: [PATCH] The Cheat 1.2.3 Bug Fixes: - Issues with getting The Cheat to start up on certain machines. Contributed by nil. --- A few notes.txt | 7 ++ AppController.h | 8 +- AppController.m | 113 +++++--------------- ChazLog.m | 2 +- CheatDocument.m | 2 +- English.lproj/AboutBox.nib/classes.nib | 77 ++++--------- English.lproj/AboutBox.nib/info.nib | 37 +++++-- English.lproj/AboutBox.nib/keyedobjects.nib | Bin 8878 -> 6573 bytes Info.plist | 8 +- SearchContext.m | 1 + Searching.m | 12 +-- VMRegion.m | 1 - VariableTable.m | 2 +- main.m | 77 ++++++++++++- 14 files changed, 168 insertions(+), 179 deletions(-) create mode 100644 A few notes.txt diff --git a/A few notes.txt b/A few notes.txt new file mode 100644 index 0000000..830c07a --- /dev/null +++ b/A few notes.txt @@ -0,0 +1,7 @@ +The authorization code is taken from iHaxGamez source. + +Memory reading and writing will not work as you would expect if you compile and run The Cheat natively on an intel machine. This is because there are byte ordering (endian) issues that need to be fixed that I haven't been able to (or too lazy to figure out how to get it to work correctly). + +The Xcode project provided is not guaranteed to work for Xcode versions below 3.1 + +-nil \ No newline at end of file diff --git a/AppController.h b/AppController.h index 7eb651f..e4a9765 100644 --- a/AppController.h +++ b/AppController.h @@ -26,6 +26,7 @@ #import "CheatServer.h" + @class AboutBoxController; @class HelpController; @class PreferenceController; @@ -53,13 +54,6 @@ - (IBAction)checkForUpdate:(id)sender; -// Privilage elevation stuff -AuthorizationRef _authRef; -AuthorizationItem _authItem; -AuthorizationRights _authRights; -- (int) preAuthorize; -- (int) launchAuthPrgm; - // Server Stuff - (CheatServer *)cheatServer; - (BOOL)startCheatServer; diff --git a/AppController.m b/AppController.m index 303b1eb..1adfbaf 100644 --- a/AppController.m +++ b/AppController.m @@ -25,13 +25,6 @@ #import "HelpController.h" #import "PreferenceController.h" -// Privilage elevation libs -#include -#include -#include -#include -#include - @implementation AppController @@ -71,90 +64,13 @@ - (id)init { - if ( self = [super init] ) - { - if( geteuid() != 0 ) - { - [self launchAuthPrgm]; - [self setDelegate:self]; - } + if ( self = [super init] ) { + [self setDelegate:self]; } - if( geteuid() != 0 ) - { - NSRunAlertPanel(@"The Cheat must be run as root,", - @"Due to a limitation of Leopard, the application needs elevated privileges to run.", - @"Exit", nil, nil ); - [self terminate: 0]; - } - return self; } -- (int) preAuthorize -{ - int err; - AuthorizationFlags authFlags; - - - NSLog (@"MyWindowController: preAuthorize"); - - if (_authRef) - return errAuthorizationSuccess; - - NSLog (@"MyWindowController: preAuthorize: ** calling AuthorizationCreate...**\n"); - - authFlags = kAuthorizationFlagDefaults; - err = AuthorizationCreate (NULL, kAuthorizationEmptyEnvironment, authFlags, &_authRef); - if (err != errAuthorizationSuccess) - return err; - - NSLog (@"MyWindowController: preAuthorize: ** calling AuthorizationCopyRights...**\n"); - - _authItem.name = kAuthorizationRightExecute; - _authItem.valueLength = 0; - _authItem.value = NULL; - _authItem.flags = 0; - _authRights.count = 1; - _authRights.items = (AuthorizationItem*) malloc (sizeof (_authItem)); - memcpy (&_authRights.items[0], &_authItem, sizeof (_authItem)); - authFlags = kAuthorizationFlagDefaults - | kAuthorizationFlagExtendRights - | kAuthorizationFlagInteractionAllowed - | kAuthorizationFlagPreAuthorize; - err = AuthorizationCopyRights (_authRef, &_authRights, kAuthorizationEmptyEnvironment, authFlags, NULL); - - return err; -} - -- (int) launchAuthPrgm -{ - AuthorizationFlags authFlags; - int err; - - // path - NSString * path = [[NSBundle mainBundle] executablePath]; - if (![[NSFileManager defaultManager] isExecutableFileAtPath: path]) - return -1; - - // auth - - if (!_authRef) - { - err = [self preAuthorize]; - if (err != errAuthorizationSuccess) - return err; - } - - // launch - - NSLog (@"MyWindowController: launchWithPath: ** calling AuthorizationExecuteWithPrivileges...**\n"); - authFlags = kAuthorizationFlagDefaults; - err = AuthorizationExecuteWithPrivileges (_authRef, [path cString], authFlags, NULL, NULL); - if(err==0) [NSApp terminate:self]; - - return err; -} - (void)dealloc { @@ -163,14 +79,35 @@ [super dealloc]; } +// http://vgable.com/blog/2008/10/05/restarting-your-cocoa-application/ +- (void)restartOurselves +{ + NSString *killArg1AndOpenArg2Script = @"kill -9 $1 \n open \"$2\""; + NSString *ourPID = [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]]; + NSString *pathToUs = [[NSBundle mainBundle] bundlePath]; + + NSArray *shArgs = [NSArray arrayWithObjects:@"-c", killArg1AndOpenArg2Script, @"", ourPID, pathToUs, nil]; + NSTask *restartTask = [NSTask launchedTaskWithLaunchPath:@"/bin/sh" arguments:shArgs]; + [restartTask waitUntilExit]; + NSLog(@"*** ERROR: %@ should have been terminated, but we are still running", pathToUs); + assert(!"We should not be running!"); +} + +- (BOOL) checkExecutablePermissions { + 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"]); +} /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ #pragma mark NSApplication Delegate /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + [NSApp activateIgnoringOtherApps:YES]; + // check if this is the first launch if ( ![[NSUserDefaults standardUserDefaults] boolForKey:TCFirstLaunchPref] ) { // FIRST LAUNCH @@ -183,7 +120,7 @@ ChazCheckForUpdate( TCUpdateCheckURL, NO ); } - // automaticall start the cheat server if the pref is set + // automatically start the cheat server if the pref is set if ( [[NSUserDefaults standardUserDefaults] boolForKey:TCRunServerPref] ) { if ( ![self startCheatServer] ) { // inform the user that the server won't start diff --git a/ChazLog.m b/ChazLog.m index e78125b..bee3160 100644 --- a/ChazLog.m +++ b/ChazLog.m @@ -30,7 +30,7 @@ void static _ChazPrint( FILE *output, NSString *format, va_list args ); // Static Globals -BOOL static _gLogEnabled = NO; +BOOL static _gLogEnabled = YES; FILE static *_gLogFile = stdout; FILE static *_gDebugFile = NULL; diff --git a/CheatDocument.m b/CheatDocument.m index b058d74..1810c77 100644 --- a/CheatDocument.m +++ b/CheatDocument.m @@ -1154,8 +1154,8 @@ Process static *_tc_target = nil; // clear the search [_searchData clearResults]; - [ibSearchVariableTable reloadData]; + //[ibSearchVariableTable reloadData]; // this can cause a crash, so commenting it out for now. // clear the selected process [_process release]; _process = nil; diff --git a/English.lproj/AboutBox.nib/classes.nib b/English.lproj/AboutBox.nib/classes.nib index c132e54..f9f3920 100644 --- a/English.lproj/AboutBox.nib/classes.nib +++ b/English.lproj/AboutBox.nib/classes.nib @@ -1,59 +1,18 @@ - - - - - IBClasses - - - ACTIONS - - ibEmailButton - id - ibWebsiteButton - id - - CLASS - AboutBoxController - LANGUAGE - ObjC - OUTLETS - - ibDateText - NSTextField - ibEmailButton - NSButton - ibNameVersionText - NSTextField - ibWebsiteButton - NSButton - - SUPERCLASS - NSWindowController - - - CLASS - NSMenu - LANGUAGE - ObjC - SUPERCLASS - NSObject - - - CLASS - FirstResponder - LANGUAGE - ObjC - SUPERCLASS - NSObject - - - CLASS - NSObject - LANGUAGE - ObjC - - - IBVersion - 1 - - +{ + IBClasses = ( + { + ACTIONS = {ibEmailButton = id; ibWebsiteButton = id; }; + CLASS = AboutBoxController; + LANGUAGE = ObjC; + OUTLETS = { + ibDateText = NSTextField; + ibEmailButton = NSButton; + ibNameVersionText = NSTextField; + ibWebsiteButton = NSButton; + }; + SUPERCLASS = NSWindowController; + }, + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/English.lproj/AboutBox.nib/info.nib b/English.lproj/AboutBox.nib/info.nib index 99d506a..4c7b4ef 100644 --- a/English.lproj/AboutBox.nib/info.nib +++ b/English.lproj/AboutBox.nib/info.nib @@ -1,20 +1,37 @@ - + + IBDocumentLocation + 124 93 356 241 0 0 1280 938 IBFramework Version - 677 - IBLastKnownRelativeProjectPath - ../The Cheat.xcodeproj - IBOldestOS - 5 + 364.0 + IBGroupedObjects + + 3 + + 93 + 91 + + 7 + + 77 + 80 + 87 + + 8 + + 89 + 81 + + + IBLastGroupID + 9 IBOpenObjects - 78 + 85 IBSystem Version - 9C7010 - targetFramework - IBCocoaFramework + 7U16 diff --git a/English.lproj/AboutBox.nib/keyedobjects.nib b/English.lproj/AboutBox.nib/keyedobjects.nib index c71d319d564f5dabb8df14638c460c3dcda0151a..7ef2eec207537913e91a8f51c1832eb4c6ce0404 100644 GIT binary patch literal 6573 zcma)A2YeKD_J42tZnB%%GBn$WK?FibHVFh2B?$x~Bm_1jp@zxskPK{gmMsY(1b-Ha zfQX2K1%(7e&c-Qv*b8=1q>Al0yJGL0=W+LDW(nc&{{PG7vpc`?%J0?hZ|b9AIiASL zIS2>_FoFrpU;!&Qre=zW9Y<*iuOo$90;I=~=q{AQ>0y!`ghQY;f8H|U?Fcaz_2n(SNu7+!1 z87zmDa6PPpTj4gi6FOik+y&d=PjC<13p?N?co|-SS78sl1@FRp@Ckeh$KXr&34VrO z;P3DcI064cL=)OD4b#zu8R$VT_Q0NaF80FGjA1jjU@I=fHe7^PAj7M12`F3AHl!iE_@Up!^iOnd=j6+r|}tl7N5i2_yYbF zkK*6(1N;y_!jJJ2{1iXK&+!X9hF{`W_%(im-{N=pJ^p|{;!pVVl*~vn96rirfD>Gh z0UWr&177d}4?UnK^n%{d2hM`C;T$*@&I19?hrVzDWI{i<5cvc7!6vK*gVa<6Ln8li{YdcpPAa(H7Zde5eftf40Wwki6qL!h}a;-sw)DM6(up1 z2&4sxiE^lp<0=Bxa$K$tOEq#Nq_n6MDekId8kK~_cwELGpKIT zR7-8w7uXfd%oa1oYz&xzTf!`C5xb6E&(^TJ+3Njdg)A5h*>paQOg%6&F=HL)DXLeJ ziDG2|oh1=d!eJ@4A9BGDd5~YLOOxW$^oIyhbwEB8%px|)ctUB?4^VsZBy`HM;u0mO zh+S6P4}~OrIE zm>||mVNy1rBx6B|^<=%6<1hrE3Z_6cQPw~$eWt=Rm<}^E8>`-%EXAWrBqYVic!6Y8 ziZ#np3vttqNFE*&QPmES%S)tin5D6FJL|!m2VoYmos8`7yO2q2 zP94{yt!;Q=mXKTEZ_g6ia`T3&&+YB+K?o$60}ap!GR!3w^B@dO5CH|EFdt$t3F44| zBs4<{EPz&WV@04+ipfey4wgj{q@x(FXCPglZk{9DGiGaaX&3~8){}bDQdJ77F*SrqJwLjwN(n|G4qo$sXzkBv0bZv zt~c|r4Cdl29-C>@zZlQG>@nd9U|x?60O~kC*eEU>RUcF4Ns)zel#HDnRGJRLB4{To zEQTw9!If|o**YLEl;}qdWb)`7O?uy=900~KH+S}o3CW-w6350w@|+%QOJHdSEQJE1 zQZu!3KU_;Zm%$1$Np?IDlOqkxr*B;a*LA{muo?=q1D%XaZI2p1+JnAz4cxF5Zh*CL zBZZF|#=5Q4GtcbTeMCz|TB%T%blRKX=B;outcMM73ltDzotE@D=?%4JNG)XHt{|Kx z*NeWgwE)8*w_gh;SN<_o{S>brx?(WTA-8|`Bb0Phuw2!6XnWgb{^|}f!b7kV9)?HYFR%+9g~!ORkHZu2Bs>LA!!z(KJO{fe zv!90-;Ke%5T@lbra3IkdmdeGrUh4I^Vlg<6B7uBRE=SZLqwv>Ps^moY)JQ9%qqgYFlX)+eh<6> zd*Myk2m9dw`C}3sghOzc^=HG_#q2Ux!Kzp-o55zE83IQr1m1>s*hOq88=wV2uAj=3 zf7nn}AGLb<{q5~X;Qds+>O+<4uT-gy!r$Nn68j-lsE^=dI&Kx!(h?=C#5516c5a9% z$w)|>V}3S>4P*suum?r~Os#5^gpx){Oq|O7&){>){V)0!ts&!NaU8Mfp5%jzm2l_~ zd<9>_H}EY*z<2OH1>O(vBh_k6hFYjp`D)D|uV~MKs2Eh8T0$T#tTbqSF^3Id*(|p@ z&>BxjO*4XeWz@DGfM1DwA2?3YrSh$5qyQbClRZ@b8&39Bd*^TPRR?KO&|RJ1;h(xX zET833e5crUStZ39L1kT>qjN$78n>WPFD_awQumk2QaIFAM$n9wyU>ExlZ7N@Yi-vI zszF^OXLuLws&~=B3fb^(z8$K?n%0@}|Jb+l(MbW7@+})tQ?0|}GX-#(05`jYjik~< z!8|NW7@Dtza(+RUK(*u#V`o14C|ouE$g@j5>BVYyc%~~V1UW8(kMoPlFBfqvY~PzNDHV}$&xxPM|1(n zNHiu!n5%lm`1J}9TOX>TB8KI2wH?>jhdCR zayFKY(h?fagArR%!1J*$UVxdbh!wLEHkys8<9ZiGqhU#?99=3zMGD?}MT~`n1aYh5 z&aIGYtAwhu(o&&0KRf5l4Y}HeF_EAcjVHqd8A3v(5>HS~lcNctIXByXCJi;4QkmL3 znLl2sNmEs?v`Q$=C9A;JM0XJZrS7Ip#-;85a|g~PBAhg18b z4ywUEEyXWq<5?L|l{FDs*Xog~upHEoVi~2Tmd7{}FYUxj@iMiq5`Nb)?@2~PM#**h zoK9AR#apl#OH@Qa9@T`X>8d7U*FfJo21~bMX}8SP*45&DW-g7>a;c0>WR+SjS zgN_B%B69yYS8)QCQ!&wVse(;rlRPG>u+4iuQkQ}||sfEH{_}>ae9rZF@!fZC( zW77&nWff)Uytq)Mj1Y<$`u-PZzD=I;MTgaU_CCW*43$41^(xZd;*L7>)@L!Ugl3hGY< zG*?2m43XYH2y}Z2()CKD`$aR|KU(z&jbow{6PVO)eJLbd6pM+iYSO8{gypEN(~(aH zC_425*wCrNTkQxrS%Qup{e|>6JdeCOt<9gCN7Vk|?Nm3~^0M=D{DppLP#!^xZi9B6 zUpp@Dz{RP2OyM%ADXNyM>K5%@t?#=Muj<6BbVTgau6q@0sjXoJ+)~suFy8A=tizri%hB~s@?Y>UI%?}HB7+kaSh%8o7FoA z)lI@}sZx}1l^h)>g`;$ls^hXts4mSDs6kPOQ-o%Ehma7cUkTj- zpwJ@K3o2O7){lP^-rRvVt7amwTUM+xJ9Y9dWj2s9x4HrzdtwkG_rhZHC;?-wfitPKbLT4*J|!`QGNHKM{)NBKee`$v|R0M zFdR3X{(#TprU$s5^j>5f*>^Nqq)fBdX2SSylBJ8tQe(+R`^oMlg!lK-o0BoRonF)^ z@g;m2U%^-LHQa-*;~Tga-^6{m9}nO`JcNhwEj)s6<2(2+zK8F#8`xTQBU{IAVmGt( zYy-Q6-O6rbx3i7x4t6Ko#5S`I*2%W8t?Vwgjf--v+$1i>wR4NP3J$rcTn$&vm2(Pr zHMf9k;-+&`xcS^nu98b|aXn&x!CyP@SFOmD73;5+D6m9&mD-zL*kuu{9zpMSCeeGE z5X_->htC?okZ$N@7-%Rolp3lG(+!egfnlj(o#9Tyy@rPjFBo1jykdCG@Va5IVV~iE z;gI1i!`p^;4euL{8a^<5WcbQ(-0+*>cca_b$9RD;+n8r8HjX#WGBy}v#<($QTx?uo zTx;B5+-%%we8jlR_?Ynt<5R|GjL#XLH@;|m+4#2cGvl|$? zo8#uBd7*icd9nFw^Aht4bBFmM^JC^`&99pGn)jIxm=BphG=FLS&it$SxCJd~7N@0$ zlgWX^^*)4XP-C<9+_p|r653moi zkG4zp`SvCDW%g_BEA7|WueYzW-(i2izSI7QeV2WY{R8_K_MaUF2j}oOe2yNDUXJq| zS&re3B1gHS+A-Y`b;KMA$1=w{$9l&m$9Bi#j^`cw9Pc}hr5V%AY1T9$tthP|ZG2iN zZBANa8cW-p)|qy9`n>d2=^N5J)3>H?OW&S;Px{XEr_-NJ-<|$K`b+7rq<`YHI7c`q zI~C_L=iSa7&Rx#k&exo;JNG)@bnbV)<^0(Bqw{Cyug<@_(8asXb@g){V!wbHfTwZrwGYo}|E>ucAyuJ2vHxc-^p%HT3Q8G|wgXAH?0o6(ptHzS_0Dr0rV znvCrkuV(DY*vDmZBe~1CB1(gW+#>EuZW*_U>)^Ied)-IeN8P`8tRB0kr{^NiK+h$fa?eCh(39}Ad9Lv+^(^H+i>vpYy)v{n-1d_jB(t z?^oV$yx)0$@c!ie#e3ZQoA-C0!`I8#&o{(Z=)1$W&9}q%sPCBX zM?RCkkiUo@$Y=4{d=BsD^ZB8CAwPn@guj#@#TWCV`BHuye>p#auiz{B$$S-G&DZkN z_!;~xel}mvhxj>sBR`i9^ASGE$M^)_%rD><@{9PzJmatBSA+IvFzCN{T>m}!&2RiS DMPS2d literal 8878 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 L?YHZ%zwv(nUD#R1 diff --git a/Info.plist b/Info.plist index 440bc13..e46e7c6 100644 --- a/Info.plist +++ b/Info.plist @@ -30,11 +30,13 @@ CFBundleExecutable The Cheat CFBundleGetInfoString - The Cheat 1.2.2 + The Cheat 1.2.3 CFBundleIconFile icon.icns CFBundleIdentifier com.brokenzipper.TheCheat + SecTaskAccess + allowed CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -42,7 +44,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.2.2 + 1.2.3 CFBundleSignature chœt CFBundleURLTypes @@ -57,7 +59,7 @@ CFBundleVersion - 1.2.2 + 1.2.3 NSAppleScriptEnabled YES NSMainNibFile diff --git a/SearchContext.m b/SearchContext.m index 82a3939..68495e4 100644 --- a/SearchContext.m +++ b/SearchContext.m @@ -301,6 +301,7 @@ return SearchIterationLastValue; } } + return NULL; } diff --git a/Searching.m b/Searching.m index 2814a32..80ad0d6 100644 --- a/Searching.m +++ b/Searching.m @@ -164,7 +164,6 @@ int SearchIterationAgain( ThreadedTask *task, unsigned iteration ) context->lastRegion = VMMakeRegion( context->process, *(context->lastRegionPtr), 0 ); region = VMNextRegionWithAttributes( context->process, context->lastRegion, VMREGION_READABLE | VMREGION_WRITABLE ); if ( VMRegionIsNotNull( region ) ) { - if ( context->bufferSize < VMRegionSize( region ) ) { char *buf = realloc( context->buffer, VMRegionSize( region ) ); if ( buf ) { @@ -183,9 +182,9 @@ int SearchIterationAgain( ThreadedTask *task, unsigned iteration ) top = *context->lastPerRegionPtr; for ( i = 0; i < top; i++ ) { - ptr = context->buffer + *context->lastAddressPtr - VMRegionAddress(region); - if ( context->compareFunc(ptr,context->value->_value) ) { + + if (ptr >= context->buffer && context->compareFunc(ptr,context->value->_value)) { if ( context->numberOfResults >= TCArrayElementCount(context->addresses) ) { TCArrayResize( context->addresses, TCArrayElementCount(context->addresses) + TC_BUFFER_SIZE / sizeof(TCAddress) ); context->addressPtr = (TCAddress *)TCArrayBytes(context->addresses) + context->numberOfResults; @@ -276,7 +275,7 @@ int SearchIterationLastValue( ThreadedTask *task, unsigned iteration ) for ( i = 0; i < top; i++ ) { ptr = context->buffer + *context->lastAddressPtr - VMRegionAddress(region); - if ( context->compareFunc(ptr,context->lastValuePtr) ) { + if ( ptr >= context->buffer && context->compareFunc(ptr,context->lastValuePtr) ) { if ( context->numberOfResults >= TCArrayElementCount(context->addresses) ) { TCArrayResize( context->addresses, TCArrayElementCount(context->addresses) + TC_BUFFER_SIZE / sizeof(TCAddress) ); context->addressPtr = (TCAddress *)TCArrayBytes(context->addresses) + context->numberOfResults; @@ -453,7 +452,8 @@ int SearchStringIterationAgain( ThreadedTask *task, unsigned iteration ) for ( i = 0; i < top; i++ ) { ptr = context->buffer + *context->lastAddressPtr - VMRegionAddress(region); - if ( memcmp( ptr, context->value->_value, MIN(TCArrayElementSize(context->values),context->buffer+VMRegionAddress(region)-ptr) ) == 0 ) { + + if ( ptr >= context->buffer && memcmp( ptr, context->value->_value, MIN(TCArrayElementSize(context->values),context->buffer+VMRegionAddress(region)-ptr) ) == 0 ) { if ( context->numberOfResults >= TCArrayElementCount(context->addresses) ) { TCArrayResize( context->addresses, TCArrayElementCount(context->addresses) + TC_BUFFER_SIZE / sizeof(TCAddress) ); context->addressPtr = (TCAddress *)TCArrayBytes(context->addresses) + context->numberOfResults; @@ -542,7 +542,7 @@ int SearchStringIterationLastValue( ThreadedTask *task, unsigned iteration ) for ( i = 0; i < top; i++ ) { ptr = context->buffer + *context->lastAddressPtr - VMRegionAddress(region); - if ( memcmp( ptr, context->lastValuePtr, MIN(TCArrayElementSize(context->values),context->buffer+VMRegionAddress(region)-ptr) ) == 0 ) { + if ( ptr >= context->buffer && memcmp( ptr, context->lastValuePtr, MIN(TCArrayElementSize(context->values),context->buffer+VMRegionAddress(region)-ptr) ) == 0 ) { if ( context->numberOfResults >= TCArrayElementCount(context->addresses) ) { TCArrayResize( context->addresses, TCArrayElementCount(context->addresses) + TC_BUFFER_SIZE / sizeof(TCAddress) ); context->addressPtr = (TCAddress *)TCArrayBytes(context->addresses) + context->numberOfResults; diff --git a/VMRegion.m b/VMRegion.m index 612327a..c24d342 100644 --- a/VMRegion.m +++ b/VMRegion.m @@ -40,7 +40,6 @@ #include // for task_for_pid(3) #include // for stop(2) - static __inline__ vm_map_t _VMTaskFromPID( pid_t process ) { vm_map_t task; diff --git a/VariableTable.m b/VariableTable.m index 5d47e11..07ba3ca 100644 --- a/VariableTable.m +++ b/VariableTable.m @@ -70,7 +70,7 @@ - (void)reloadData -{ +{ if ( _dontUpdate ) { _updatePending = YES; return; diff --git a/main.m b/main.m index 68dd64f..7075d5d 100644 --- a/main.m +++ b/main.m @@ -19,9 +19,71 @@ // #import +#import +#import +#import #include "ChazLog.h" -int main( int argc, const char *argv[] ) +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]; @@ -32,7 +94,18 @@ int main( int argc, const char *argv[] ) [pool release]; - return NSApplicationMain( argc, (const char **) argv ); + 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(); } \ No newline at end of file -- 2.43.0