linux常用基本命令之二十二implantisomd5和checkisomd5

来源:互联网 发布:爱淘宝如何的返利 编辑:程序博客网 时间:2024/06/11 07:39

以前每做出一个ISO都会同时生成一个md5值文件,防止复制过程中数据损坏;现使用implantisomd5和checkisomd5两个工具,可以将md5值嵌入ISO中并直接效验,方便不少。


用法:

[plain] view plain copy
  1. implantisomd5 xxx.iso  
  2. checkisomd5 xxx.iso  

$ implantisomd5 test2.iso
Inserting md5sum into iso image...
md5 = 1f7419e5fc8157e3c2a79a8023816454
Inserting fragment md5sums into iso image...
fragmd5 = ded8b32776d8ea11f436df6f6b4171
frags = 20
Setting supported flag to 0


$ checkisomd5 test2.iso
Press [Esc] to abort check.
The media check is complete, the result is: PASS.
It is OK to use this media.


注意:只能植入一次,若植入两次及两次以上就会报错。
$ implantisomd5 test2.iso
ERROR: Application data has been used - not implanting md5sum!


实验:

[plain] view plain copy
  1. $ mkdir iso  
  2. $ echo 'Hello World!' > iso/test  
  3. $ mkisofs -J -T -o test.iso iso/  
  4. $ cp test.iso test2.iso  
  5. $ implantisomd5 test2.iso  
  6. $ hexdump -C test.iso > test-dump  
  7. $ hexdump -C test2.iso > test2-dump  
  8. $ diff test-dump  test2-dump   
  9.   
  10. 结果如下:  
  11. 33,34c33,46  
  12. < 00008370  20 01 00 20 20 20 20 20  20 20 20 20 20 20 20 20  | ..             |  
  13. < 00008380  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |  
  14. ---  
  15. > 00008370  20 01 00 49 53 4f 20 4d  44 35 53 55 4d 20 3d 20  | ..ISO MD5SUM = |  
  16. > 00008380  31 66 37 34 31 39 65 35  66 63 38 31 35 37 65 33  |1f7419e5fc8157e3|  
  17. > 00008390  63 32 61 37 39 61 38 30  32 33 38 31 36 34 35 34  |c2a79a8023816454|  
  18. > 000083a0  3b 53 4b 49 50 53 45 43  54 4f 52 53 20 3d 20 31  |;SKIPSECTORS = 1|  
  19. > 000083b0  35 3b 52 48 4c 49 53 4f  53 54 41 54 55 53 3d 30  |5;RHLISOSTATUS=0|  
  20. > 000083c0  3b 46 52 41 47 4d 45 4e  54 20 53 55 4d 53 20 3d  |;FRAGMENT SUMS =|  
  21. > 000083d0  20 64 65 64 38 62 33 32  37 37 36 64 38 65 61 31  | ded8b32776d8ea1|  
  22. > 000083e0  31 66 34 33 36 64 66 36  66 36 62 34 31 37 31 3b  |1f436df6f6b4171;|  
  23. > 000083f0  46 52 41 47 4d 45 4e 54  20 43 4f 55 4e 54 20 3d  |FRAGMENT COUNT =|  
  24. > 00008400  20 32 30 3b 54 48 49 53  20 49 53 20 4e 4f 54 20  | 20;THIS IS NOT |  
  25. > 00008410  54 48 45 20 53 41 4d 45  20 41 53 20 52 55 4e 4e  |THE SAME AS RUNN|  
  26. > 00008420  49 4e 47 20 4d 44 35 53  55 4d 20 4f 4e 20 54 48  |ING MD5SUM ON TH|  
  27. > 00008430  49 53 20 49 53 4f 21 21  20 20 20 20 20 20 20 20  |IS ISO!!        |  
  28. > 00008440  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |  



注意最后一句话:"THIS IS NOT THE SAME AS RUNNING MD5SUM ON THIS ISO!!"
[plain] view plain copy
  1. $ md5sum test.iso  
  2. 79771b464de80779e78b126ba0e918a7  test.iso  
可见并不是简单将原ISO的md5值插入而已。


代码分析:

[plain] view plain copy
  1. $ rpm -qf `which implantisomd5`  
  2. isomd5sum-1.0.7-1.fc15.i686  
  3.   
  4. $ yumdownloader --source isomd5sum-1.0.7-1.fc15  
  5. isomd5sum-1.0.7-1.fc15.src.rpm                           |  24 kB     00:00    
  6.   
  7. $ rpm -ivh isomd5sum-1.0.7-1.fc15.src.rpm  
  8.    1:isomd5sum              warning: user mockbuild does not exist - using root  
  9. ########################################### [100%]  
  10.   
  11. $ rpmbuild -bp ~/rpmbuild/SPECS/isomd5sum.spec  
  12. Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.mwSxql  
  13. + umask 022  
  14. + cd /home/eric/rpmbuild/BUILD  
  15. + LANG=C  
  16. + export LANG  
  17. + unset DISPLAY  
  18. + cd /home/eric/rpmbuild/BUILD  
  19. + rm -rf isomd5sum-1.0.7  
  20. + /usr/bin/bzip2 -dc /home/eric/rpmbuild/SOURCES/isomd5sum-1.0.7.tar.bz2  
  21. + /bin/tar -xf -  
  22. + STATUS=0  
  23. + '[' 0 -ne 0 ']'  
  24. + cd isomd5sum-1.0.7  
  25. + /bin/chmod -Rf a+rX,u+w,g-w,o-w .  
  26. + exit 0  
  27.   
  28. $ cd ~/rpmbuild/BUILD/isomd5sum-1.0.7/  
  29.   
  30. # 在libimplantisomd5.c文件中找到核心代码,说明读取<16扇区 ~ END>; 根据ISO9660规范,扇区0~15未定义,全0;  
  31.     /* read up to 15 sectors from end, due to problems reading last few */  
  32.     /* sectors on burned CDs                                            */  
  33.     while (total < isosize - SKIPSECTORS*2048) {  
  34.   
  35. # DUMP中的内容和注释一致  
  36. SKIPSECTORS = 15  
  37.   
  38. # 测试是否读取<16扇区 ~ END>内容再计算MD5  
  39. 2048*16=32768=0x8000  
  40. $ tail -c +32769 test.iso > test-sum.iso  
  41. $ md5sum test-sum.iso  
  42. 91cccb33d25a976bd88911b71ce630a4  test-sum.iso  
  43.   
  44. # 结果与预期不符,仔细查看while代码,跟进MD5_Final()函数,发现原来是用自己写的算法计算SUM。  
  45.   
  46. # 插入位置为Primary Volume Descriptor的 APPDATA区域(偏移883=0x373; 0x8000+0x373=0x8373)
0 0
原创粉丝点击