一個搞笑的病毒


Conmajia
January 24, 2019

幾周前,合伙人讓我給他發幾個舊項目的數據。翻箱倒櫃之后,我發現那些數據都在舊硬盤上,還被格式化了,しまった。雖說這東西我都淘汰好幾年了,不過機械硬盤,沒准兒還有救,死馬當活馬醫唄。於是我試着恢復數據,不行再拿出去開盤。

我下載了一堆古今中外的 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();
}

我想說,現在的人可真是無聊啊

The End. \(\Box\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM