You have two options:
1) create a plugin along the lines of the following:
public void Execute(IServiceProvider serviceProvider)
{
var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
var service = ((IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory))).CreateOrganizationService(context.UserId);
var originalContact = context.InputParameters["Target"] as Entity;
var newContact = new Entity("new_historicalcontact");
if (originalContact.Contains("firstname"))
{
newContact.Add("new_firstname", orginalContact["firstname"]);
}
if (originalContact.Contains("emailaddress1"))
{
newContact.Add("new_emailaddress1", orginalContact["emailaddress1"]);
}
if (originalContact.Contains("parentcustomerid"))
{
newContact.Add("new_parentcustomerid", orginalContact["parentcustomerid"]);
}
//etc etc for other properties
service.Create(newContact);
}
if you aren't familiar with plugins, there are plenty of tutorials around, you can start with something like the recommendation I gave in this question
2) use the out of the box auditing features. May or may not be what you are looking for but you can read more about that here and here