Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo comprobar el origen de las descargas de eMule

Cómo comprobar el origen de las descargas de eMule

La página oficial de eMule dice: 13 de mayo de 2002 Un hombre llamado Merkur no estaba satisfecho con el cliente eDonkey2000 original. Creyó que podía hacerlo mejor y comenzó a construirlo. Reunió a otros desarrolladores a su alrededor y nació el proyecto eMule.

eMule es un programa MFC típico con una interfaz gráfica, etc., y está estrechamente integrado con MFC. Por lo tanto, normalmente sólo se ejecuta en plataformas Windows. Hay otros proyectos (como aMule) que lo han adaptado para que sea un poco más multiplataforma.

En realidad existe un proyecto llamado xMule, pero poco a poco está decayendo. En la página de inicio de aMule puedes ver el historial de la migración de eMule a Linux. Originalmente existía un proyecto llamado lMule, que usaba wxwidgets para completar la migración multiplataforma de eMule. Este proyecto ya no se actualizó en 2003 y luego se transformó en el proyecto xMule, que por un tiempo se convirtió en el reemplazo de facto de eMule. Linux. Hubo un tiempo en que era un reemplazo de facto de eMule en Linux. Sin embargo, sus programadores tuvieron conflictos internos debido a diferentes filosofías, lo que llevó a la división de aMule. El conflicto entre ellos fue muy serio. En un momento, evolucionó desde cuestiones filosóficas hasta ataques personales entre sí e implementaron DDos en los sitios web de cada uno. aMule y xMule son ahora dos proyectos completamente diferentes, y xMule ahora está administrado por una sola persona, HopeSeekr. Sólo HopeSeekr lo mantiene y básicamente ya no hay actualizaciones. Esto es más que un punto triste. Tuve algunos intercambios con HopeSeekr durante las vacaciones de invierno de este año. Sentí que tenía mucha confianza. A menudo me mostró parte del código de aMule y dijo que si miras su código, está escrito así. Dicho código se usa en algunos. En este caso, definitivamente fallará. Por el contrario, si miras nuestro código xMule, es así o aquello, ¡seguro! No habrá tal problema.

eMule comienza a soportar la tecnología Kad desde la versión 0.42, lo cual es un hito muy importante. Kad es un protocolo DHT que permite a los nodos retener información de contacto de otros nodos y aprovechar esta "red de relaciones" para encontrar cualquier nodo en la red y los recursos que contiene. La versión 0.42 se lanzó el 27 de febrero de 2004, casi un año después de OverNet de eDonkey2000, pero el tamaño de su red Kad se estaba expandiendo rápidamente. Tanto OverNet como Kad de eMule utilizan la estructura Kademlia, pero los formatos de mensajes específicos son diferentes, por lo que las dos redes DHT son incompatibles entre sí. Sin embargo, no existe una declaración precisa sobre el tamaño de la red eMule Kad. Esto también muestra el poder del software de código abierto. Actualmente, la red Kad de aMule es compatible con la red Kad de eMule, mientras que xMule no es compatible con Kad. El documento original sobre el protocolo Kad se puede encontrar en nuestra máquina de laboratorio:

:8080/paper/new/by%20conference/IPTPS/IPTPS02/ Kademlia%20A%20Peer-to-Peer%20Information%20System %20Based%20on%20the%20XOR%20Metric%28IPTPS02%29.pdf

La estructura del código de eMule es muy razonable. Aunque la cantidad de código es relativamente grande, la división entre módulos funcionales es muy razonable. eMule separa los archivos de código que representan la funcionalidad de los archivos de código que representan las interfaces. Los archivos fuente y los archivos de encabezado son los archivos fuente y los archivos de encabezado que implementan el código de función, mientras que los archivos fuente de la interfaz y los archivos de encabezado de la interfaz son los archivos fuente y los archivos de encabezado que implementan la interfaz gráfica. Los archivos fuente de la interfaz y los archivos de encabezado de la interfaz son los archivos fuente y los archivos de encabezado que implementan la interfaz gráfica.

Debido a la gran cantidad de código en eMule, esta serie omitirá la implementación de la interfaz gráfica y se centrará en analizar el código de la parte de implementación de funciones de eMule. En términos de implementación de funciones, las partes principales también se seleccionarán para el análisis. Esta sección comenzará analizando emule.cpp, presentará varias clases de implementación de funciones principales utilizadas en eMule y presentará brevemente sus funciones. Finalmente, cubriremos cómo compilar eMule en VS2003. emule también tiene algunos módulos que implementan funciones que son bastante útiles. Lo que quiero decir es que son útiles en otros programas. Puedes considerar reutilizarlos en otros programas.

