剑客
关注科技互联网

JPG文件头损坏修复思路(附自动修复程序)

死党突然给我打电话说自己的硬盘被病毒感染,导致大量的图片损坏,全部无法打开,就像这样

JPG文件头损坏修复思路(附自动修复程序)

让他给我发了几个样本图片后开始了捣鼓之旅

探索

Searching for 现成的软件 or 代码

在google上搜索 jpg repairjpg 修复图片修复软件 等等,找到很多用来修复图片的软件,经过逐个尝试后,都以失败告终,不过找到一段python的代码,由于代码在网上的转载比较多,这里就不贴出处了,把代码贴在下面


# -*- coding: utf8 -*-
# !/usr/bin/env python

__author__ = 'fengxing'
__date__ = '2012-1-18 20:13'

import sys


def jpgfix(name):
sig = '/xFF/xD8/xFF/xDB'
with open(name, "r") as fd:
fd.seek(len(sig), 0)
jpg = fd.read()
pos = jpg.find(sig)
if pos < 0:
raise Exception('Not find signature')
jpg = jpg[pos:]

with open(name, "w") as fd:
fd.seek(0, 0)
print 'size is:', len(jpg)
fd.write(jpg)

if __name__ == '__main__':
try:
while True:
jpgfix(sys.argv[1])
except:
print 'Done'

根据该段代码对jpg进行修复后发现终于有了进展,图片被恢复成了160×120的小图片,但是这可是用单反拍出来的高质量的照片,我要是把这个小小的图片发回去肯定要被嘲笑的…虽然没有恢复成功,但是还是要感谢该程序的作者,至少让我看到了恢复图片的希望。

学习JPG格式的metadata

在搜过用过各种修复的软件后终于对找现成的软件的失去信心,决定自己coding,但是对JPG的文件格式并不了解,Google了一下找到了维基百科里面的 JPG 词条 ,阅读了里面关于 Syntax and structure 的介绍

JPG文件头损坏修复思路(附自动修复程序)

发现JPG格式里面都是用的各种Marker来表示各段Metadata,病毒感染修改了这些Marker的值,导致图片解析程序无法解压JPG,那么如果用同一个相机拍摄的正常的图片的metadata来替换,是不是就能恢复正常了呢?

进行尝试

尝试从 Offset:0 开始替换被损坏的文件头,这里需要一个用同一个相机拍摄的图片,让小伙伴重新随便拍一张发给我,命名为 normal.jpg ,然后对损坏文件和正常文件的每一个Marker进行穷举并组合,得到了好多好多文件(图片命名格式: N_offsetOfNormalJPG_Marker_offsetOfDamagedJPG.jpg

JPG文件头损坏修复思路(附自动修复程序)

发现里面竟然有可以用的!只是有一些缩略图不符合原图(变成了 normal.jpg 的缩略图),还有一些是 160x120 尺寸的和打开图片后全灰色的,根据恢复正常图片中替换的Marker来构建一个程序,恢复了小伙伴给我的所有的文件,开心的发过去,以为事情就这么完了。

竟然没完

小伙伴运行程序后发现80%左右的图片都恢复了正常,但是剩下的还有好多恢复成了 160x120 的小文件,经过观察后发现,病毒破坏并不一定都是损坏到了同一个Marker,于是加了一段代码,用来检查图片的尺寸,如果尺寸不对的话就再次启动 穷举修复 ,就是重复替换每一个Marker,会替换50+次左右,并且自动检查是否恢复正常,运行后发现,程序检查图片是否正常无论如何都存在误差,比如我打不开的图片,它竟然提示正常…真是笨。又加入了人工检查,只有人工打开生成的图片后确认是否正常才继续下一张,不然的话就在此重新修复(替换不同的Marker)。就像这样

JPG文件头损坏修复思路(附自动修复程序)

如果人工检查图片不通过就直接回车,程序继续修复,如果人工检查通过就输入 ok ,程序开始下一张图片的修复。

JPG文件头损坏修复思路(附自动修复程序)

JPG文件头损坏修复思路(附自动修复程序)

结束

到此终于恢复了所有的图片,尽管存在缩略图和原图不匹配的问题,但是至少可以看到正常的图片了,如果要恢复缩略图的话,可以通过用PS打开图片,然后重新保存就可以恢复出完全正常的图片了,这次捣鼓的过程中学到了很多东西,对JPG格式的图片文件有了一个全新的认识,也对利用python来修改二进制文件更加熟练,但是对于人机交互这块存在很大的问题,软件虽然自动化程度相对来说已经比较高,但是恢复的时候必须要人工一个个的查看是否恢复成功,比较麻烦。程序经过完善以后过段时间应该会放出来,需要的小伙伴可以给我发邮件索要啦啦啦…

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址