En informática , el intercambio de punteros es la conversión de referencias basadas en el nombre o la posición en referencias de puntero directas ( direcciones de memoria ). Normalmente se realiza durante la deserialización o la carga de un objeto reubicable desde un archivo de disco, como un archivo ejecutable o una estructura de datos basada en punteros .
La operación inversa, que consiste en reemplazar punteros de memoria con símbolos o posiciones independientes de la posición, a veces se denomina " desactivación" y se realiza durante la serialización (almacenamiento). De manera alternativa, ambas operaciones también se pueden denominar "desactivación".
Ejemplo
Es fácil crear una estructura de datos de lista enlazada utilizando elementos como este:
struct node { int datos ; struct node * siguiente ; };
Pero guardar la lista en un archivo y luego volver a cargarla romperá (en la mayoría de los sistemas operativos) todos los enlaces y hará que la lista sea inútil porque los nodos casi nunca se cargarán en las mismas ubicaciones de memoria. Una forma de guardar y recuperar la lista de manera útil es asignar un número de identificación único a cada nodo y luego deshacer los punteros convirtiéndolos en un campo que indique el número de identificación del siguiente nodo:
struct node_saved { int datos ; int número_id ; int número_id_del_siguiente_nodo ; };
Los registros como estos se pueden guardar en un archivo en cualquier orden y volver a cargarlos sin interrumpir la lista. Otras opciones incluyen guardar el desplazamiento del archivo del siguiente nodo o un número que indique su posición en la secuencia de registros guardados, o simplemente guardar los nodos en orden en el archivo.
Después de cargar una lista de este tipo, encontrar un nodo en función de su número es complicado e ineficiente (búsqueda en serie). Recorrer la lista era muy rápido con los punteros "next" originales. Para convertir la lista de nuevo a su forma original, o intercambiar los punteros, es necesario encontrar la dirección de cada nodo y convertir los campos id_number_of_next_node de nuevo en punteros directos al nodo correcto.
Métodos para desestabilizar
Hay una cantidad potencialmente ilimitada de formas en las que se puede transformar un puntero, pero algunas de las más populares incluyen:
- El desplazamiento del objeto señalado en el archivo
- El índice del objeto señalado en alguna secuencia de registros
- Un identificador único que posee el objeto señalado, como el número de Seguro Social de una persona ; en las bases de datos, todos los punteros se deshacen de esta manera (ver Clave externa ).
Métodos de agitación
En general, el swizzling puede ser complicado. El gráfico de referencia de punteros puede contener una cantidad arbitraria de ciclos ; esto complica el mantenimiento de una asignación de los valores antiguos no swizzling a las nuevas direcciones. Las matrices asociativas son útiles para mantener la asignación, mientras que los algoritmos como la búsqueda en amplitud ayudan a recorrer el gráfico, aunque ambos requieren almacenamiento adicional. Varias bibliotecas de serialización proporcionan sistemas generales de swizzling. Sin embargo, en muchos casos, el swizzling se puede realizar con suposiciones simplificadoras, como una estructura de árbol o lista de referencias.
Los diferentes tipos de swizzling son:
- Giro automático
- Swizzling a pedido
Posibles debilidades de seguridad
Por razones de seguridad, la eliminación de datos y la eliminación de datos se deben implementar con mucho cuidado. En particular, la presentación de un archivo especialmente diseñado por parte de un atacante puede permitir el acceso a direcciones fuera de los límites esperados y adecuados. En sistemas con protección de memoria débil, esto puede provocar la exposición de datos confidenciales o la modificación del código que probablemente se ejecute. Si el sistema no implementa protecciones contra la ejecución de datos, el sistema puede verse gravemente comprometido por la instalación de varios tipos de malware .
Los métodos de protección incluyen verificaciones antes de liberar los datos a una aplicación:
- Que cada desplazamiento se encuentre dentro de los límites de los datos leídos.
- Que una tabla de índices y los registros a los que apunta están igualmente restringidos.
- Que los identificadores sean únicos y, si son sensibles, estén cifrados.
- Que todos los datos de longitud variable estén restringidos a longitudes que no excedan la asignación real.
- Que las asignaciones sean de un tamaño razonable.
- Que las asignaciones realizadas que no estén cargadas con datos leídos se borren o se carguen con algún patrón específico.
Véase también
- Reubicación , una forma entusiasta de modificación de puntero
Referencias
Lectura adicional
- Wilson, Paul R. (1991-07-01) [junio de 1991]. "Movimiento de punteros en tiempo de fallo de página: soporte eficiente de espacios de direcciones enormes en hardware estándar". ACM SIGARCH Computer Architecture News . Vol. 19, no. 4. págs. 6–13. doi :10.1145/122576.122577.
- Kemper, Alfons; Kossmann, Donald (julio de 1995). "Adaptable Pointer Swizzling Strategies in Object Bases: Design, Realization, and Quantitative Analysis" (PDF) . Revista internacional sobre bases de datos muy grandes . 4 (3): 519–567. doi :10.1007/BF01231646. S2CID 4556203. Archivado (PDF) desde el original el 25 de julio de 2008 . Consultado el 8 de diciembre de 2021 .(49 páginas)
- Crawford, Derek (junio de 1992). Derek's ABC of C. Vol. 2. págs. 340–343.