Conmajia

Stop stealing sheep!

导航

< 20253 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

一个搞笑的病毒

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.

posted on2019-01-24   Conmajia  阅读(2870)  评论(8编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示