A mailing platform

Well, This is a bit new considering I generally only program for the xbox or various other projects for the PC.

But recently I’ve gotten more invested into internet marketing and started working with a few different networks, as well as got to have my go at different platforms all together.

So lets see here I’ve tried out Interspire ( With all add-ons ), I’d say I tried out Greenarrow considering it’s based on the same concept as Interspire, I’ve messed with Onpoint, I’ve even messed with the various desktop applications that are available.

Yet, I seem to find problems in each one whether it be the fact that it’s method of delivery is complete crap and it doesn’t send properly, rotate properly or etc.

Each one of these platforms I’ve tested myself, read reviews on, or so on have lacked some major functionality in one way or another… and it really sucks considering the amount of money these companies manage to make right off other people’s backs.

They’re charging upwards of $500 a MONTH or $1,000 per SERVER per MONTH for these things and yet they still have these short comings to them, you’d expect if they’re getting this much money for such a product it’d at least be well developed.

What I mean by that is some just suck with their delivery rates ( Interspire ), Some don’t rotate between URLs, IP(s), and such properly ( GreenArrow and Interspire Addons ), and some have thought of almost everything yet have a way too whack interface and stability issues ( On Point ).

So what’s the solution here?
Pay more money?
Buy a new platform?

Nah, I didn’t want to invest any more time or money into companies I couldn’t trust who’ve already had bad reviews or such and mailers just deal with it because they have no alternative.

No I decided I’d be making my own platform and I’d make it with the features the rest of these companies have to offer and more, we’re talking everything from ad-network API integration, to registrar API integration for linkage of your domains, fast send rates, stability, and more.

So I’d like to introduce you to CMP – The Ultimate Mailing Platform, created by Chandler Brink & Larson LLC,
this platform was created with the intention of CAN-SPAM compliant mailing and tries to improve where others had short comings.

While it’s not commercially available just yet it will be very soon, and at an affordable price ;) .

So just stick around keep checking our blogs, and sites to see development updates on this and we’ll let you know as soon as it’s gone commercial.

Questions or Comments?, Want your networks API integrated?, give the lead developer an email at crich [at] chandlerbrink [dot] com

Some early development screenshots,
campaignnew

campaignpreview

login

main_screen

main_screen1

main_screen2

Back on an automated backup solution…

As promised I told you all that when I had completed this automated backup solution I was working on awhile ago that I would release it with full documented source code.

So here we are the full completed source code,
A few things to keep in mind here are that this was done as a quick implementation it’s not intended for commercial deployment.

There are a lot of ways it could be improved such as using actual API to handle the NTBackup software and shutdown calls rather then just using system.

But this was the quickest way for me to implement it and after putting it through rigorous testing on about 20+ client work stations the test results were perfect for what my client was looking for.

Another note is that this will not work on anything above windows XP (Vista, 7, and 8 have not used NTBackup).

It will however work with Windows 2003, Windows 2000, Windows NT, and Windows XP which is all my client was running in their network so it worked out perfectly this way and they didn’t have to shell out up to $1,000 per system they needed backed up buying licenses to all this other commercial software out there.

The reason I went with NTBackup instead of some other open source software or writing my own was due to the fact that the client was already familiar with NTBackup and the file formats it outputs as well as the recovery using it.

They were already manually using NTBackup to backup their systems and I simply created this to automate it.

Another thing to make note to would be the fact this is always running in the background on the system whether it be a server or workstation client ( It shuts down on clients there’s a flag to adjust this from server to client “serv=1″ or “serv=0″ I believe it was. )

I didn’t want to use windows task scheduler as I felt this could cause additional problems with security, as well as stability or reliability complications ( I.E. User disabled the task scheduler service for their own reasons ).

Anyway with all of the above being said here is one of the final drafts to the source code for my Automated Backup Solution for the client I’ve recently been working with.
TCP_AB

Making trainers for the xbox360, The base engine, Merry X-mas enjoy the code.

Alright so a few notes about this source…

1. I’ve gotta give credits to [c0z] for stealing portions of the DashLaunch source code and integrating it in here for certain hooking abilities and etc.
2. Natelx helped out a bit with fixing a few things when it came to hacking Alan Wake oh so long ago.
3. Xorloser just because he’s a chill guy :p and me and him always discuss 360 related things.

Now onto the actual discussion of the source:

