Libmspack

Revisión del 15:57 5 jul 2019 de Javiermartin jc (discusión | contribuciones) (Texto reemplazado: «<div align="justify">» por «»)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Libmspack
Información sobre la plantilla
Limpbacks.jpg
Biblioteca para los formatos de compresión de Microsoft (archivos de desarrollo).
CreadorStuart Caie
DesarrolladorStuart Caie
Fecha de Creación2004-04-15 / 1999-1902
Lanzamiento inicial2015
Última versión establelibmspack 0.5alpha
Plataformas soportadasMultiplataforma
GéneroEs una herramienta de colaboración, copia de seguridad en línea
Sistemas Operativos compatiblesOS X, Debian, Fedora
IdiomaInglés
LicenciaGNU LGPL, versión 2.
Sitio web
[1]

Libmspack. Biblioteca portátil para algunos formatos de compresión de Microsoft vagamente relacionados. La liberación descargable de libmspack se puede construir en un entorno UNIX o UNIX con./configure && make. Si la obtención libmspack desde el repositorio Git, utilice el script rebuild.sh lugar (esto requiere al menos autoconf 2.57, automake y libtool 1.7). Libmspack también puede construirse sobre Microsoft Windows con el guión winbuild.sh.

Diseño

  • Robusto: No debe haber ningún error caminos no controlados. El actual estado "alfa" de la biblioteca se debe a la característica incompleta, no la falta de robustez. Los descompresores han sido probados en miles de CAB vida real y los archivos CHM y muchos casos de prueba hechas a mano diseñados para romperlos
  • Sistema completo de abstracción: Todo archivo de E / S y la gestión de memoria se realiza a través de la interfaz mspack_system. Se proporciona una implementación por defecto usando la biblioteca C estándar. No sólo hace que libmspack portátil para cualquier entorno operativo con un mínimo esfuerzo, sino que también permite todo tipo de comportamiento inesperado; desembalaje de datos de ROM, una conexión de red o tubería UNIX, mmap () ing archivos de rendimiento de la caché
  • El uso mínimo de memoria: los bloques y los flujos de datos de gran tamaño se leen y se escriben a través de tamaño fijo buffers de E / S. tamaños de búfer son ajustables por el usuario siempre que sea posible
  • Ninguna dependencia de otras bibliotecas: El código vale por sí mismo. zlib no es necesario. Incluso la biblioteca estándar de C se puede evitar. Esto puede ser muy útil para sistemas embebidos
  • No hay endian o de alineación de la estructura de problemas: todas las estructuras de datos se leen y escriben como matrices de bytes. Ellos funcionan correctamente en todas las arquitecturas y en cada compilador
  • Minimalista, pero completo: Todas las características especiales de un determinado formato de archivo deben ser apoyados, pero no más que eso. Los datos se extraen de los archivos "tal cual", almacenada en estructuras de datos simple y llanamente. El usuario debe suministrar su propia lista de hash, la escritura de metadatos o el nombre de archivo rutinas de conversión

Promoviendo

La macro MSPACK_SYS_SELFTEST () debe utilizarse para asegurar la biblioteca se puede utilizar. En particular, se comprueba si la persona que llama está utilizando 32 bits archivo de E / S cuando la biblioteca está compilado para 64 bits / S de archivos y viceversa. Si compilado normalmente, la biblioteca incluye el archivo de base de E / S y la funcionalidad de gestión de memoria usando la biblioteca C estándar. Esto se puede personalizar y se sustituye en su totalidad por la creación de un mspack_system estructura. Un compresor o descompresor para el formato requerido ha de ser instanciados antes de que pueda ser utilizado. Cada función de la construcción toma un parámetro, que puede ser un puntero a una costumbre mspack_system estructura, o NULL para utilizar el valor predeterminado. La creación de instancias devuelto, si no es NULL, contiene punteros a funciones (métodos) para trabajar con el formato de archivo determinado.

Formatos soportados

COMPRESS.EXE (SZDD) Ayuda de Microsoft (HLP) COMPRESS.EXE (KWAJ) Microsoft gabinete (CAB) Ayuda HTML (CHM) Microsoft libro electrónico (.LIT) Formato de imagen de Windows (.wim) Cambio de libreta de direcciones sin (.LZX)

Para la compresión

