]> Dogcows Code - chaz/thecheat/blob - RemoteCheater.m
The Cheat 1.2
[chaz/thecheat] / RemoteCheater.m
1
2 // **********************************************************************
3 // The Cheat - A universal game cheater for Mac OS X
4 // (C) 2003-2005 Chaz McGarvey (BrokenZipper)
5 //
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)
9 // any later version.
10 //
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.
15 //
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.
19 //
20
21 #import "RemoteCheater.h"
22
23
24 @interface RemoteCheater ( PrivateAPI )
25
26 - (void)_handlePacket;
27
28 @end
29
30
31
32 @implementation RemoteCheater
33
34
35 - (void)dealloc
36 {
37 [self disconnect];
38 [super dealloc];
39 }
40
41
42 - (BOOL)connectToHostWithData:(NSData *)data
43 {
44 if ( _socket ) {
45 [self disconnect];
46 }
47 _socket = [[MySocket alloc] initWithDelegate:self];
48 if ( ![_socket connectToAddressWithData:data] ) {
49 return NO;
50 }
51
52 // start reading from the socket
53 [_socket readDataToLength:sizeof(TCPacketHeader) tag:0];
54
55 return YES;
56 }
57
58 - (NSString *)hostAddress
59 {
60 return [_socket remoteHost];
61 }
62
63
64 // #############################################################################
65 #pragma mark Cheater Override
66 // #############################################################################
67
68 - (void)connect
69 {
70 NSData *params = [NSArchiver archivedDataWithRootObject:[NSString stringWithFormat:@"%@ %@", ChazAppName(), ChazAppVersion()]];
71 TCPacketHeader header = { TC_NIFTY, [params length], "connect" };
72 [_socket writeBytes:&header length:sizeof(header) tag:0];
73 [_socket writeData:params tag:0];
74 }
75
76 - (void)disconnect
77 {
78 [_socket setDelegate:nil];
79 [_socket release];
80 _socket = nil;
81 //[_delegate cheaterDidDisconnect:self];
82 }
83
84 - (void)authenticateWithPassword:(NSString *)password
85 {
86 NSData *params = [NSArchiver archivedDataWithRootObject:password];
87 TCPacketHeader header = { TC_NIFTY, [params length], "authenticate" };
88 [_socket writeBytes:&header length:sizeof(header) tag:0];
89 [_socket writeData:params tag:0];
90 }
91
92
93 - (void)getProcessList
94 {
95 TCPacketHeader header = { TC_NIFTY, 0, "getproclist" };
96 ChazLog( @"SENT getproclist" );
97 [_socket writeBytes:&header length:sizeof(header) tag:0];
98 }
99
100
101 - (void)setTarget:(Process *)target
102 {
103 NSData *params = [NSArchiver archivedDataWithRootObject:target];
104 TCPacketHeader header = { TC_NIFTY, [params length], "settarget" };
105 [_socket writeBytes:&header length:sizeof(header) tag:0];
106 [_socket writeData:params tag:0];
107 }
108
109 - (void)pauseTarget
110 {
111 TCPacketHeader header = { TC_NIFTY, 0, "pausetarget" };
112 [_socket writeBytes:&header length:sizeof(header) tag:0];
113 }
114
115 - (void)resumeTarget
116 {
117 TCPacketHeader header = { TC_NIFTY, 0, "resumetarget" };
118 [_socket writeBytes:&header length:sizeof(header) tag:0];
119 }
120
121
122 - (void)limitReturnedResults:(unsigned)limit
123 {
124 NSData *params = [NSArchiver archivedDataWithRootObject:[NSNumber numberWithUnsignedInt:limit]];
125 TCPacketHeader header = { TC_NIFTY, [params length], "limitresults" };
126 [_socket writeBytes:&header length:sizeof(header) tag:0];
127 [_socket writeData:params tag:0];
128 }
129
130 - (void)searchForVariable:(Variable *)data comparison:(TCSearchOperator)op
131 {
132 NSData *params = [NSArchiver archivedDataWithRootObject:[NSArray arrayWithObjects:data, [NSNumber numberWithUnsignedChar:op], nil]];
133 TCPacketHeader header = { TC_NIFTY, [params length], "search" };
134 [_socket writeBytes:&header length:sizeof(header) tag:0];
135 [_socket writeData:params tag:0];
136 }
137
138 - (void)searchLastValuesComparison:(TCSearchOperator)op
139 {
140 NSData *params = [NSArchiver archivedDataWithRootObject:[NSNumber numberWithUnsignedChar:op]];
141 TCPacketHeader header = { TC_NIFTY, [params length], "lastsearch" };
142 [_socket writeBytes:&header length:sizeof(header) tag:0];
143 [_socket writeData:params tag:0];
144 }
145
146 - (void)cancelSearch
147 {
148 TCPacketHeader header = { TC_NIFTY, 0, "cancelsearch" };
149 [_socket writeBytes:&header length:sizeof(header) tag:0];
150 }
151
152 - (void)clearSearch
153 {
154 TCPacketHeader header = { TC_NIFTY, 0, "clearsearch" };
155 [_socket writeBytes:&header length:sizeof(header) tag:0];
156 }
157
158 - (void)getMemoryDump
159 {
160 TCPacketHeader header = { TC_NIFTY, 0, "dump" };
161 [_socket writeBytes:&header length:sizeof(header) tag:0];
162 }
163
164 - (void)cancelMemoryDump
165 {
166 TCPacketHeader header = { TC_NIFTY, 0, "canceldump" };
167 [_socket writeBytes:&header length:sizeof(header) tag:0];
168 }
169
170
171 - (void)makeVariableChanges:(NSArray *)variables repeat:(BOOL)doRepeat interval:(NSTimeInterval)repeatInterval
172 {
173 NSData *params = [NSArchiver archivedDataWithRootObject:[NSArray arrayWithObjects:variables,
174 [NSNumber numberWithBool:doRepeat], [NSNumber numberWithDouble:repeatInterval], nil]];
175 TCPacketHeader header = { TC_NIFTY, [params length], "changevars" };
176 [_socket writeBytes:&header length:sizeof(header) tag:0];
177 [_socket writeData:params tag:0];
178 }
179
180 - (void)stopChangingVariables
181 {
182 TCPacketHeader header = { TC_NIFTY, 0, "stopchange" };
183 [_socket writeBytes:&header length:sizeof(header) tag:0];
184 }
185
186
187 - (void)undo
188 {
189 TCPacketHeader header = { TC_NIFTY, 0, "undo" };
190 [_socket writeBytes:&header length:sizeof(header) tag:0];
191 }
192
193 - (void)redo
194 {
195 TCPacketHeader header = { TC_NIFTY, 0, "redo" };
196 [_socket writeBytes:&header length:sizeof(header) tag:0];
197 }
198
199
200 - (void)watchVariablesAtIndex:(unsigned)index count:(unsigned)count interval:(NSTimeInterval)checkInterval
201 {
202 NSData *params = [NSArchiver archivedDataWithRootObject:[NSArray arrayWithObjects:[NSNumber numberWithUnsignedInt:index],
203 [NSNumber numberWithUnsignedInt:count], [NSNumber numberWithDouble:checkInterval], nil]];
204 TCPacketHeader header = { TC_NIFTY, [params length], "watchvars" };
205 [_socket writeBytes:&header length:sizeof(header) tag:0];
206 [_socket writeData:params tag:0];
207 }
208
209 - (void)stopWatchingVariables
210 {
211 TCPacketHeader header = { TC_NIFTY, 0, "stopwatching" };
212 [_socket writeBytes:&header length:sizeof(header) tag:0];
213 }
214
215
216 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
217 #pragma mark MySocketDelegate
218 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
219
220 - (void)socket:(MySocket *)mySocket didReadData:(NSData *)theData tag:(int)tag
221 {
222 if ( tag == 0 && [theData length] == sizeof(TCPacketHeader) ) {
223 // got a packet header
224 memcpy( &_header, [theData bytes], sizeof(TCPacketHeader) );
225 if ( _header.size > 0 ) {
226 // request the rest of the packet
227 [mySocket readDataToLength:_header.size tag:1];
228 }
229 else {
230 [self _handlePacket];
231 // start reading the next packet
232 [mySocket readDataToLength:sizeof(TCPacketHeader) tag:0];
233 }
234 }
235 else if ( tag == 1 && [theData length] == _header.size ) {
236 // got packet parameter data
237 _parameters = [theData retain];
238 [self _handlePacket];
239 // start reading the next packet
240 [mySocket readDataToLength:sizeof(TCPacketHeader) tag:0];
241 }
242 else {
243 ChazLog( @"RemoteCheater - read expected data, disconnecting..." );
244 [self disconnect];
245 }
246 }
247
248 - (void)socketDidDisconnect:(MySocket *)mySocket
249 {
250 [_socket release];
251 _socket = nil;
252
253 [_delegate cheaterDidDisconnect:self];
254 }
255
256
257 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
258 #pragma mark PrivateAPI
259 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
260
261 - (void)_handlePacket
262 {
263 if ( strncmp( "connected", _header.name, sizeof(_header.name) ) == 0 ) {
264 ChazLog( @"RemoteCheater - connected" );
265 [_delegate cheaterDidConnect:self];
266 }
267 else if ( strncmp( "requireauth", _header.name, sizeof(_header.name) ) == 0 ) {
268 [_delegate cheaterRequiresAuthentication:self];
269 }
270 else if ( strncmp( "rejectedauth", _header.name, sizeof(_header.name) ) == 0 ) {
271 [_delegate cheaterRejectedPassword:self];
272 }
273 else if ( strncmp( "authenticated", _header.name, sizeof(_header.name) ) == 0 ) {
274 [_delegate cheaterAcceptedPassword:self];
275 }
276 else if ( strncmp( "proclist", _header.name, sizeof(_header.name) ) == 0 ) {
277 [_delegate cheater:self didFindProcesses:[NSUnarchiver unarchiveObjectWithData:_parameters]];
278 }
279 else if ( strncmp( "addprocess", _header.name, sizeof(_header.name) ) == 0 ) {
280 [_delegate cheater:self didAddProcess:[NSUnarchiver unarchiveObjectWithData:_parameters]];
281 }
282 else if ( strncmp( "removeprocess", _header.name, sizeof(_header.name) ) == 0 ) {
283 [_delegate cheater:self didRemoveProcess:[NSUnarchiver unarchiveObjectWithData:_parameters]];
284 }
285 else if ( strncmp( "didsettarget", _header.name, sizeof(_header.name) ) == 0 ) {
286 [_delegate cheater:self didSetTarget:[NSUnarchiver unarchiveObjectWithData:_parameters]];
287 }
288 else if ( strncmp( "didpausetarget", _header.name, sizeof(_header.name) ) == 0 ) {
289 [_delegate cheaterPausedTarget:self];
290 }
291 else if ( strncmp( "didresumetarget", _header.name, sizeof(_header.name) ) == 0 ) {
292 [_delegate cheaterResumedTarget:self];
293 }
294 else if ( strncmp( "vars", _header.name, sizeof(_header.name) ) == 0 ) {
295 struct varInfo {
296 unsigned count;
297 unsigned varCount;
298 unsigned varSize;
299 } *varInfo;
300 void *bytes;
301 TCArray variables;
302 varInfo = (struct varInfo *)[_parameters bytes];
303 bytes = (void *)[_parameters bytes] + sizeof(*varInfo);
304 variables = TCMakeArrayWithBytes( varInfo->varCount, varInfo->varSize, bytes );
305 [_delegate cheater:self didFindVariables:variables actualAmount:varInfo->count];
306 }
307 else if ( strncmp( "values", _header.name, sizeof(_header.name) ) == 0 ) {
308 struct varInfo {
309 unsigned varCount;
310 unsigned varSize;
311 } *varInfo;
312 void *bytes;
313 TCArray values;
314 varInfo = (struct varInfo *)[_parameters bytes];
315 bytes = (void *)[_parameters bytes] + sizeof(*varInfo);
316 values = TCMakeArrayWithBytes( varInfo->varCount, varInfo->varSize, bytes );
317 [_delegate cheater:self didFindValues:values];
318 }
319 else if ( strncmp( "didcancelsearch", _header.name, sizeof(_header.name) ) == 0 ) {
320 [_delegate cheaterDidCancelSearch:self];
321 }
322 else if ( strncmp( "didclearsearch", _header.name, sizeof(_header.name) ) == 0 ) {
323 [_delegate cheaterDidClearSearch:self];
324 }
325 else if ( strncmp( "memdump", _header.name, sizeof(_header.name) ) == 0 ) {
326 [_delegate cheater:self didDumpMemory:_parameters];
327 }
328 else if ( strncmp( "didcanceldump", _header.name, sizeof(_header.name) ) == 0 ) {
329 [_delegate cheaterDidCancelMemoryDump:self];
330 }
331 else if ( strncmp( "changedvars", _header.name, sizeof(_header.name) ) == 0 ) {
332 [_delegate cheater:self didChangeVariables:[[NSUnarchiver unarchiveObjectWithData:_parameters] unsignedIntValue]];
333 }
334 else if ( strncmp( "didstopchanging", _header.name, sizeof(_header.name) ) == 0 ) {
335 [_delegate cheaterDidStopChangingVariables:self];
336 }
337 else if ( strncmp( "progress", _header.name, sizeof(_header.name) ) == 0 ) {
338 [_delegate cheater:self didReportProgress:[[NSUnarchiver unarchiveObjectWithData:_parameters] intValue]];
339 }
340 else if ( strncmp( "revertedto", _header.name, sizeof(_header.name) ) == 0 ) {
341 struct varInfo {
342 unsigned count;
343 unsigned varCount;
344 unsigned varSize;
345 } *varInfo;
346 void *bytes;
347 TCArray variables;
348 varInfo = (struct varInfo *)[_parameters bytes];
349 bytes = (void *)[_parameters bytes] + sizeof(*varInfo);
350 variables = TCMakeArrayWithBytes( varInfo->varCount, varInfo->varSize, bytes );
351 [_delegate cheater:self didRevertToVariables:variables actualAmount:varInfo->count];
352 }
353 else if ( strncmp( "didundo", _header.name, sizeof(_header.name) ) == 0 ) {
354 [_delegate cheaterDidUndo:self];
355 }
356 else if ( strncmp( "didredo", _header.name, sizeof(_header.name) ) == 0 ) {
357 [_delegate cheaterDidRedo:self];
358 }
359 else if ( strncmp( "varchanged", _header.name, sizeof(_header.name) ) == 0 ) {
360 NSArray *params = [NSUnarchiver unarchiveObjectWithData:_parameters];
361 [_delegate cheater:self variableAtIndex:[[params objectAtIndex:0] unsignedIntValue] didChangeTo:[params objectAtIndex:1]];
362 }
363 else if ( strncmp( "failed", _header.name, sizeof(_header.name) ) == 0 ) {
364 [_delegate cheater:self didFailLastRequest:[NSUnarchiver unarchiveObjectWithData:_parameters]];
365 }
366 else if ( strncmp( "echo", _header.name, sizeof(_header.name) ) == 0 ) {
367 [_delegate cheater:self echo:[NSUnarchiver unarchiveObjectWithData:_parameters]];
368 }
369
370 [_parameters release];
371 _parameters = nil;
372 }
373
374
375
376 @end
This page took 0.045761 seconds and 5 git commands to generate.