Drupal’s hook system is essentially a mechanism for implementing custom features without needing to make any modifications to the Drupal core. There are specific places where the Drupal core can invoke custom functions defined in modules to enhance the functionality of core. These places are referred to as “hooks” and have a well-defined interface.
Hooks make it possible, for example, for a module to define new URLs and pages within a site (hook_menu), to add content to pages (hook_block, hook_footer, etc.), set up custom database tables (hook_schema), and so on.
Let’s say you want to change the core "Contact" form. To do so, you can implement hook_form_alter in your custom module and provide any custom functionality that you’d like in that function. Drupal will check all form_alter hooks in all modules, so your hook will be picked up and your custom code will be applied to the “Contact Form”.
So overall, Drupal hooks are just functions defined per the Drupal standards that allow you to extend Drupal and alter or extend core functionality without modifying any core code.