作者:Conmajia
連結:https://www.cnblogs.com/conmajia/p/a-joke-virus.html
幾周前,合夥人讓我給他發幾個舊專案的資料。翻箱倒櫃之後,我發現那些資料都在舊硬碟上,還被格式化了。雖說這東西我都淘汰好幾年了,不過機械硬碟,沒準兒還有救,死馬當活馬醫唄。於是我試著恢復資料,不行再拿出去開盤。
我下載了一堆古今中外的 data recovery apps,搗鼓半天,啥幾把都沒恢復出來。後來在別地兒找著資料了,這事兒也就過去了,拔掉硬碟,哪來的滾回哪去。過了幾天,我突然發現,我他媽的海量檔案打不開了?!
一個幽靈留下的遺產
恢復資料的努力失敗後,又過了一段時間,我在翻查電腦上別的資料時,發現這些檔案都打不開,甚至圖示都不顯示了。
▲ 損壞的檔案
想到之前恢復資料時下載的那些亂七八糟的軟體,我心裡一緊:“老子電腦中病毒了!”接下來就是漫長的查毒防毒過程,等待過後,陣容豪華的殺軟聯盟給出一個讓我難以接受的事實:
您的電腦很安全 「 。 」
我安全您 呢?幾萬個檔案,從圖片到壓縮包,從影片到 exe,全嗝屁了你丫告我電腦很安全?鬼乾的?上網查了一圈兒,也沒查出個所以然,一幫傻逼玩意兒在哪答非所問瞎 bb。沒招,還得自己上手。
什麼情況
這類讓人沒法察覺的小病毒破壞檔案多半是有共同點的,不然那叫大型多格式應用程式。先開他幾個檔案來比劃比劃。
▲ 損壞的檔案資料
好在這病毒很良心沒有改我檔案名,不然老子真是要 GG 了。開啟幾個.ico,看到這樣的資料:
▲ 損壞的 .ico 檔案
典型的檔案頭被篡改,翻出 .ico 檔案格式規範,找到頭部資訊:
typedef struct {
WORD idReserved; // Reserved (must be 0)
WORD idType; // Resource Type (1 for icons)
WORD idCount; // How many images?
ICONDIRENTRY idEntries[1]; // An entry for each image (idCount of 'em)
}
ICONDIR, * LPICONDIR;
按照檔案頭來看,這檔案應該是 00 00 01 00 01 00 開頭的,但現在的檔案是 FF FF FE FF FE FF 開頭,剛好是正常檔案按位取反。回想中招的時候沒有察覺到電腦被明顯拖慢或者狂讀磁碟,在這種情形下病毒想要悄悄感染我幾萬個檔案,應該只改寫了檔案部分內容。
現在看來,那就是修改了檔案頭,導致 OS 識別不到正確的檔案格式。.ico 後面的 ICONDIRENTRY 內容和圖示實際內容有關,可能是 DIB,也可能是 PNG 或者其他玩意兒。
不管它是什麼格式,我現在看這些圖示都一個德行,沒法判斷正確不正確。網上下了一個正常的圖示開啟,學學它的檔案頭:
▲ 正常的 .ico 檔案
開您 的玩笑?
看到那一大堆 00 00 00 00 老子差點當場笑出聲來。這誰他媽吃飽了撐的搞笑呢?合著你就改了我檔案前 100 個位元組唄?而且看這架勢還沒乾別的,只是把資料取反了再寫回去。您蛋疼呢?氧化鈣。
淦
就試驗唄,把這 .ico 的前 100 位元組取反,發現好了,系統能認出來了。
▲ 修複的 .ico 檔案
真他媽浪費感情。剩下就是體力活了,一盞茶時間完事兒。
資料恢復 app
把硬碟往 Drag Here 上一拖,自己玩兒去吧。
▲ 檔案全部修複了
原始碼
懶得廢話,過分簡單。
private void deal(string fullpath) {
FileStream src = new FileStream(
fullpath,
FileMode.Open,
FileAccess.ReadWrite
);
BinaryReader reader = new BinaryReader(src);
BinaryWriter writer = new BinaryWriter(src);
if ((int)src.Length 100)
return;
for (int i = 0; i 100; i++) {
reader.BaseStream.Position = i;
writer.BaseStream.Position = i;
writer.Write((byte)(0xFF - reader.ReadByte()));
}
reader.Close();
writer.Close();
src.Close();
}
我想說,現在的人可真是無聊啊。
●編號813,輸入編號直達本文
●輸入m獲取文章目錄
Linux學習
更多推薦《25個技術類微信公眾號》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。