>>9
The challenge is to create a keygen, based on the assumption that the key verifying program cannot be changed (otherwise you'd just change it to printf("%s ok\n", argv[1]); and complete the challenge, but it would completely miss the point.)
And since when are crackers limited by such conditions in the real world ( exceptions are some secure platforms, but in that case, the challenge is cracking the platform, then all the security depending on it fails ).
In a realistic scenario, a cracker would decrypt what code is needed, if the code is encrypted, replace keys, and write a keygen for the keys he has replaced.