mspack_create_cab_compressor () crea un mscab_compressor mspack_create_chm_compressor () crea un mschm_compressor mspack_create_lit_compressor () crea un mslit_compressor mspack_create_hlp_compressor () crea un mshlp_compressor mspack_create_szdd_compressor () crea un msszdd_compressor mspack_create_kwaj_compressor () crea un mskwaj_compressor mspack_create_oab_compressor () crea un msoab_compressor

Para la descompresión

mspack_create_cab_decompressor () crea un mscab_decompressor mspack_create_chm_decompressor () crea un mschm_decompressor mspack_create_lit_decompressor () crea un mslit_decompressor mspack_create_hlp_decompressor () crea un mshlp_decompressor mspack_create_szdd_decompressor () crea un msszdd_decompressor mspack_create_kwaj_decompressor () crea un mskwaj_decompressor mspack_create_oab_decompressor () crea un msoab_decompressor

Una vez terminado de trabajar con un formato, cada tipo de compresor / descompresor tiene su propio destructor específica: mspack_destroy_cab_compressor () mspack_destroy_cab_decompressor () mspack_destroy_chm_compressor () mspack_destroy_chm_decompressor () mspack_destroy_lit_compressor () mspack_destroy_lit_decompressor () mspack_destroy_hlp_compressor () mspack_destroy_hlp_decompressor () mspack_destroy_szdd_compressor () mspack_destroy_szdd_decompressor () mspack_destroy_kwaj_compressor () mspack_destroy_kwaj_decompressor () mspack_destroy_oab_compressor () mspack_destroy_oab_decompressor ()

La destrucción de un compresor o descompresor no destruye cualquier objeto, estructuras o mangos que han sido creados usando ese compresor o descompresor. Asegúrese de que todo lo creado o abierto o cerrado se destruye antes de compresor / descompresor se destruyó en sí.

Códigos de error

Todos los compresores y descompresores utilizan el mismo conjunto de códigos de error. La mayoría de los métodos devuelven un código de error. Para métodos que no devuelven directamente los códigos de error, el código de error se puede obtener con el método Last_Error ().

  • MSPACK_ERR_OK se utiliza para indicar el éxito. Este código de error se define como cero, el resto de código son no-cero.
  • MSPACK_ERR_ARGS indica que un método fue llamado con argumentos inapropiados.
  • MSPACK_ERR_OPEN indica que mspack_system :: Open () falló.
  • MSPACK_ERR_READ indica que mspack_system :: read () falló.
  • MSPACK_ERR_WRITE indica que mspack_system :: write () falló.
  • MSPACK_ERR_SEEK indica que mspack_system :: Seek () falló.
  • MSPACK_ERR_NOMEMORY indica que mspack_system :: alloc () falló.
  • MSPACK_ERR_SIGNATURE indica que el archivo que se lee no tiene la "firma" correcta. Probablemente no es un archivo válido para cualquier formato que se está leyendo.
  • MSPACK_ERR_DATAFORMAT indica que el archivo se está utilizando o leer es corrupto.
  • MSPACK_ERR_CHECKSUM indica que una suma de comprobación de datos ha fallado.
  • MSPACK_ERR_CRUNCH indica un error ocurrido durante la compresión.
  • MSPACK_ERR_DECRUNCH indica un error ocurrido durante la descompresión.

Multi-threading

libmspack métodos son reentrantes y multihilo de fallos cuando cada hilo tiene su propio compresor o descompresor. No se debe llamar a varios métodos simultáneamente en un único compresor o descompresor instancia. Si esto puede suceder, puede utilizar un compresor o descompresor por hilo, o puede utilizar el bloqueo preferido, semáforos o en la biblioteca de exclusión mutua para asegurar que no más de un método en un compresor / descompresor se llama de forma simultánea. libmspack no hará bloqueo para usted.

Ejemplo de comportamiento incorrecto

  • 1 hilo de llamadas mspack_create_cab_decompressor ()
  • hilo 1 llama abierta ()
  • extraen de rosca 1 llama () para un archivo
  • hilo 2 llamadas simultáneamente extracto () de otro archivo

Comportamiento correcto

  • 1 hilo de llamadas mspack_create_cab_decompressor ()
  • hilo 2 llamadas mspack_create_cab_decompressor ()
  • 1 hilo llama a su propia open () / extracto ()
  • 2 hilo llama al mismo tiempo su propia open () / extracto ()