emule.cpp es la implementación de la clase CemuleApp. Entonces, en tiempo de ejecución, primero ejecutará InitInstance para completar parte del trabajo de inicialización. En esta función también vemos por primera vez las clases que desempeñarán un papel a lo largo del programa.

El primer paso es conocer los directorios utilizados habitualmente por el programa, como archivos de configuración, archivos de registro, etc. El siguiente es ProcessCommandline, que tiene dos funciones: una es confirmar el modo de ejecución de eMule, es decir, si hay parámetros después de la línea de comando, y la otra es confirmar si solo se está ejecutando una instancia de eMule. En circunstancias normales, hacer doble clic en el ejecutable de eMule no requiere argumentos. Sin embargo, abrir eMule haciendo clic en un enlace o abriendo el archivo asociado equivale a ejecutar eMule con parámetros, y es posible asociar un programa con un enlace o un archivo con una extensión específica agregando entradas en el registro. Consulte OtherFunctions.cpp para conocer las funciones Ask4RegFix, BackupReg y RevertReg. ProcessCommandline Crea semáforos con nombres mutuamente excluyentes que se utilizan para comprobar si se están ejecutando otras instancias de eMule. CreateMutex solo puede crear un mutex para un nombre determinado. Por lo tanto, puedes saber si hay otras instancias de eMule ejecutándose en función de si la señal se creó correctamente. Si lo hay, y es modo parametrizado, entonces simplemente use el mecanismo de mensajería de Windows para enviar los parámetros a la ventana, y el resto del código es solo una cuestión de cómo encontrar el otro "eMule" y qué mensaje enviarle. . pstrPendingLink es una variable global que representa los parámetros de la línea de comando que se procesarán. Se procesará algún tiempo después de la inicialización.

Las siguientes dos clases más importantes son CPreferences y CStatistics. El primero contiene la mayoría de los datos de configuración del programa, mientras que el segundo realiza diversas estadísticas. Ambas clases se caracterizan por tener una gran cantidad de variables miembro estáticas para asegurar su unicidad y unificarlas en una sola clase. Las únicas instancias de estas dos clases son thePrefs y theStats.

Después de hacer algunas otras cosas (incluida la creación del objeto GUI CemuleDlg), verá una fila de declaraciones que crean nuevos objetos. Estas clases implementarán la funcionalidad principal de ejecutar programas eMule y se analizarán en detalle más adelante en esta serie.

Finalmente, me gustaría presentarles cómo compilar eMule en VS2003. Dado que eMule utiliza otras bibliotecas, el código fuente oficial de eMule está disponible para descargar al mismo tiempo que estas bibliotecas, lo que haría que el paquete de código fuente fuera muy grande. Por lo tanto, eMule opta por permitir que los desarrolladores descarguen estas bibliotecas desde sus sitios web oficiales. En términos generales, al compilar dichos archivos de proyecto, es muy importante mantener consistentes los parámetros de compilación de la biblioteca y el programa principal. Entre estos parámetros de compilación, hay principalmente tres parámetros: conjunto de caracteres (multibyte/Unicode), depuración/liberación y subproceso único/multiproceso. Por lo tanto, habrá ocho versiones después de la disposición y combinación. Por lo tanto, si no tienes cuidado al compilar, pueden ocurrir errores que no tienen nada que ver con la programación.

eMule0.47a ha descomprimido la biblioteca id3lib, también necesitas descargar las siguientes bibliotecas:

zlib:

/~weidai/cryptlib.html

pnglib:

http://www.libpng.org/pub/ png/libpng.html

Descargar, descomprimir y compilar.