VOID __declspec(naked) CheckDamage(VOID)
{
    DWORD Ptr;

    __asm
    {
        mr Ptr,r24
    }

    if( InfHealth == TRUE && Ptr != 0x00)
    {
        //printf("Player Shouldn't have been damaged here\r\n");
        float pValue = 900.0f;
        __asm{
            lfs fr13,0x5C(r29)
            fsubs fr12,fr0,fr31
            stfs pValue,0x3C(r29)
            stfs pValue,0x60(r29)
        }

    }else{
        if( Ptr != 0x00 )
        {
            //printf("Player Should be damaged here Ptr != 0x00\r\n");
            __asm{
                lfs fr13,0x5C(r29)
                fsubs fr12,fr0,fr31
                stfs fr12,0x3C(r29)
                stfs fr13,0x60(r29)
            }
        }

    }
    
    if( OneHitKo == TRUE && Ptr == 0x00 )
    {
        float nValue = 0.0f;
        __asm{
            lfs fr13,0x5C(r29)
            fsubs fr12,fr0,fr31
            stfs nValue,0x3C(r29)
            stfs nValue,0x60(r29)
        }
    }else{
        
        if( Ptr == 0x00 )
        {    
            __asm{
                lfs fr13,0x5C(r29)
                fsubs fr12,fr0,fr31
                stfs fr12,0x3C(r29)
                stfs fr13,0x60(r29)
             }
        }

    }

    __asm{
            /* return back to the game */
            /* 82B480E0 */
            lis r11,0x82B4
            ori r11,r11,0x80E4
            mtctr r11
            bctr
    }
}

Code like this above is considered a code cave,
the way it works is you basically insert your code right in-between the games code which allows you to manipulate values while functions of objects are being called.

The reason it was being done in a good majority of the games I hacked is that the damage functions generally affect more then just the current player, most of the time they’ll affect the AI as well as the player which means you have to come up with methods to detect whether the damage function is currently damaging a player or an AI.

I’ll explain a bit about this more in depth when I write a tutorial on trainer making for the team but for now that should be a good enough explanation of why you see it in every one of my trainers source.

Now lets go onto the difference between these two functions

memcpy
DmSetMemory

The ability to simply do memcpy on a DEVKIT build doesn’t work (This includes those with converted devkit kernels) there are memory restrictions to it.

So if you’re testing your trainer code on a devkit (Which is something I recommend is using a devkit kernel if you’re making trainers which we’ll get into later).

You need to use DmSetMemory instead of memcpy otherwise you’ll wind up with access violations and your game/360 crashing at a kernel level.

An example of the two should be provided in the source as I usually just comment out one and write the other back and fourth before release and during updates of my trainers.

