If youre wanting to learn cracking, you must understand fundamental concepts of programming, and machine architecture, and possess a good working knowledge of the operating system youre working with. If you dont have all three, chances are youre not really going to progress much. If you have some programming experience, then this generally helps, depending on the language. But many newbies decide they want to instantly become crackers without any programming experience. Do yourself a favour, and learn how to program first
I am often asked by people, what is the best programming language to learn ? The answer to this is never clear cut, as it depends on what your ultimate aims are. A good knowledge of Assembly language is a great help in reversing, but many people are able to crack well without necessarily being able to program in assembly. As long as you can fully understand the flow and effects of the instructions, this is often enough.
Additionally, you might want to consider learning a higher level language such as C. The web is infested with programming tutorials, do a web search. Also, Borland (http://www.borland.com) produce a free C compiler (http://www.borland.com/bcppbuilder/freecompiler/). LCC is another alternative which I use personally. Knowing C will allow you to quickly produce keygens, patches and any other tools you need to complete a crack, although a good assembly coder is able to produce these in about the same time scale.
Knowing a language like C will also aid you in studying disassembly. Various compilers produce different object code, and you can often tell what compiler was used, just by studying the generated opcodes. Although this is less of an issue as you can use IDA flirt recognition to identify the compiler too.
High level languages such as Visual Basic are not really much of a benefit to your cracking adventures. Although you can produce equivalent tools in VB, if youre writing a complex keygen, and its not quite write, you lose the ability somehwat to study the disassembly to see where exactly its going wrong.
So to summarise, if youre not technically minded, learn C, otherwise immerse yourself in assembly language. But then if youre not technically minded, why are you even wanting to become a cracker ?