It all comes down to how you define hacking.
If you want to be able to break applications, you'll obviously have to know about programming. Probably the language the application was written in would help, but most likely assembly language knowledge would be most sufficient for such tasks. The reason is that disassemblers can get the assembly code from almost any program, but getting the high-level programming language (Python, Java, C/C++ is not always possible). C# is tricky in this regard as you can always get the high-level C# code from the binaries, so C# is not considered the best language for creating secure applications.
If you want to be able to break into systems, then you'll need to learn about operating systems and security. Know how the OS works, what are the vulnerabilities, and what are easy attacks against it. How are the credentials (passwords) stored? What kind of attacks you can perform?
Often you don't even need to break the credentials of a user, it's easier to ask the user to provide their password. ;) Have you heard of social hacking? Phishing? All those scam e-mails pretending to be someone else they are not? Imagine writing an angry letter in the name of the boss to an employee that they failed to set up their new password which was due last week and this really affects production. Demanding to provide their new password and their old one so the manager can do this for them instead as this is urgent. The scared employee provides their new password (who cares?) alongside the old one (jackpot!) so the attacker now can log in with the credential willingly provided by one of the users.
To address your questions: you'll probably need to learn assembly, as mentioned above if you want to break (into) applications.
There's also a program called cheat engine that helps you poke around in running applications data and code. (Again, assembly is needed.)