Al compilar, preste atención a hacer coincidir los parámetros del proyecto eMule: el conjunto de caracteres es Unicode, se admite la seguridad de subprocesos múltiples, se puede seleccionar la versión de depuración o la versión de lanzamiento según sea necesario, pero también debe coincidir con los parámetros del Proyecto eMule. Estas bibliotecas normalmente se pueden encontrar en los archivos de proyecto VC descomprimidos, pero son versiones inferiores y se pueden convertir directamente. Además, se recomienda optar por generar bibliotecas estáticas en lugar de bibliotecas dinámicas al compilar estas bibliotecas, para que el archivo ejecutable final generado pueda ejecutarse por sí solo. Después de compilar estas bibliotecas (incluidas las bibliotecas descargadas de otros lugares), así como la biblioteca id3lib y la biblioteca CxImage de eMule, puede comenzar a compilar emule. Para compilar emule, solo asegúrese de que se encuentren todos los archivos de encabezado al compilar y que se encuentren todas las bibliotecas al vincular. Para encontrar todas las bibliotecas al vincular, esto se puede lograr modificando Propiedades en el archivo del proyecto -> Propiedades de configuración -> Vinculador -> Entrada -> Dependencias adicionales. Pero encontrar todos los archivos de encabezado requiere algunos trucos. Dado que la inclusión de archivos de encabezado de biblioteca en el código emule está algo limitada por la ubicación de la ruta de la biblioteca en relación con la ruta del proyecto emule, es necesario mover el directorio de la biblioteca descomprimida a la ubicación adecuada y, a veces, cambiarle el nombre.

eMule necesita leer una gran cantidad de archivos de configuración, cada uno de los cuales tiene su propio formato definido. Para leer y almacenar fácilmente estos archivos, eMule tiene una clase de infraestructura importante para replicar estas operaciones de archivos, que puede manejar fácilmente la lectura y escritura de algunos tipos de datos comunes y tiene algunos mecanismos de protección de seguridad. Esta infraestructura se implementa en SafeFile.cpp y SafeFile.h. Hay otra implementación de esta funcionalidad en el directorio kademlia\io. Sus implementaciones son básicamente similares, pero la versión en el directorio kademlia\io agrega la función de lectura y escritura en unidades Tag. Estas implementaciones están estrechamente relacionadas con otra pieza de infraestructura: la conversión de cadenas. StringConversion.cpp y StringConversion.h son la infraestructura de eMule para convertir varios tipos de cadenas Unicode, secuencias de varios bytes o UTF-8, etc., la conversión no es un problema aquí. Con respecto a la conversión de cadenas, personalmente recomiendo usar caracteres anchos Unicode tanto como sea posible, para evitar en la mayor medida los caracteres basura.

