歡迎光臨
每天分享高質量文章

一個搞笑的病毒

作者: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、資料庫、運維等。