Прежде всего, кейлоггер, который я разрабатываю, вовсе не для наступательных и деструктивных целей. :)
Я занимаюсь разработкой приложения для мониторинга клиентов на C # .NET.
Кейлогинг является одной из функций в моем приложении.
Хотя я разработал код для кейлоггера, я не смог правильно реализовать его в своем приложении.
В моем решении два проекта.
UserInterface - для серверной части.
Трекер - для клиентских ПК.
Модуль кейлоггинга Keylogger находится в проекте Tracker.
Я использовал вспомогательные классы для программирования сокетов - TcpClient, TcpListener и NetworkStream, чтобы помочь им.
Также я использую асинхронный режим для связи.
Я публикую часть кода, с которой сталкиваюсь с проблемой:
//This code resides on the server-side monitoring interface.When //the administrator hits a btnKeyLog button, a
message //"StartKeyLog" is sent to the respective client, and the keylogging //is handled on the client.
private void btnKeyLog_Click (отправитель объекта, EventArgs e)
{
messageBuffer = новый байт [100];
if ( btnKeyLog1.Text == "Start Keylogging" )
{
btnKeyLog1.Text = "Stop Keylogging";
message = "StartKeyLog";
messageBuffer = Encoding.ASCII.GetBytes ( message );
try
{
//begin writing on the stream.
clientConnections[0].networkStream.BeginWrite (messageBuffer, 0, messageBuffer.Length, new
AsyncCallback ( onDataWrite ), null );
}
catch ( Exception exc )
{
MessageBox.Show ( exc.Message + exc.StackTrace );
}
}
else
{
btnKeyLog1.Text = "Start Keylogging";
message = "StopKeyLog";
messageBuffer = Encoding.ASCII.GetBytes ( message );
try
{
clientConnections[0].networkStream.BeginWrite ( messageBuffer, 0, messageBuffer.Length, new
AsyncCallback ( onDataWrite ), null );
}
catch ( Exception exc )
{
MessageBox.Show ( exc.Message + exc.StackTrace );
}
}
}
Теперь код на стороне клиента:
public void onDataReceived ( IAsyncResult ar )
{
int nBytesRead = 0;
try
{
nBytesRead = clientConnection.networkStream.EndRead ( ar );
}
catch ( Exception exc )
{
MessageBox.Show ( exc.Message + exc.StackTrace );
}
message = Encoding.ASCII.GetString ( messageBuffer,0, nBytesRead);
switch (message)
{
case "StartKeyLog" :
MessageBox.Show ( "Keylogger started." );
//the following static method wraps the Win32 //implementation of SetWindowsHookEx - all given in Keylogger //module
KeyboardHook.installHook ( );
//after this method is called, the hook is //actually installed; the callback function KeyboardHookProc is also //called.
Here, keylogger seems to be working fine, except that the //system slows down considerably when i type keystrokes.
break;
case "StopKeyLog":
MessageBox.Show ( "Keylogger stopped." );
// the following method releases the hook
KeyboardHook.releaseHook ( );
break;
}
try
{
messageBuffer = new byte[100];
clientConnection.networkStream.BeginRead ( messageBuffer, 0, messageBuffer.Length, new AsyncCallback ( onDataReceived ), null );
}
catch ( Exception exc )
{
MessageBox.Show ( exc.Message + exc.StackTrace );
}
//MessageBox.Show ( "Stop" );
//as soon as this function ends, however, the callback function of //the keyboard hook stops being called; keystrokes are not //processed.
//the keystrokes are caught until this function the control is in this //function. i assume that it has to do something with the thread.
}
Я пытаюсь объяснить ситуацию здесь.
Чтобы начать регистрацию ключей, пользовательский интерфейс сервера должен отправить клиенту сообщение «StartKeyLog».
Получив сообщение, клиент обработает его в функции обратного вызова «onDataReceived». В этой функции сообщение обрабатывается и
вызывается метод installHook (), который устанавливает хук.
Когда я запустил приложение, хук был установлен; Кроме того, обратный вызов KeyboardHookProc () был вызван правильно, и нажатия клавиш были обработаны. Но это
имел место только до тех пор, пока метод обратного вызова onDataReceived не был активен. Как только этот метод завершился, KeyboardHookProc () перестал вызываться; ключи
больше не обрабатывались, как если бы хук никогда не устанавливался.
Другая проблема заключалась в том, что после установки хука система значительно замедлялась, когда я нажимал на любую клавишу.
Я предполагаю, что обе эти вещи имеют отношение к тому, что здесь происходит. Но я не могу получить точную проблему.
Я старался изо всех сил, чтобы объяснить ситуацию. Тем не менее, любые вопросы приветствуются.
Может ли кто-нибудь предоставить мне решение ??