[转载]后门工具gina源代码

来源:互联网 发布:备案域名租用 编辑:程序博客网 时间:2024/05/17 07:33
导读:
  
  信息来源:bingle之家
  文章作者:bingle
  /*
  NTShellGINA.c - a gina stub come from NTShell 1.0
  by:bingle@email.com.cn, from homepage:bingle_site.top263.net
  This file is modified from microsoft sample ginastub.c,
  this file will save the logon password to the file system32//msole32.srg
  WinLogon登录管理:
  Winlogon进程负责管理登录相关的安全性工作,它负责处理用户的登录与注销、启动用户shell、输入口令
  、更改口令、锁定与解锁工作站等。Winlogon进程必须保证其与安全相关操作对其他进程不可见,以免其他
  进程取得登录密码。
  系统初始化时,启动用户程序之前,Winlogon进行特定工作已保障以上的需求。Winlogon进程将创建并打开
  一个Window Stations,然后设置一个访问控制人口(ACE),该ACE中只包含Winlogon进程的SID,这样就
  只有Winlogon进程才能访问该Window Stations 。然后winlogon创建桌面,设置其中的winlogon桌面
  只有winlogon可以访问,其他进程不能访问该桌面的任何数据和代码;利用这一特性保护口令、锁定桌面
  等操作的安全。winlogon还会注册安全注意序列(SAS - secure attention sequence)的热键,任何时候
  按下SAS热键(缺省为ctrl+alt+del),将调用Winlogon,切换到安全桌面,从而使密码捕捉程序不能接收
  登录密码和更改密码等安全活动。
  而登录进程的验证和身份验证都是在GINA(GINA - Graphical Identification and Authentication
  图形标识和身份验证)中实现的,微软的GINA是MSGINA.dll,实现了默认的Windows NT登录界面。
  不过可以自己开发GINA DLL以实现其他的身份验证方法,如磁卡。当然这也为木马留下了机会,可以通过
  编写和系统GINA界面相同的GINA,然后取代MSGINA.dll。在msdn sample里有一个GINA的例子。不过如果
  仅仅为了获取登录密码,没有必要那么麻烦,只需写一个接口和GINA一样的,然后所有函数在实现时都去调
  用MSGINA.dll的相同函数就可以了,在msdn sample里也有这样一个例子叫做ginastub,当然作为木马
  还要在登录时将密码转储。(更多的gina信息,在msdn里查找gina)
  NTShelGINA就是使用了后一种方法。我把ginastub改了改,在登录时将username:password:domain
  存在msole32.srg里。它在运行时具体功能都要调用msgina.dll,因此安装时这个文件必须存在,然后将
  msgina.dll改名为winlogon32.dll,然后把NTShellGINA.dll拷贝为msgina.dll即可。这是ntshell
  里的第二种安装方法。
  不过微软还在注册表里留了一个位置由于安装GINA,在HKLM/Software/Microsoft
  /Windows NT/CurrentVersion/Winlogon下设置GINADLL为某个GINA DLL,(GINADLL这个值缺省没有)
  如果设置了这个值,nt会调用该GINA,而不会调用缺省的msGINA.dll。因此NTShell的第一种安装方法是
  将NTShellGINA.dll拷贝到system32/mshtmlgi.dll,然后设置GINADLL为mshtmlgi.dll。
  因此第二种方法安装成功的前提是系统原来没有设置GINADLL这个值,否则将不予安装NTShellGINA 。
  当然在win2000里如果使用第二种安装方法还要把dllcache里msgina.dll改名。(ntshell改名为
  mshtmlgi.dll)。
  由于GINA DLL负责系统认证和安全登录,因此如果一旦出错,用户将不能登录系统,必须慎用。也因此
  NTShell在安装时作了较多的检测,如果检测失败将不予安装。比如在把ntshellgina.dll拷贝为文件
  msgina.dll的安装方法里,第一次mslogon32.dll<-msgina.dll<-ntshellgina.dll,如果再次安装
  用msgina.dll替换mslogon32.dll,用ntshellgina.dll替换后来的msgina.dll(其实还是ntshellgina.dll)
  ,这样原来的msgina.dll就没有了,只有两个ntshellgina.dll,找不到真正的msgina.dll,ntshellgina.dll
  将失败。
  ntshell依次作如下检测:
  注册表里的GINADLL如果设置,则认为系统不是使用默认的登录GINA,自然不予安装(找不
  到msgina.dll或者其他程序工作不正常)
  如果系统的msgina.dll和ntshellgina.dll相同,则认为已经安装过了,不能再次安装
  如果系统中存在mslogon32.dll,有可能使用ntshell安装过了,不再安装(除非你确认,msgina.dll
  还是原来的,可以手工删除mslogon32.dll,再安装;否则不要安装)
  如果安装出错,不能登录,可以参考msdn的如下说明进行恢复:(我使用的是第4种方法,其他的未试)
  WARNING! - It is possible to make your machine unusable if you install a
  replacement Gina and it fails. To avoid this situation, be sure that you have
  a method of accessing the %systemroot%/SYSTEM32 directory independent of the
  Windows NT? installation you are testing on.
  If the Gina sample malfunctions, and you are not able to log on to fix the problem,
  you can recover by doing one of the following:
  1.If the test machine is on the network and you have an account on another machine
  with Administrative privileges on the test machine, open the test machine registry
  remotel/*
  ===================HUC Command line PortScanner V0.2 ==================
  =================By Lion, 2002. http://www.cnhonker.net================
  */
  Copy code#include   #include
  // 编译时需使用的库
  #pragma comment(lib,"wsock32.lib")
  // select()成员定义
  #define ZERO (fd_set *)0
  // 变量定义
  int maxth, scanok, scannum;
  int portip, hoststart, hoststop, startport, endport;
  long searchnum, searched;
  void usage(char *); // 定义显示使用方法函数
  void playx(int); // 定义状态提示函数
  void setip2(char *); // 定义设置IP函数
  void customport(char *, char *, char *); // 定义自定义扫描端口函数
  void portscannow(int); // 定义端口扫描扫描
  // 主程序
  int main(int argc, char *argv[])
  {
  WSADATA wsadata;
  // 清屏
  system("cls.exe");
  // 显示版本信息
  printf("/r/n==================== HUC Command Line PortScanner V0.2 ====================");
  printf("/r/n=============== By Lion, Welcome to [url]http://www.cnhonker.net[/url] ===============/r/n/n");
  // 检查输入
  if ((argc < 3) || (argc > 4))
  {
  // 显示帮助提示
  usage(argv[0]);
  return -1;
  }
  // 检测是否为port扫描
  if(!(stricmp(strlwr(argv[1]), "-p") == 0))
  {
  usage(argv[0]);
  return -1;
  }
  // 程序初始化
  if (WSAStartup(MAKEWORD(1,1), &wsadata) != 0)
  {
  printf("/r/nWsatartup error");
  return -1;
  }
  // 端口扫描参数转换
  // 如果参数为三个
  if (argc == 3)
  {
  // 直接设置IP
  setip2(argv[2]);
  }
  // 如果参数为四个
  else
  if (argc == 4)
  {
  // 进入定制端口扫描处理
  customport(argv[0], argv[2], argv[3]);
  }
  // 参数过多显示帮助
  else
  {
  usage(argv[0]);
  return -1;
  }
  // 扫描端口开始
  portscannow(argc);
  WSACleanup();
  return 0;
  }
  // 帮助提示函数
  void usage(char * prog)
  {
  printf("Usage: %s