VOID ProcessButtonPress( MESSAGEBOX_RESULT g_mb_result )
{

This function has to exist in every new game you train and you just pass the parameters from main.cpp into the header file for the game it makes things easier and makes the trainer engine a bit more universal with the whole UI setup.

VOID ShowTrainerMain()
{
    Prompt = XShowMessageBoxUI(0, L"Team XPG - DeadlyData", L"Body Count Trainer V0.1\r\nView Codes: DPAD-DOWN(x4)", ARRAYSIZE(g_strButtons), g_strButtons, 0, XMB_PASSCODEMODE, &g_mb_result, &g_xol);
}

The above code must also exist in every game you train as when the main.cpp gets the START+BACK it calls on this and this spawns the box where it allows you to enter a code in order to view codes, or etc etc etc.

I had to do a bit of hachary to this code in order to make it not have users “Verify their passcode”

Exhibit A.

Flag Definition XMB_NOICON
Does not display an icon. XMB_ERRORICON
Displays an error icon. XMB_WARNINGICON
Displays a warning icon. XMB_ALERTICON
Displays an alert icon. XMB_PASSCODEMODE
Prompts for and returns a passcode. XMB_VERIFYPASSCODEMODE
Prompts to verify a passcode.

In Exhibit A you’ll notice tat the code I used was a prompt for a passcode,
Well shortly after that it’ll request that user re-enter the same passcode in order to verify that it’s the correct one.

The xbox it’s self creates another message box with the “XMB_VERIFYPASSCODEMODE” attribute set the way that you get around this is by clearing the passcode before returning to the xbox/ending your function.

if( g_mb_result.rgwPasscode[0] == Y_BUTTON && g_mb_result.rgwPasscode[1] == Y_BUTTON && g_mb_result.rgwPasscode[2] == Y_BUTTON && g_mb_result.rgwPasscode[3] == Y_BUTTON )
    {
        Sleep(500);

        if( OneHitKo == true )
        {
            XShowMessageBoxUI(0, L"Cheat Disabled Successfully", L"One Hit Kills - Disabled\r\n", ARRAYSIZE(g_strButtons), g_strButtons, 0, XMB_NOICON, &g_mb_result, &g_xol);
            OneHitKo = false;
        }else{
            XShowMessageBoxUI(0, L"Cheat Enabled Successfully", L"One Hit Kills - Enabled\r\nDescription: Any monster/enemy you hit will die within the first hit.\r\n", ARRAYSIZE(g_strButtons), g_strButtons, 0, XMB_NOICON, &g_mb_result, &g_xol);
            OneHitKo = true;
        }

        memset( &g_mb_result.rgwPasscode[0], 0x00, 0x02 );
        memset( &g_mb_result.rgwPasscode[1], 0x00, 0x02 );
        memset( &g_mb_result.rgwPasscode[2], 0x00, 0x02 );
        memset( &g_mb_result.rgwPasscode[3], 0x00, 0x02 );
        Prompt = 0x9999;
    }

The above code is an example of that,
Basically what you do is use memset to clear the passcode that was entered previously then clear the Prompt variable via entering a unique value.

Also note the “Sleep(500);” the xbox has some issues with making multiple message boxes…
So we delay the spawning of new ones by 500 milliseconds, then we can display our “Cheat Enabled” or “Cheat Disabled” message boxes notifying the user the action has been done.

Now note the Y_BUTTON attribute in there,
I actually made this part really simple as the SDK didn’t originally have properly set values for the definitions of each button I made a header with each one predefined in it and it’s automatically included in my projects.

#define X_BUTTON 0x00005802
#define Y_BUTTON 0x00005803
#define RIGHT_BUMPER 0x00005804
#define LEFT_BUMPER 0x00005805
#define LEFT_TRIGGER 0x00005806
#define RIGHT_TRIGGER 0x00005807
#define DPAD_UP 0x00005810
#define DPAD_DOWN 0x00005811
#define DPAD_LEFT 0x00005812
#define DPAD_RIGHT 0x00005813

So that way instead of having to declare each hex value in order to check what button is being pressed you can simply use X_BUTTON, Y_BUTTON, etc.

Now,
Back to hooks and then you’ll find a download link for this source code.

DWORD Stuff[4];
patchInJump( (PDWORD)Stuff, (DWORD)CheckDamage, FALSE );

//DmSetMemory( (PDWORD)0x82B480D4, 4, &Stuff[0], NULL );
//DmSetMemory( (PDWORD)0x82B480D8, 4, &Stuff[1], NULL );
//DmSetMemory( (PDWORD)0x82B480DC, 4, &Stuff[2], NULL );
//DmSetMemory( (PDWORD)0x82B480E0, 4, &Stuff[3], NULL );

memcpy( (PDWORD)0x82B480D4, &Stuff[0], 4 );
memcpy( (PDWORD)0x82B480D8, &Stuff[1], 4 );
memcpy( (PDWORD)0x82B480DC, &Stuff[2], 4 );
memcpy( (PDWORD)0x82B480E0, &Stuff[3], 4 );

If you look through the DashLaunch source code you’ll notice that the “patchInJump” function exists,
However this is actually a modified version of it from [c0z]‘s originally implementation the reason being it’s not really quite possible to simply set things the way he was when you’re dealing with memory regions in games.

Nor is it possible on a devkit so what I’ve done is split it into an array of 4, with 4 bytes contained with in each array considering all instructions on PPC come out to be 4 bytes.

What this code does is overwrites the code at the location you specify with a branch into your code so that your code is executed instead of the original as soon as it’s hit.

What this means is that you’ve also got to document and replace the original code which you overwrote as well if you overwrite things that are important to the game and you don’t actually replace the code you’ve overwritten end result will be a crash most likely because you screw up the games entire operation.

Now keep in mind that you have to use the & because it’s an pointer what this is doing is forcing the function to grab the pointer to each object of the array rather then passing the array it’s self.

Anyways, Hopefully that’s explanatory enough to make this code useful to you guys and without further adue here’s a download link.

Requirements:
Xbox360 SDK
Visual Studio 2010

Recommendations for Visual Studio 2010
Get a hold of a copy of Visual Assist X.
It’s a great utility to have while programming in Visual Studio no matter the language.

Download:


https://rapidshare.com/files/3091477282/Trainer_Engine.rar

Password: teamxpg_deadlydata

Finding a good PHP IDE…

I always find myself programming in different languages for different projects,
but I’d have to say the thing I hate most about switching to any language other then managed C/C++ would be the fact it’s always difficult for me to find an IDE that I like.

I’ve read reviews, I’ve tried the applications, and yet I still can’t pin which IDE works best for me personally,
Sometimes I use VIM/nano on a shell just because it’s there and I don’t have to deal with re-uploading my work over and over again.

Sometimes I use notepad on my PC for those quick edits, and yet still have that feeling like somethings missing.

So I go back to trying a few different IDEs and when it comes down to it, it seems like they make these things way to over complicated with these options enabled by default (Auto complete, Automated error checking, etc.) and then it takes me several minutes if not hours to sit here and go through these settings to customize the IDE the way I want it to work.

So I end up going back to something like NotePad++ with simple syntax highlighting and no extra added functionality…

Then I start to think “Could I have gotten this done faster using an non-intrusive auto-complete?”, sometimes auto-complete just screws you up and makes things take longer though so it’s a real back and fourth situation.

So in the end I decided to stick with my beloved NotePad++ for my coding purposes.

What’s your experience with PHP IDE’s?
Which do you prefer?
Leave a comment below ;) .

