Querrá cargar en una herramienta como OllyDbg y tendrá instrucciones y podrá modificarlas para que realicen el mismo tipo de trabajo que las instrucciones alternativas, luego guárdelas en el ejecutable para evitar la firma del byte en su archivo.
Puedes reescribir el código para hacer el mismo trabajo. Hagamos un escenario realmente básico.
Imagina que has visto en ejecutable. Voy a pretender que es un ejecutable x86:
004CFF64 - B8 05000000 - mov eax,00000005
004CFF69 - B8 07000000 - mov eax,00000007
Entonces, 10 bytes en total.
Podrías reescribir eso como:
004CFF64 - B8 05000000 - mov eax,00000007
004CFF69 - 90 - nop
004CFF6A - 90 - nop
004CFF6B - 90 - nop
004CFF6C - 90 - nop
004CFF6D - 90 - nop
Que aún es de 10 bytes en total, pero la firma ahora ha cambiado.
La razón por la que usamos un NOP (sin instrucción preformada) es porque no hace más que usar espacio.
Ahora, en una situación del mundo real, no lo verás tan fácil como si tuvieras que usar cuevas de código, etc. Por ejemplo, digamos que necesitaba escribir más de 10 bytes de código, entonces realmente no puede hacerlo ya que sobrescribiría la siguiente instrucción que dañaría el ejecutable. Bueno, lo que haces es usar la instrucción JMP
para liberar espacio en la memoria, que luego harás todo el código allí y usarás JMP
para volver a la ejecución normal del código.
Las firmas de bytes generalmente se realizan en archivos completos y en partes estáticas del ejecutable.
Por ejemplo, .text (a veces conocido como .code, etc.) que es la parte ejecutable del código y las regiones de memoria no se pueden escribir, por lo que no cambiarán aunque puede anular los permisos con VirtualProtect
API.
Podría entrar en muchos más detalles sobre la ofuscación, cómo funcionan las firmas de bytes y demás, pero espero que responda a su pregunta si no deja un comentario y ampliaré mi respuesta.