La implementación del directorio SafeFile.cpp o kademlia\io se caracteriza por separar el comportamiento de operación de datos de los objetos de operación de datos. Todos definen una clase base abstracta para operaciones de datos (CFileDataIO en SafeFile.cpp o Kademlia::CDataIO implementado por DataIO.cpp en el directorio kademlia. Esta clase base solo es responsable de implementar el comportamiento de los datos que operan lógicamente, por ejemplo, Leer un entero de 32 bits. Por ejemplo, para leer un entero de 32 bits, necesita leer cuatro bytes de la dirección del valor entero. El método para leer y escribir otros tipos de datos es similar. Sin embargo, todos los métodos de esta clase que realizan operaciones físicas con datos se declaran como funciones virtuales puras, es decir, cuántos bytes se leen y cuántos bytes se escriben. Con una clase base de este tipo, es fácil sobrecargarla y definir estas funciones virtuales puras para leer y escribir bloques de memoria, de modo que sea fácil serializar datos más complejos en bloques de memoria contiguos, y si estas funciones virtuales puras leen y escriben archivos , por lo que, naturalmente, es más fácil leer y escribir sus propios archivos de configuración en varios formatos extraños.

Los objetos de datos leídos por estas clases suelen ser varios números enteros, cadenas y tokens. Leer y escribir números enteros es relativamente simple. Desde 1 byte, 2 bytes hasta 4 bytes, 8 bytes o 16 bytes de tipo de datos, los métodos de lectura y escritura son similares. Aquí debemos mencionar el tipo de 16 bytes. 16 bytes son 128 bits, que es la longitud del ID generado aleatoriamente por la red eMule Kad. También es el resultado de longitud generado por el algoritmo hash MD4 comúnmente utilizado en eMule. UInt128.cpp en el directorio kademlia\utils implementa una clase entera de 128 bits. Esta función es muy fácil de usar y puede realizar algunas operaciones aritméticas y comparaciones. Esto sienta las bases para su uso futuro como clave en una tabla hash.

Una mirada más cercana al código de implementación en UInt128.cpp puede enseñarle mucho sobre a qué debe prestar atención al escribir este tipo de objeto de datos personalizado.

Otra operación importante en las operaciones de datos es la cadena. El principio general es escribir primero la longitud y luego el contenido. Pero cuando se trata de operaciones específicas, es necesario prestar atención a estos detalles, como si la longitud es de cuatro bytes o dos bytes, y el contenido de la cadena debe estar codificado en UTF-8. Todas estas operaciones deben trabajar en estrecha colaboración con StringConversion.cpp. De hecho, muchas de las funciones de conversión de cadenas de este último también son llamadas a funciones ATL, justo fuera de la capa CString de MFC.

CDataIO implementado en kademlia\io\DataIO.cpp también es una función distinta a la lectura y escritura según la etiqueta. Esta es la metainformación de un archivo compartido que es muy importante en el intercambio de red. Por lo general, la metainformación de un archivo se puede descomponer en varias etiquetas, como "Nombre de archivo = xxx", "Longitud del archivo = xxx", etc. . Es decir, una Etiqueta representa una propiedad igual a un valor determinado. El archivo Opcodes.h define una gran cantidad de código, que contiene los nombres de muchas propiedades de etiquetas de uso común. La clase CDataIO almacena el nombre de la propiedad Tag como un tipo de byte, luego el nombre y finalmente el valor según el tipo.

La infraestructura de eMule está muy bien escrita y se puede reutilizar fácilmente. La implementación eMule de estas clases básicamente se puede copiar en otros archivos de proyecto y utilizar rápidamente con sólo modificaciones menores. Veremos muchas otras infraestructuras útiles en eMule en el futuro.

Como programa para compartir archivos, emule en primer lugar tiene información muy clara sobre todos los archivos que comparte. Esta es la función de la clase CNownFileList Está en emule.cpp Creado cuando se creó con la clase cmuleapp.

La clase CNownFileList utiliza la clase CMap de MFC para mantener la tabla hash interna, lo que también muestra que la relación entre emule y MFC es realmente muy estrecha. Aquí es posible utilizar un mapa STL. Mantiene una lista interna de archivos conocidos y una lista de archivos cancelados. La clave de estas tablas hash es el valor hash del archivo. Esto puede determinar archivos con diferentes nombres pero con el mismo contenido. Generalmente, es muy difícil hacer valores hash de archivos con diferentes contenidos. Esta es también la intención original del diseño de la función hash. Por lo tanto, a menos que nos encontremos con un maestro como el profesor Wang Xiaoyun, básicamente podemos pensar que dos archivos con el mismo valor hash significan que su contenido es el mismo. Mire CNownFileList.cpp nuevamente. Este archivo no es largo, porque administrar una lista no requiere muchos tipos de operaciones. Sería bueno si hubiera una clase muy poderosa para cada archivo específico. Con CNownFile, podemos ver que todo lo que la clase CNownFileList necesita hacer es encontrar la clase CNownFile correspondiente en función de cierta información, copiar la información de otras listas, guardar toda la información en un archivo y luego restaurarla rápidamente la próxima vez que ejecute información del emule. Lo más importante es poder hacer todo esto sin provocar pérdidas de memoria.

La clase CKnownFile es una clase que se centra en información de archivos específica. Todavía tiene una clase base CAbstractFile, pero su principal diferencia con CAbstractFile es que CAbstractFile solo puede acceder a información básica, mientras que CKnownFile puede generar esta información de forma activa. . El archivo CNownFile.cpp parece más largo porque tiene más trabajo que hacer con las versiones actuales de emule además del hash de texto completo del archivo.

Además del hash de texto completo del archivo, el método BT también se utiliza para el hash de bloques. De esta manera, incluso si ocurre un error al transferir el archivo, no es necesario retransmitir el archivo completo, sino solo el error. bloque Este Este mecanismo se llama Manejo Inteligente Avanzado de la Corrupción (AICH)

CKR (Manejo Inteligente Avanzado de la Corrupción), que se analizará más adelante.

CKnownFile lee La información del archivo se guarda como. una etiqueta Obtendrá tanta información de archivo como sea posible durante el tiempo de ejecución. Por ejemplo, para archivos de tipo multimedia, puede llamar a la biblioteca id3lib para obtener información de etiqueta como autor, registro de fecha de lanzamiento, estilo, etc. archivos, puede llamar a la biblioteca id3lib para obtener información de etiquetas como autor, fecha de lanzamiento del álbum, género, etc. Para archivos multimedia de video, también puede capturar imágenes (implementación: CFrameGrabThread)

CKnownFile. también realiza un seguimiento del estado de descarga actual del archivo (hay una lista interna de CUpDownClient) y, por supuesto, serializa y deserializa según demanda. Tanto LoadFromFile como WriteToFile están parametrizados por CFileDataIO, lo que hace que CNownFileList sea más fácil de guardar y leer desde su lista. sobre todos los archivos.