Making trainers for the xbox360

While I’m not going to go too deeply into the subject it’s something I’m asked about quite frequently,
How does it work?
How do you do static offsets?
So on…

Well first off you’ve gotta understand how games work on the back side before even thinking of doing something like modifying the memory of one.

With that being said you also have to understand the processor architecture you’re working with in the Xbox360′s case it’s PPC Altivec.

The reason understanding those things before doing anything with the Xbox360 is the fact that yes you can make simple cheats by searching for a value you see on the screen and modifying it but what happens when you say come across DMA (Dynamic Memory Allocation)/Code shifting, which by the way is part of the security implementations on the 360.

Well this is where those other bits of knowledge come into play understanding that programmers will use “Biped” or “Player” classes to control more then just you they use these to control the AI as well because the structures are similar.

So this is where I’m referencing questions like (I’ve added a nop to the instruction that damages my health, and now the AI won’t die either).

This is because the programmers did decide to use the same class to control the AI as your player at least for health management that is.

So having an understanding of how Objects and Classes work in C/C++ is what you’re going to need here because now you’re going to break it down and figure out how the game essentially determines if you’re being damaged or if an AI is.

Once you’re able to figure out how the game determines the differences you can continue by using a code cave instead of simply modifying instructions.

So long story short this isn’t really a reference or document telling you how to make trainers for the 360 but telling you what your prerequisites are needed before attempting such.

Those being:
Basic Knowledge of Game Programming.
Understanding object oriented Programming in C/C++.
PPC Assembly.

So brush up on those and keep reading this blog for more information about trainers on the Xbox360 I plan to start posting full articles about it and going in-depth with code caves and more.

Any questions? Leave a comment.

To go shared hosting or To not go shared hosting?

I always seem to come across this when it comes to recommending things to clients or even looking for hosting myself,

The client generally says they’re looking for something secure and starts out by asking me what company would be best to go with and the most cost effective for their needs, in the back of my mind I’m honestly thinking none at this point.

My reasoning behind that not only goes with my experience but just the general stories I’ve heard sometimes not even related to security but management of these servers the companies run.

All in all I personally don’t like the idea of leaving the fate of my data in the hands of another person, what I mean by this is how do you know all of the IT(s) or Tech Support people working at a company are even qualified to be there, none the less have general knowledge of security.

It seems like companies are only looking for people with their bachelors in computer science and don’t really have security officers to implement practices like not using the same password in more then one place which generally leads to the compromise of something in the network and if something on a company’s network who I’m being hosted by is compromised I might as well consider myself compromised at that point.

Lets put it this way the internet or hosting companies in this case works kinda like a tree,
At the top of the tree you have an ISP, Upstream or etc.

Just below that you’ve got your Datacenter, NOC, or whatever else it may be,

