Qué son los Shims en Windows y para qué se utilizan realmente

Última actualización: 30/06/2025
Autor: Isaac
  • Los Shims en Windows son capas intermedias que modifican llamadas a APIs, permitiendo que aplicaciones antiguas funcionen correctamente en nuevos sistemas operativos.
  • Microsoft usa los Shims en el Kit de Compatibilidad de Aplicaciones (ACT) para simular entornos anteriores y resolver problemas de compatibilidad sin modificar el software original.
  • En programación, los Shims también se aplican para pruebas unitarias mediante herramientas como Microsoft Fakes, interceptando llamadas a métodos para garantizar resultados consistentes.
  • Aunque útiles para la compatibilidad, los Shims pueden ser explotados con fines maliciosos, permitiendo inyecciones de DLL o escaladas de privilegios ocultas si no se gestionan correctamente.

cómo detener procesos en windows con el comando taskkill-4

Si alguna vez has intentado ejecutar una aplicación antigua en una versión reciente de Windows, seguramente te habrás topado con problemas de compatibilidad. Muchos usuarios no lo saben, pero detrás de esas soluciones mágicas que ofrece Windows para que los programas antiguos funcionen, se esconden los llamados Shims. Aunque suene a jerga técnica, estos pequeños elementos cumplen una función enorme dentro del ecosistema de compatibilidad de Microsoft.

En este artículo vamos a explicar qué son los Shims en Windows, cómo se utilizan, los distintos escenarios en los que entran en juego —tanto legítimamente como con fines maliciosos— y cuál es su importancia en entornos de desarrollo, pruebas y seguridad informática. Si estás interesado en el funcionamiento profundo de Windows o trabajas con aplicaciones heredadas, este artículo está hecho para ti.

¿Qué es un Shim en informática?

En programación, un Shim es una capa de código que intercepta llamadas a una API para modificar su comportamiento sin alterar el código original de la aplicación ni de la API. Esta técnica se utiliza comúnmente para garantizar compatibilidad entre versiones de software o para alterar funcionalidades de forma temporal y controlada.

Los Shims pueden interceptar, modificar o redirigir una llamada. Por ejemplo, si una aplicación espera una función que ya no existe en una nueva versión del sistema operativo, un Shim puede captar esa llamada y redirigirla a otra función compatible. También pueden modificarse los argumentos o incluso simular una respuesta.

Este concepto se ha utilizado ampliamente en distintas áreas: desde navegadores que implementan nuevas funciones para versiones antiguas a través de polyfills, hasta entornos de red y sistemas operativos como Windows que necesitan mantener aplicaciones de años anteriores funcionando sin errores.

  Cómo usar OneNote para tomar apuntes en clases o reuniones

El uso de Shims en Windows: compatibilidad con versiones anteriores

shim

Microsoft implementó de forma oficial los Shims dentro del Application Compatibility Toolkit (ACT), un conjunto de herramientas diseñado para solucionar errores de compatibilidad en versiones modernas de Windows. Esta funcionalidad es crucial cuando se trata de aplicaciones que fueron diseñadas para versiones antiguas del sistema y que no se han actualizado con el tiempo.

Una de las opciones más potentes dentro del ACT es la posibilidad de aplicar «mentiras sobre versiones» (version lies). Este tipo de Shim hace creer a una aplicación que se está ejecutando en Windows XP, por ejemplo, cuando en realidad lo está haciendo sobre Windows 10 u 11. Esto se logra interceptando las llamadas de sistema relacionadas con la versión del SO y manipulando los valores que se devuelven.

Ejemplo práctico de uso de Shims con ACT

Algunos programas realizan comprobaciones muy estrictas sobre el número de versión del sistema operativo antes de instalarse. Por ejemplo, una aplicación diseñada específicamente para Windows XP puede comprobar si el sistema devuelve la versión 5.1 y, si no lo hace, bloquea la instalación. En estos casos, un Shim puede interceptar la llamada a System.Environment.OSVersion y devolver los valores 5.1, haciendo que el programa crea que está corriendo sobre XP.

Para aplicar este tipo de corrección se utiliza el componente Compatibility Administrator del ACT, donde se selecciona un Shim como WinXPSP3VersionLie y se indica que se aplique a todos los módulos de la aplicación.

Cómo se instalan los Shims

Una vez configurado el Shim desde el ACT, se guarda como un archivo .sdb (Shim Database). Este archivo puede instalarse en el sistema para que Windows lo utilice cada vez que se ejecute la aplicación correspondiente. El sistema operativo detecta la presencia del Shim y modifica su comportamiento en tiempo de ejecución.

Esto permite que aplicaciones que de otro modo serían incompatibles puedan ejecutarse sin errores, sin requerir modificaciones en el ejecutable original o emuladores externos.

