Hola!
El término cracker se usa en 2 formas:
- Para identificar a un hacker "malo" que se dedidca a meterse en sistemas y borrar todo; o cifrar todo y pedir rescate, etc. etc.
- Para identificar a un reverser que se dedidca a estudiar/eliminar protecciones de software/hardware
Asumiendo, por lo que has escrito, que te refieres al segundo (que es lo que hacemos en éste área), te respondo que no es necesario saber programar 100% en un lenguaje, para crackear software ó hardware. Por supuesto, como todo, mientras más sabes, mejor será; pero basta con que sepas lo esencial sobre lo que estás atacando (software o hardware) y listo.
Cuando realizas reversing sobre un software, el fin es entender qué es lo que hace el programa. Ahora, el resultado lo puedes plasmar en pseudo código, con lo que no sería necesario saber programar 100% en un lenguaje específico.
El tema de la programación surje cuando intentas hacer algo con la info que has conseguido. El el caso del cracking, puede que sólo necesites hacer un parche (cambiar un salto o una variable, etc.), un inline, o bien que necesites un loader o un keygen. En los últimos deberás implementar en un lenguaje, por lo que deberás aprender a programar.
Respondiendo a tu pregunta final, para el cracking de aplicaciones debes ser un buen reverser. Una vez que logras entender lo que hace la app, puedes hacer lo que quieras con ella.
Saludos!