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
文件
真他媽浪費感情。剩下就是體力活了,一盞茶時間完事兒。

把硬盤往 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\)