Módulos são plugins para o Drupal, capazes de estender as funcionalidades do seu núcleo, as funcionalidades são incluídas nos módulos, que podem ser ativados ou desativados, somente os módulos do core que são requeridos para o sistema funcionar não podem ser desativados, como por exemplo o módulo User que gerencia o registro de usuários e o sistema de autenticação.
Os módulos são desenvolvidos para versões específicas, um módulo da versão 4.x não ira funcionar na versão 5.x. desenvolvidos e mantidos por membros da comunidade Drupal e até mesmo por empresas que ao criarem novos projetos e desenvolverem módulos contribuem com a comunidade disponibilizando o código para outras pessoas, esses módulos são encontrados no site oficial do Drupal, todos os módulos que não fazem parte de qualquer lançamento oficial pode não serem otimizados ou podem até mesmo não funcionar corretamente.
A figura abaixo mostra como os módulos compõem o sistema, tanto os módulos núcleo quanto os módulos adicionais.

O Drupal faz uso de IoC (Inversion of Control) em português conhecido como inversão de controle, um padrão de desenvolvimento "design pattern" de software onde a sequência (controle) de chamadas dos métodos não é determinada pelo programador. Este controle é delegado a uma infraestrutura de software muitas vezes chamadas de container. Fazendo com que funcionalidades modulares são chamadas pelo framework no tempo apropriado. Isto permite com que módulos se interage com outros módulos, para isso o Drupal utiliza o termo hook, em português gancho ou anzól.
O hook tem por finalidade permitir com que módulos possam interagir com o núcleo do Drupal.
O sistema de modulo do Drupal é baseado no conceito de "hooks". Um hook é uma função PHP que é nomeada através de convenções, permitindo que eles sejam chamados pelo drupal na medida em que as coisas vão acontecendo. Eles podem ser considerados como eventos internos do Drupal.
Por exemplo: foo_bar(), onde "foo" é o nome do módulo e "bar" o nome do hook. Cada hook possui um conjunto definido de parâmetros e um determinado tipo de resultado.
Para estender o Drupal, um módulo necessita simplesmente de um hook. Quando o Drupal pretende permitir intervenção de módulos, é que determina os módulos que implementam um hook específico e chama o hook em todos os módulos que imprementam ele.
Para exemplificar melhor, darei um exemplo típico com o módulo user, este módulo provê um hook chamado hook_user, responsável por ações em contas de usuários.
Digamos que queremos adicionar uma informação na página do profile do usuário, uma situação típica do uso do hook_user. Neste caso devemos utilizar o hook com o parêmetro view.
Através do código abaixo, que seria adicionado dentro do arquivo do nosso módulo chamado teste.module seria possível visualizar um conteúdo teste na página do profile do usuário, um código simples, que provê bastante funcionalidade.
function teste_user($op, &$edit, &$user) {
if ($op == 'view') {
$items['teste'] = array(
'title' => t('Conteudo teste'),
'value' => 'Apenas para teste'
);
return array(t('History') => $items);
}
}
Podemos utilizar o hook user para diversas outras situações, como por exemplo enviar uma notificação por email toda vez com que o usuário passe pelo sistema de autenticação.
qualquer outra função com chamada semelhante.