Then goes the hosting company which orders dedicated servers from such and some people may ever order reseller packages on the same hosting company leading you to believe they’re their own hosting company which in return means you’re just leaving your data in more and more unreliable, responsible and inexperienced hands the deeper you go.

Now we’ll say that’s the middle of the tree the hosting company, then you find yourself just at the bottom of such with your website and data.

Well here’s the thing shared hosting companies deploy somewhere around thousands of websites on a single server not to mention people with resellers access and half the time they are very irresponsible (E.G. Outdated kernel, Minimal Security restrictions, World readable root bash logs, left behind automation scripts, the list goes on ).

With that being said say your website is completely secure and you feel proud, and safe about such you’ve coded this website yourself and made sure you met every security practice and standard there’s no way it’s going to be compromised by some random people on the internet looking for a little destruction/graffiti.

Wrong, You’re not safe because you’ve hosted your website with the average joe nobody shared hosting company one person on that server makes a mistake which jeopardizes their website security and the whole server is going down with them which means your website too.

I know it’s horrible but it happens and this is why I don’t agree with nor trust leaving my data in the hands of a shared hosting company.

While it’s more expensive to actually order your own dedicated server and host your website that way, in the end it comes down to what is the security, and comfort of your own data worth to you?

Now here’s the thing make a smart choice when deciding where you’re going for your dedicated server as well, because just like a hosting company, a Datacenter can be just as insecure in-fact sometimes more.

There are the obvious precautions you should always take when ordering a dedicated server which are very simple actually never provide your password to customer service techs in support panels only do so over the phone and instruct them not to document such.

Because if they do document such you’re once again putting the fate of your data into someones hands which how can you trust the average tech support guy to follow every procedure in security he was or wasn’t taught.

Next up, Never keep the default password provided by techs when your server is setup this is an obviously big no no because it goes right back to the fate of your data’s security relying on someone other then yourself.

The last comment I have about this is that if you care about your data, your companies reputation as far as security or likewise don’t host with your average joe because it’s $10-$20-$30 cheaper go with a top notch company who knows what they’re doing.

While I prefer to host my servers in my own internal network not everyone has that option because they don’t want to sacrifice the bandwidth they have available in their network,

I can understand that and also relate but where the down fall of not doing so comes in is the fact you have to rely on other people for more then just security, you’ve gotta call someone else to deal with your downtime, hardware issues or etc.

Where as when you host your services internally on your own network your IT team has full management 24/7 of it and you know your data’s fate lies in your hands and your reputable ISP(s) hands.

So with all of that being said I’d have to say don’t go with shared hosting it’s just a bad idea spend the extra money and get your self a dedicated server or just internally host your services.

Any experience with this?
Has your website/server been compromised due to lack of irresponsible techs at datacenters or hosting companies?
Have any input or questions?

Leave a comment below ;) .

Simple, Stable, Cost Effective Automated Backup Solutions

During one of my recent contracts I was asked to come up with a automated backup solution for both servers and workstations (all of which based on windows), My thought on it originally was this should be quite easy.

As it turns out I was wrong, there are so many different solutions out there and the price ranges on them all vary from cheap to very expensive it was very overwhelming and I went about it with caution and open mind.

I tested just about any trial software I could download and my final thought on it was that none of them satisfied me, and none of which were worth the amount of money the various software developers were requesting for such.

Some of the key points I want to make about this was that I had something very specific in mind on what this backup software should be capable of…

The things I was looking for over all would have been:

1. Ease of use
2. Scheduled backups
3. Full system if not drive image backups
4. Network based backups.

Through my travels and research I didn’t find anything that I even found remotely worth the asking price,
so I wound up coming up with my own solution with what I had in front of me.

Now by with what I had in front of me I’m referring to backup software/utilities Microsoft included in the older versions of windows this utility would be called NTBackup.

I know what you’re thinking this isn’t a reasonable easy to use solution, it doesn’t support network transfers, and it doesn’t have all the bells and whistles other software has to offer.

However,
It’s free!
I can work around it and use it through a command line.
It’s efficient.
It does more then just file backups (Full System State).
And It’s easy to recover with.

So upon making that decision I started *working around* the NTBackup utility to make it work the way I wanted it to,
now trust me this was not and is not an easy process as I’m currently still working on it.

First up I wanted it to be able to backup the system to the network,
So I began coding a managed C++ application which would adjust some settings in registry when it was first launched in order to insure backups of open files (NTBackup doesn’t support such by default).

