¡Cómo diseñar un software antivirus!
Fuente de información: blog de neeao
Hoy en día, los virus, los troyanos y los gusanos van surgiendo uno tras otro, y las variantes también una tras otra. Las empresas antivirus y las principales empresas de seguridad proporcionarán herramientas gratuitas para eliminar virus con la aparición de virus que tienen un gran impacto. Esta iniciativa es realmente útil para los usuarios comunes. De hecho, escribir una herramienta para eliminar virus no es tan misterioso como todos piensan. Utilice el SDK para escribir un programa de consola para implementar la eliminación de virus. Dado que no es necesario escribir una interfaz gráfica, ¡es simple y rápido! ¡Puedes escribirlo tú mismo! ¿No lo crees? Sigamos leyendo. Sin más preámbulos, comencemos a hablar de las ideas y métodos de implementación de las herramientas para matar virus.
La herramienta de eliminación de virus que se explica en este artículo es un término amplio para los virus que son programas independientes, como troyanos y gusanos, en lugar de aquellos que dependen de otros programas para autorreplicarse e infectar archivos PE. en un sentido estricto. Debido a que escribir una herramienta específica para eliminar virus requiere conocimiento de la estructura del archivo PE y otros aspectos, es relativamente difícil, por lo que comenzaremos con los relativamente simples primero y presentaremos los difíciles más adelante.
Para la mayoría de los virus, la idea de un antivirus es en realidad muy simple, es decir: finalizar el proceso del virus y eliminar el proyecto de inicio automático (generalmente bajo la clave principal ejecutar* en el registro). , elimine el archivo de virus. Para los virus que han establecido asociaciones de archivos, se debe modificar el registro para restaurar la asociación de archivos. Se indicarán por separado a continuación.
1. Finalizar el proceso
En el pasado, muchos amigos en Internet me preguntaron cómo finalizar el proceso especificado según el nombre del archivo y por qué el proceso especificado no puede realizarse directamente. terminado usando la función TerminateProcess(). Primero, echemos un vistazo a la declaración de la función TerminateProcess(): Bool TerminateProcess(HANDLE hPeocess, UINT uExitCode), donde el primer parámetro es el identificador del proceso, no el nombre del proceso (nombre de archivo). Entonces, ¿cómo podemos controlar el proceso especificado? Podemos utilizar la función OpenProcess(), cuyo prototipo es
HANDLE OpenProcess(
DWORD dwDesiredAccess, // bandera de acceso
BOOL bInheritHandle, // mango heredado Bandera
DWORD dwProcessId // Número de identificación del proceso, es decir, ID del proceso
);
El último parámetro es el ID del proceso y el proceso El identificador del proceso y el identificador son dos cosas diferentes. Es posible que esté muy deprimido en este momento: ¿Cómo sabe el ID del proceso? ¡Por supuesto que hay una manera! En Windows9X/2000/XP/2003, Microsoft proporciona una serie de funciones API ToolHelp para enumerar procesos. Primero use la función CreateToolhelp32Snapshot() para obtener el identificador de la instantánea y luego use Process32First() y Process32Next() para enumerar el proceso actual. Durante el proceso de enumeración, la información de cada proceso se almacenará en la estructura PROCESSENTRY32.
El prototipo de PROCESSENTRY32 es:
typedef struct tagPROCESSENTRY32
{
DWORD dwSize; // Tamaño de estructura
DWORD cntUsage; / Recuento de referencias de este proceso;
DWORD th32ProcessID; // ID del proceso;
DWORD th32DefaultHeapID; // ID del montón predeterminado; / ID del módulo de proceso;
DWORD cntThreads; // Recuento de subprocesos iniciados por este proceso;
DWORD th32ParentProcessID; // ID del proceso principal; ; // Prioridad del hilo;
DWORD dwFlags; // Reservado;
char szExeFile[MAX_PATH] // Nombre completo del proceso
} ;
p>Th32ProcessID es el ID del proceso y szExeFile es el nombre de archivo del proceso. Entonces, para finalizar el proceso especificado, podemos enumerar los procesos y determinar uno por uno si szExeFile tiene el mismo nombre que el proceso que queremos finalizar. Si son iguales, tome su parámetro th32ProcessID y luego sustitúyalo en la función OpenProcess. para obtener el identificador del proceso objetivo. De esta forma, el proceso se puede finalizar utilizando la función TerminateProcess(). Escribí una función para finalizar el proceso especificado, de la siguiente manera:
void KillProcessFromName(LPCTSTR name)//name es el nombre del proceso que desea finalizar y Win9X debe incluir la ruta
{
PROCESSENTRY32 pe; //Definir una variable de tipo de unión PROCESSENTRY32
HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // Crear un identificador de instantánea
;pe.dwSize=sizeof(PROCESSENTRY32); //Asegúrese de asignar un valor a dwSize primero
if (Process32First(hShot, amp; pe))
{
do
{if (strcmp(pe.szExeFile, name)==0) //Juzga si este proceso es el proceso que deseas finalizar
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe .th32ProcessID); //Si es así, use su ID para obtener el identificador
TerminateProcess(hProcess, 0); //Terminar el proceso
}
while( Process32Next(hkz, amp; pe));
}
CloseHandle(hShot); //No olvides cerrar en el final
}
Cuando lo use, simplemente llame a la función KillProcessFromName() en la función main() y establezca el parámetro en el nombre del proceso que desea finalizar. Win9X, debe incluir la ruta.
Otra cosa que vale la pena señalar es que no olvide #include lt;TlHelp32.hgt;.
2. Eliminar archivos
Este paso es muy simple, simplemente llame a la función DeleteFile(), Bool DeleteFile(LPCTSTR lpFilename), configure lpFilename para que apunte al nombre del archivo eliminado. file Un puntero es suficiente y puede contener una ruta específica.
3. Modifique el registro y elimine los elementos de inicio y las asociaciones de archivos.
Primero use la función RegOpenKeyEx() para abrir la clave principal de destino. El prototipo de la función RegOpenKeyEx() es <. /p>
LONG RegOpenKeyEx(
HKEY hKey, //El identificador de la clave que se va a abrir
LPCTSTR lpSubKey, //Puntero a la cadena de nombre que contiene la subclave a ser abierto
DWORD ulOptions, // es una palabra reservada, debe ser NULL
REGSAM samDesired, // permisos de acceso
PHKEY phkResult//manejar el puntero a la clave abierta
);
Después de obtener el identificador, use la función RegSetValueEx() para modificar el valor de la clave. El prototipo de la función es:
LONG RegSetValueEx. (
HKEY hKey, //Manejador actual de la clave abierta
LPCTSTR lpValueName, //Puntero a un puntero de cadena no nulo que contiene el nombre del valor a consultar p>
DWORD reservado, //valor reservado, debe ser NULL
DWORD dwType, //tipo de valor clave, como REG_SZ, REG_DWORD, etc.
CONST BYTE * lpData, //Puntero a los datos del valor clave, tenga en cuenta que este tipo de variable no es LPCTSTR /p>
DWORD cbData//Puntero a la variable que contiene la longitud del valor establecido, en bytes
) ;
Por supuesto, también puedes usar la función RegDeleteValue() Eliminar valor clave. No olvide utilizar la función RegCloseKey() para cerrar una vez completada la operación.
Usar estas funciones es muy sencillo. Simplemente cambie los parámetros correspondientes a los valores correspondientes que desee eliminar o modificar del registro. Lo único que vale la pena destacar es el tipo del quinto parámetro. en la función RegSetValueEx() es BYTE, ¡no LPCTSTR! A través de estos, puede eliminar fácilmente los elementos de inicio especificados y restaurar la asociación del archivo. Para que sea más fácil de entender para todos, daré un ejemplo de cómo reparar la asociación del archivo EXE. Puede modificar los parámetros correspondientes para aplicar la modificación. de otros valores clave. Simplemente use la función RegDeleteValue. Implemente la eliminación de elementos de inicio automático.
HKEY hKey;
LPCTSTR data1="\"1\" *" //El modo de apertura predeterminado de los archivos EXE, "1\" representa el archivo EXE en sí p>
DWORD lResult=RegOpenKeyEx(HKEY_CLASSES_ROOT, "exefile\\shell\\open\\command", 0, KEY_WRITE,&hKey);
if(lResult==ERROR_SUCCESS)
RegSetValueEx(hKey, "", NULL, REG_SZ, (LPBYTE) data1, 9); //Modificar el valor de la clave
RegCloseKey(hKey);
Aquí, a El modelo de la herramienta para eliminar virus se completó inicialmente. Al escribir el suyo propio, solo necesita reemplazar los parámetros formales de la función en el artículo con los datos característicos correspondientes del virus de destino que desea eliminar y compilarlo. Esta es una herramienta de eliminación simple de propósito especial que solo puede lidiar con troyanos, gusanos y otros virus comunes. Debe analizar la situación específica y expandir las funciones del programa de acuerdo con la situación específica. Por ejemplo, algunos troyanos se dan cuenta automáticamente modificando win. .ini y system.ini Para ejecutarse, necesitamos operar el archivo para eliminar los datos correspondientes. Además, a veces necesitamos agregar funciones como finalizar servicios, desinstalar módulos DLL e ingresar operaciones RING0. En resumen, creo que todos podrán escribir su propia herramienta para eliminar virus y caballos de Troya. Jaja, ¿no es una gran sensación de logro?