2 // **********************************************************************
3 // The Cheat - A universal game cheater for Mac OS X
4 // (C) 2003-2005 Chaz McGarvey (BrokenZipper)
6 // This program is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation; either version 1, or (at your option)
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software
18 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #import "ServerChild.h"
24 @interface ServerChild ( PrivateAPI
)
26 - (void)_handlePacket
;
28 - (void)_setClient
:(NSString
*)status
;
33 @implementation ServerChild
36 - (id)initWithSocket
:(MySocket
*)sock
38 return [self initWithSocket
:sock delegate
:nil];
41 - (id)initWithSocket
:(MySocket
*)sock delegate
:(id)delegate
43 if ( self = [super init
] ) {
44 _socket
= [sock retain
];
45 [_socket setDelegate
:self];
48 // create the cheater object
49 _cheater
= [[LocalCheater alloc
] initWithDelegate
:self];
50 [_cheater setShouldCopy
:NO
];
52 // start reading from the socket
53 [_socket readDataToLength
:sizeof(TCPacketHeader
) tag
:0];
55 if ( [_delegate respondsToSelector
:@selector(serverChildConnected
:)] ) {
56 [_delegate serverChildConnected
:self];
64 //[_socket setDelegate:[self class]];
65 //[_socket disconnect];
66 [_socket setDelegate
:nil];
70 [_parameters release
];
76 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
77 #pragma mark MySocketDelegate
78 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
80 - (void)socket
:(MySocket
*)mySocket didReadData
:(NSData
*)theData tag
:(int)tag
82 if ( tag
== 0 && [theData length
] == sizeof(TCPacketHeader
) ) {
83 // got a packet header
84 memcpy( &_header
, [theData bytes
], sizeof(TCPacketHeader
) );
85 if ( _header.size
> 0 ) {
86 // request the rest of the packet
87 [mySocket readDataToLength
:_header.size tag
:1];
91 // start reading the next packet
92 [mySocket readDataToLength
:sizeof(TCPacketHeader
) tag
:0];
95 else if ( tag
== 1 && [theData length
] == _header.size
) {
96 // got packet parameter data
97 _parameters
= [theData retain
];
99 // start reading the next packet
100 [mySocket readDataToLength
:sizeof(TCPacketHeader
) tag
:0];
103 ChazLog( @
"ServerChild - read unexpected data, disconnecting..." );
106 if ( [_delegate respondsToSelector
:@selector(serverChildDisconnected
:)] ) {
107 [_delegate serverChildDisconnected
:self];
112 - (void)socketDidDisconnect
:(MySocket
*)mySocket
117 if ( [_delegate respondsToSelector
:@selector(serverChildDisconnected
:)] ) {
118 [_delegate serverChildDisconnected
:self];
123 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
124 #pragma mark Accessors
125 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
129 return [_socket remoteHost
];
132 - (NSString
*)transfer
134 unsigned bytes
= [_socket bytesRead
] + [_socket bytesWritten
];
135 double speed
= [_socket readSpeed
] + [_socket writeSpeed
];
138 return [NSString stringWithFormat
:@
"%.1fMB (%.1fkbps)", (float)bytes
/1038576.0f
, (float)speed
/1024.0f
];
140 return [NSString stringWithFormat
:@
"%.1fMB", (float)bytes
/1038576.0f
];
149 - (void)setDelegate
:(id)delegate
151 _delegate
= delegate
;
155 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
156 #pragma mark PrivateAPI
157 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
159 - (void)_handlePacket
161 if ( strncmp( "connect", _header.name
, sizeof(_header.name
) ) == 0 ) {
162 ChazLog( @
"ServerChild - connect received!!" );
164 [self _setClient
:[NSUnarchiver unarchiveObjectWithData
:_parameters
]];
166 else if ( strncmp( "authenticate", _header.name
, sizeof(_header.name
) ) == 0 ) {
167 ChazLog( @
"ServerChild - process list requested" );
168 [_cheater authenticateWithPassword
:[NSUnarchiver unarchiveObjectWithData
:_parameters
]];
170 else if ( strncmp( "getproclist", _header.name
, sizeof(_header.name
) ) == 0 ) {
171 ChazLog( @
"ServerChild - process list requested" );
172 [_cheater getProcessList
];
174 else if ( strncmp( "settarget", _header.name
, sizeof(_header.name
) ) == 0 ) {
175 [_cheater setTarget
:[NSUnarchiver unarchiveObjectWithData
:_parameters
]];
177 else if ( strncmp( "pausetarget", _header.name
, sizeof(_header.name
) ) == 0 ) {
178 [_cheater pauseTarget
];
180 else if ( strncmp( "resumetarget", _header.name
, sizeof(_header.name
) ) == 0 ) {
181 [_cheater resumeTarget
];
183 else if ( strncmp( "limitresults", _header.name
, sizeof(_header.name
) ) == 0 ) {
184 [_cheater limitReturnedResults
:[[NSUnarchiver unarchiveObjectWithData
:_parameters
] unsignedIntValue
]];
186 else if ( strncmp( "search", _header.name
, sizeof(_header.name
) ) == 0 ) {
187 NSArray
*params
= [NSUnarchiver unarchiveObjectWithData
:_parameters
];
188 [_cheater searchForVariable
:[params objectAtIndex
:0] comparison
:[[params objectAtIndex
:1] unsignedCharValue
]];
190 else if ( strncmp( "lastsearch", _header.name
, sizeof(_header.name
) ) == 0 ) {
191 [_cheater searchLastValuesComparison
:[[NSUnarchiver unarchiveObjectWithData
:_parameters
] unsignedCharValue
]];
193 else if ( strncmp( "cancelsearch", _header.name
, sizeof(_header.name
) ) == 0 ) {
194 [_cheater cancelSearch
];
196 else if ( strncmp( "clearsearch", _header.name
, sizeof(_header.name
) ) == 0 ) {
197 [_cheater clearSearch
];
199 else if ( strncmp( "dump", _header.name
, sizeof(_header.name
) ) == 0 ) {
200 [_cheater getMemoryDump
];
202 else if ( strncmp( "canceldump", _header.name
, sizeof(_header.name
) ) == 0 ) {
203 [_cheater cancelMemoryDump
];
205 else if ( strncmp( "changevars", _header.name
, sizeof(_header.name
) ) == 0 ) {
206 NSArray
*params
= [NSUnarchiver unarchiveObjectWithData
:_parameters
];
207 [_cheater makeVariableChanges
:[params objectAtIndex
:0] repeat
:[[params objectAtIndex
:1] boolValue
]
208 interval
:[[params objectAtIndex
:2] doubleValue
]];
210 else if ( strncmp( "stopchange", _header.name
, sizeof(_header.name
) ) == 0 ) {
211 [_cheater stopChangingVariables
];
213 else if ( strncmp( "undo", _header.name
, sizeof(_header.name
) ) == 0 ) {
216 else if ( strncmp( "redo", _header.name
, sizeof(_header.name
) ) == 0 ) {
219 else if ( strncmp( "watchvars", _header.name
, sizeof(_header.name
) ) == 0 ) {
220 NSArray
*params
= [NSUnarchiver unarchiveObjectWithData
:_parameters
];
221 [_cheater watchVariablesAtIndex
:[[params objectAtIndex
:0] unsignedIntValue
] count
:[[params objectAtIndex
:1] unsignedIntValue
]
222 interval
:[[params objectAtIndex
:2] doubleValue
]];
224 else if ( strncmp( "stopwatch", _header.name
, sizeof(_header.name
) ) == 0 ) {
225 [_cheater stopWatchingVariables
];
228 [_parameters release
];
233 - (void)_setClient
:(NSString
*)client
238 if ( [_delegate respondsToSelector
:@selector(serverChildChanged
:)] ) {
239 [_delegate serverChildChanged
:self];
244 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
245 #pragma mark CheaterDelegate
246 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
249 - (void)cheaterDidConnect
:(Cheater
*)cheater
251 TCPacketHeader header
= { TC_NIFTY
, 0, "connected" };
252 ChazLog( @
"SENT didconnect" );
253 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
256 - (void)cheaterDidDisconnect
:(Cheater
*)cheater
258 // nothing needs to be done
262 - (void)cheaterRequiresAuthentication
:(Cheater
*)cheater
264 TCPacketHeader header
= { TC_NIFTY
, 0, "requireauth" };
265 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
268 - (void)cheaterRejectedPassword
:(Cheater
*)cheater
270 TCPacketHeader header
= { TC_NIFTY
, 0, "rejectedauth" };
271 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
274 - (void)cheaterAcceptedPassword
:(Cheater
*)cheater
276 TCPacketHeader header
= { TC_NIFTY
, 0, "authenticated" };
277 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
281 - (void)cheater
:(Cheater
*)cheater didFindProcesses
:(NSArray
*)processes
283 NSData
*params
= [NSArchiver archivedDataWithRootObject
:processes
];
284 TCPacketHeader header
= { TC_NIFTY
, [params length
], "proclist" };
286 ChazLog( @
"SENT proclist" );
287 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
288 [_socket writeData
:params tag
:0];
292 - (void)cheater
:(Cheater
*)cheater didAddProcess
:(Process
*)process
294 NSData
*params
= [NSArchiver archivedDataWithRootObject
:process
];
295 TCPacketHeader header
= { TC_NIFTY
, [params length
], "addprocess" };
296 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
297 [_socket writeData
:params tag
:0];
300 - (void)cheater
:(Cheater
*)cheater didRemoveProcess
:(Process
*)process
302 NSData
*params
= [NSArchiver archivedDataWithRootObject
:process
];
303 TCPacketHeader header
= { TC_NIFTY
, [params length
], "removeprocess" };
304 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
305 [_socket writeData
:params tag
:0];
309 - (void)cheater
:(Cheater
*)cheater didSetTarget
:(Process
*)target
311 NSData
*params
= [NSArchiver archivedDataWithRootObject
:target
];
312 TCPacketHeader header
= { TC_NIFTY
, [params length
], "didsettarget" };
313 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
314 [_socket writeData
:params tag
:0];
317 - (void)cheaterPausedTarget
:(Cheater
*)cheater
319 TCPacketHeader header
= { TC_NIFTY
, 0, "didpausetarget" };
320 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
323 - (void)cheaterResumedTarget
:(Cheater
*)cheater
325 TCPacketHeader header
= { TC_NIFTY
, 0, "didresumetarget" };
326 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
330 - (void)cheater
:(Cheater
*)cheater didFindVariables
:(TCArray
)variables actualAmount
:(unsigned)count
333 unsigned actualAmount
;
336 } varInfo
= { count
, TCArrayElementCount(variables
), TCArrayElementSize(variables
) };
337 unsigned bufferLen
= varInfo.varCount
* varInfo.varSize
;
339 TCPacketHeader header
= { TC_NIFTY
, sizeof(varInfo
) + bufferLen
, "vars" };
340 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
341 [_socket writeBytes
:&varInfo length
:sizeof(varInfo
) tag
:0];
342 [_socket writeBytes
:TCArrayBytes(variables
) length
:bufferLen tag
:0];
344 TCReleaseArray( variables
);
347 - (void)cheater
:(Cheater
*)cheater didFindValues
:(TCArray
)values
352 } varInfo
= { TCArrayElementCount(values
), TCArrayElementSize(values
) };
353 unsigned bufferLen
= varInfo.varCount
* varInfo.varSize
;
355 TCPacketHeader header
= { TC_NIFTY
, sizeof(varInfo
) + bufferLen
, "values" };
356 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
357 [_socket writeBytes
:&varInfo length
:sizeof(varInfo
) tag
:0];
358 [_socket writeBytes
:TCArrayBytes(values
) length
:bufferLen tag
:0];
360 TCReleaseArray( values
);
363 - (void)cheaterDidCancelSearch
:(Cheater
*)cheater
365 TCPacketHeader header
= { TC_NIFTY
, 0, "didcancelsearch" };
366 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
369 - (void)cheaterDidClearSearch
:(Cheater
*)cheater
371 TCPacketHeader header
= { TC_NIFTY
, 0, "didclearsearch" };
372 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
376 - (void)cheater
:(Cheater
*)cheater didDumpMemory
:(NSData
*)memoryDump
378 TCPacketHeader header
= { TC_NIFTY
, [memoryDump length
], "memdump" };
379 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
380 [_socket writeData
:memoryDump tag
:0];
383 - (void)cheaterDidCancelMemoryDump
:(Cheater
*)cheater
385 TCPacketHeader header
= { TC_NIFTY
, 0, "didcanceldump" };
386 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
390 - (void)cheater
:(Cheater
*)cheater didChangeVariables
:(unsigned)changeCount
392 NSData
*params
= [NSArchiver archivedDataWithRootObject
:[NSNumber numberWithUnsignedInt
:changeCount
]];
393 TCPacketHeader header
= { TC_NIFTY
, [params length
], "changedvars" };
394 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
395 [_socket writeData
:params tag
:0];
398 - (void)cheaterDidStopChangingVariables
:(Cheater
*)cheater
400 TCPacketHeader header
= { TC_NIFTY
, 0, "didstopchanging" };
401 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
405 - (void)cheater
:(Cheater
*)cheater didReportProgress
:(int)progress
407 NSData
*params
= [NSArchiver archivedDataWithRootObject
:[NSNumber numberWithInt
:progress
]];
408 TCPacketHeader header
= { TC_NIFTY
, [params length
], "progress" };
409 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
410 [_socket writeData
:params tag
:0];
414 - (void)cheater
:(Cheater
*)cheater didRevertToVariables
:(TCArray
)variables actualAmount
:(unsigned)count
417 unsigned actualAmount
;
420 } varInfo
= { count
, TCArrayElementCount(variables
), TCArrayElementSize(variables
) };
421 unsigned bufferLen
= varInfo.varCount
* varInfo.varSize
;
423 TCPacketHeader header
= { TC_NIFTY
, sizeof(varInfo
) + bufferLen
, "revertedto" };
424 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
425 [_socket writeBytes
:&varInfo length
:sizeof(varInfo
) tag
:0];
426 [_socket writeBytes
:TCArrayBytes(variables
) length
:bufferLen tag
:0];
428 TCReleaseArray( variables
);
432 - (void)cheaterDidUndo
:(Cheater
*)cheater
434 TCPacketHeader header
= { TC_NIFTY
, 0, "didundo" };
435 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
438 - (void)cheaterDidRedo
:(Cheater
*)cheater
440 TCPacketHeader header
= { TC_NIFTY
, 0, "didredo" };
441 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
445 - (void)cheater
:(Cheater
*)cheater variableAtIndex
:(unsigned)index didChangeTo
:(Variable
*)variable
447 NSData
*params
= [NSArchiver archivedDataWithRootObject
:[NSArray arrayWithObjects
:[NSNumber numberWithUnsignedInt
:index
], variable
, nil]];
448 TCPacketHeader header
= { TC_NIFTY
, [params length
], "varchanged" };
449 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
450 [_socket writeData
:params tag
:0];
454 - (void)cheater
:(Cheater
*)cheater didFailLastRequest
:(NSString
*)reason
456 NSData
*params
= [NSArchiver archivedDataWithRootObject
:reason
];
457 TCPacketHeader header
= { TC_NIFTY
, [params length
], "failed" };
458 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
459 [_socket writeData
:params tag
:0];
462 - (void)cheater
:(Cheater
*)cheater echo
:(NSString
*)message
464 NSData
*params
= [NSArchiver archivedDataWithRootObject
:message
];
465 TCPacketHeader header
= { TC_NIFTY
, [params length
], "echo" };
466 [_socket writeBytes
:&header length
:sizeof(header
) tag
:0];
467 [_socket writeData
:params tag
:0];