Los AVs no aplican el proceso de descifrado sobre cada ejecutable ni sobre el ejecutable entero, solo sobre aquellos sospechosos. Además, en un cifrado XOR normal el tamaño de la clave es de 8 bytes. Algo perfectamente asumible.
Respecto al uso de CopyFile()... no hace saltar por sí solo la detección sino un conjunto de patrones distintos, como podría ser detectar una función de [des]cifrado o que no haya imports de kernel32 o que sólo haya una sección en el PE...
Pensé que harías uso o de alguna función de ejecución como ShellExecuteEx() o alguna de copiado por la detección de "MULDROP" de Dr.Web. Aún no tratándose de emulación de código los AVs aplican cifrados simples sobre cadenas ofuscadas durante un análisis heurístico.
Me alegro que hayas podido quitarte las detecciones, teniendo el código fuente el sistema es simple; ir quitando trozos y ver que lo hacía saltar.
Los AVs ya aplican a las cadenas XORs con diferentes valores. Podrías probar a eliminar las cadenas y compilar a ver si saltan las mismas detecciones. De ser así el problema es el cifrado, de no ser así es la forma en que lo aplicas. C es muy explícito a la hora de generar binarios y un bucle en el que vas leyendo byte por byte hace saltar las heurísticas.
Olvídate de la evadir la detección parcheando firmas, si tienes el código trabaja con él. ¿En que lenguaje lo has programado? Si todas las cadenas están cifradas... ¿Que cifrado usas?
Si no me equivoco el método de Cobein no funciona en Windows7. Creo recordar que lo que hacía era básicamente duplicar el Handle para poder cerrarlo el mismo, sin inyección de código.
Cuando una aplicación abre un fichero de forma exclusiva sólo ésta puede acceder al mismo. Hasta que la aplicación no cierre el handle tú no podrás hacer nada.
Sin entrar en aspectos más técnicos de como funcionan los handles de Windows la forma más "simple" es inyectando código en el proceso del que quieras cerrar el handle y hacer la llamada a CloseHandle() desde dentro de éste.