También correcto comportamiento

  • 1 hilo de llamadas mspack_create_cab_decompressor ()
  • 1 hilo encierra un mutex para con el descompresor antes de llamar a cualquier método en él, y desbloquea el mutex después de cada devuelve el método.
  • 1 hilo puede compartir los resultados de open () con rosca 2, y ambos pueden llamar extracto (), siempre que tanto la guardia contra el uso simultáneo de extracto (), y cualesquiera otros métodos, con la exclusión mutua

Licencia

libmspack es software libre bajo la GNU LGPL, versión 2 . Esto permite a la biblioteca para ser acoplado a cualquier software, libre o propietario. Si desea utilizar esta biblioteca bajo una licencia diferente, por favor ponerse en contacto.

Descargar libmspack

La última versión de libmspack es 0.5alpha libmspack, publicado el 26 de enero de 2015. En el desarrollo de código puede ser obtenida de la libmspack repositorio Git.

Usando

La liberación descargable de libmspack se puede construir en un entorno UNIX o UNIX con./configure && make. Si la obtención libmspack desde el repositorio Git, utilice el script rebuild.sh lugar (esto requiere al menos autoconf 2.57, automake y libtool 1.7). libmspack también puede construirse sobre Microsoft Windows con el guión winbuild.sh. Aquí está un ejemplo sencillo de uso, lo que creará un descompresor CAB, lo utilizan para leer el archivo de example.cab, y la lista de los nombres de todos los archivos contenidos en el archivo:

#include <stdio.h>
# include <unistd.h>
# include <mspack.h>
int main () {
  struct mscab_decompressor * CABD;
  struct mscabd_cabinet * cabina;
  struct archivo mscabd_file *;
  prueba int;
  MSPACK_SYS_SELFTEST (prueba);
  si (prueba = MSPACK_ERR_OK!) baja (0);
  if ((CABD = mspack_create_cab_decompressor (NULL))) {
    if ((cab = cabd-> abierta CABD, "example.cab" ())) {
      para (archivo CAB => archivos; archivo; file = Archivo-> siguiente) {
        printf ( "% s \ n", Archivo-> nombre de fichero);
      }
      cabd-> cerrar (CABD, taxi);
    }
    mspack_destroy_cab_decompressor (CABD);
  }
  return 0;
}

Vulnerabilidades de seguridad

Esta es una lista de vulnerabilidad de seguridad detectados en libmspack, y la versión (s) de libmspack que afectan. Debe actualizar a la versión más reciente siempre que sea posible. Si se descubre una vulnerabilidad de seguridad en libmspack, por favor, póngase en contacto conmigo inmediatamente. Vulnerabilidad

  • CVE-2015-4471 : Un archivo CAB con datos comprimidos-LZX que termina la fase inicial de un bloque comprimido de tamaño irregular puede causar un 1 byte bajo-leer, pero ningún accidente
  • CVE-2015-4470 : Un archivo CAB con datos comprimidos-MSZIP y un código de distancia de 30 hace un 1 byte exceso de leer, pero ningún accidente
  • CVE-2015-4469 : Un archivo CHM con longitudes o compensaciones de nombre de archivo mal codificados-causa el exceso de leer y de segmentación en arquitecturas de 32 bits
  • CVE-2015-4468 , CVE-2015-4472 : Un archivo CHM con longitudes de nombre codificados mal-en PGML / PGMI bloques provoca un exceso de leer y de segmentación en arquitecturas de 32 bits
  • CVE-2015-4467 : Un archivo CHM con intervalo de restablecimiento de las causas de división por cero por cero.
  • CVE-2014-9732 : Un archivo CAB con dos carpetas, la segunda carpeta no válida, y una orden de descompresión de archivos de la carpeta 1, 2, 1, hace que la ejecución salte a NULL
  • CVE-2014-9556 : En arquitecturas de 32 bits, un archivo CAB con un archivo no válido offset o longitud (donde compensado + longitud == 2 ^ 32) provoca un bucle infinito en el decodificador Quantum
  • CVE-2010-2800 : Un archivo CAB que termina en un bloque sin comprimir MS-postal provoca un bucle infinito en el decodificador MS-postal

Fuentes