Shims en entornos de desarrollo: pruebas unitarias en Visual Studio

Otra área donde los Shims tienen un papel relevante es en las pruebas unitarias. En entornos de desarrollo como Visual Studio, las correcciones de compatibilidad (shim) se utilizan para aislar partes del código durante las pruebas. Esto forma parte del framework Microsoft Fakes, que incluye tanto stubs como shims.

Los Shims permiten interceptar llamadas a métodos de ensamblados que no forman parte de la solución propia, como librerías del sistema o de terceros. Su objetivo es desviar la ejecución hacia un código de prueba personalizado, asegurando así que las pruebas sean predecibles y no dependan de factores externos como el sistema de archivos, la red o la hora del sistema.

  Make Chrome Open PDF Information in Adobe Reader

Ejemplo práctico con System.IO

Supón que tienes un método que llama a System.IO.File.ReadAllLines. En una prueba unitaria, no quieres que lea realmente del disco, sino que devuelva un conjunto fijo de datos. Con un Shim puedes interceptar esa llamada y hacer que devuelva, por ejemplo, {"Hello", "World", "Shims"}.

Esto se logra utilizando el archivo Fakes correspondiente, que se genera automáticamente desde el proyecto de pruebas. Dentro del Shim, la llamada original se reemplaza con una función personalizada.

Tipos de métodos soportados

Los Shims de Fakes pueden aplicarse a:

  • Métodos estáticos: Se interceptan y se les asocia un delegado que define el nuevo comportamiento.
  • Métodos de instancia (todas las instancias): Usan la clase AllInstances para interceptar el método en cualquier objeto de esa clase.
  • Métodos de instancia para una instancia única: Se crea un objeto Shim ligado a una instancia específica.
  • Constructores: Se pueden interceptar y devolver instancias modificadas del objeto en cuestión.

Limitaciones de los Shims en pruebas

No todo puede interceptarse con Shims. Por ejemplo, no se pueden usar en ciertas clases base de .NET como mscorlib en algunos entornos. Además, no se recomienda ejecutar pruebas de forma paralela cuando se usan Shims, ya que afectan a todo el AppDomain y no tienen afinidad por subprocesos, lo que puede generar resultados inconsistentes.

Shims como herramienta de ciberseguridad ofensiva

Los Shims también han llamado la atención de actores maliciosos. Al ser una forma legítima de interceptar y modificar procesos del sistema, pueden utilizarse para inyectar código malicioso en procesos seguros o incluso para escalar privilegios.

Una técnica conocida como Shimming Attack consiste en crear una base de datos de compatibilidad personalizada que parchea un ejecutable o DLL en el arranque, permitiendo la ejecución de código no autorizado sin necesidad de reiniciar el sistema. Esto se puede lograr utilizando el mismo sistema de .sdb que utiliza Microsoft, pero con fines maliciosos.

  Cómo solucionar problemas con la tarjeta gráfica en Windows 11

La herramienta Shims Database Parser permite a los investigadores de seguridad analizar estos archivos .sdb y detectar si hay intentos de hot patching, inyección de DLLs o cambios en los privilegios de ejecución.

Cómo se detectan estos ataques

Algunos indicadores clave a buscar son:

  • Instalación de Shim Database fuera de los directorios esperados
  • Fechas de modificación inusuales
  • Patrones de coincidencia/reescritura sospechosos dentro de los bytes de las aplicaciones objetivo

Estas manipulaciones se almacenan en el registro de Windows y pueden durar incluso después de reiniciar el sistema. Por ello, es esencial monitorear cualquier cambio sospechoso en los archivos .sdb presentes en \Windows\AppPatch\sysmain.sdb o sus equivalentes.

¿Qué diferencia hay entre un Shim, un Wrapper y un Stub?

En el desarrollo de software existen varios conceptos similares que pueden confundirse fácilmente:

  • Shim: intercepta y modifica llamadas a APIs, reescribiendo o redirigiendo su comportamiento sin alterar el código original.
  • Wrapper: encapsula otra función u objeto, añadiendo funcionalidad sin modificar el objeto original.
  • Stub: reemplazo simplificado de una función real, normalmente usado durante pruebas para simular comportamiento.

Mientras que los Wrappers y Stubs se crean explícitamente en el código, los Shims trabajan a un nivel más bajo, modificando el comportamiento en tiempo de ejecución, incluso sobre librerías compiladas o el propio sistema operativo.

Estos elementos son fundamentales para entender cómo Windows mantiene la compatibilidad, desarrolla pruebas y también cómo puede ser explotado por actores maliciosos. La comprensión adecuada de sus diferencias y funciones es clave para aprovechar sus beneficios y protegerse frente a sus riesgos.

Deja un comentario