Not only would it modify those registry settings but it would be the shell that stood around NTBackup in order to insure the features I was looking for.

So I started by dealing with the network backup portion of my goals, which in hindsight I should’ve started with the registry, automation, and deployment of the application due to the fact that I hadn’t written or planned out any of that yet it made it more complicated once I was done with the network portion.

Well with that being said,
I had already setup and configured an Open-E NAS on the network and I figured why not just enable SAMBA on the NAS then have each individual workstation/server back it’s self up straight to a mapped network drive.

So I did just that using the following function which is a wrapper for the WNetAddConnection API

DWORD MapNetworkDrive(LPTSTR lpLocalName, LPTSTR lpRemoteName,
	LPTSTR lpPassword, LPTSTR lpUsername)
{
	NETRESOURCEW *nr = new NETRESOURCEW;
	memset(nr, 0x00, sizeof(NETRESOURCEW) );

	nr->dwType=RESOURCETYPE_DISK;
	nr->lpLocalName=lpLocalName;
	nr->lpRemoteName=lpRemoteName;
	
	return WNetAddConnection2( nr, lpPassword, lpUsername, CONNECT_REDIRECT );
}

Now I did however run into some issues with this on some workstations,
which is where troubleshooting, debugging and error handling came into play.

                                DWORD err;
				err = MapNetworkDrive(L"Z:",L"\\\\mynasserver\\sysbackup",L"password",L"username");
				
				switch(err)
				{
					case ERROR_ALREADY_ASSIGNED:
						WriteError( 2 );
					break;

					case ERROR_INVALID_ADDRESS:
						WriteError( 4 );
					break;

					case ERROR_BAD_DEVICE:
						WriteError( 3 );
					break;

					case ERROR_PASSWORD_RESTRICTION:
						WriteError( 1 );
					break;

					case ERROR_TIMEOUT:
						WriteError( 4 );
					break;

					case ERROR_PASSWORD_MUST_CHANGE:
						WriteError( 1 );
					break;
					
					case ERROR_PASSWORD_EXPIRED:
						WriteError( 1 );
					break;

					case ERROR_BAD_USERNAME:
						WriteError( 6 );
					break;

void WriteError( int nType )
{
	ofstream errfile;
	errfile.open("C:\\abks_err.log");

	switch( nType )
	{
		case 1:
			errfile << "The NAS reported that an incorrect password was used when trying to map drive Z";
			errfile.close();
		break;

		case 2:
			errfile << "The local system reported that a drive is already mapped to the letter Z";
			errfile.close();
		break;
		
		case 3:
			errfile << "The local system gave an error saying the device is invalid";
			errfile.close();
		break;

		case 4:
			errfile << "The address of the NAS specified was invalid";
			errfile.close();
		break;

		case 5:
			errfile << "Timed out while trying to connect to the NAS";
			errfile.close();
		break;

		case 6:
			errfile << "The NAS replied saying we're using a bad username.";
			errfile.close();
		break;
	}

}

Now I was able to completely see what was going on when I was attempting to map network drives, and the reason why they weren’t mapping…

It came down to simple things like the user not having administrative rights or so on, but it’s always good to have some error logs to fall back on when you’re working on the development of an application.

Although I haven’t finished this application yet the initial idea of it is already implied with the provided code,
what would happen after such is the application would then call the NTBackup process through command line and tell it to do a full system state, as well as file backup.

The way it would format the said backup would be based on the currently logged in user, system name, and date/time (E.G. nulled-null-pc-12-23-12-742am.bkf ) this way backups could be organized maintained and reviewed.

There were some complications I ran into like having to compile a list of hard drives which are present on the machine without any user input due to the fact NTBackup won’t simply enumerate drives it’s self and back them all up this was left to me.

Which is where various other Microsoft API came in in order to build a bks file dynamically, remember the application at hand is going to be deployed to more then one machine with different hardware all around so it needs to be somewhat portable.

Which is why I didn’t create a server sided application which connected over the network to do the machine backups I wanted something where when I was done with this contract the IT/Support department at the company would be able to re-deploy this software on new machines them selves without any hassle.

In the end I’ve still got some work to do on the application and I do plan to provide the source code for it once it’s completed for others who are in a situation similar to mine.

But I figured it’d be an interesting first topic to cover on this blog.

So what do you think?
What experiences have you had with Automated Backup solutions or backing up systems in general?
Leave a comment below.