发布时间:2025-12-09 21:12:05 浏览次数:3
WinHex文件提取
目录
WinHex文件提取... 1
一、NTFS文件提取... 1
二、FAT32文件提取... 1
三、FAT16文件提取... 2
四、ExFAT文件提取... 2
WinHexDBR修复... 2
一、ExFAT的DBR修复... 2
二、NTFS的DBR修复... 2
三、FAT32的DBR修复... 3
四、FAT16的DBR修复... 3
NTFS计算扇区大小的方法... 3
一、NTFS文件提取
首先通过MBR查找文件的类型接着跳到NTFS的DBR处,然后向下跳转70个扇区,通过侧栏查找文件名,找到80属性后记录每簇扇区数以及文件大小后,回到DBR处后进行跳转
注意事项:
1.通过80属性查找的文件大小是扇区,需要与通过DBR查看的每簇扇区数相乘在进行跳转。
2.当磁盘被误格式化时,磁盘中的非常驻属性文件会被保留,常驻属性则不会。
3.当磁盘中的文件被误删除时,无论是常驻属性还是非常驻属性的文件都会在win hex中保留原文件
4.在计算提取文件的所在簇号时,需要将查看到的簇号进行减2。因为0号FAT项和1号FAT项有特殊用处。
二、FAT32文件提取
首先通过MBR查看DBR的大小并跳转到DBR,通过FAT32的DBR查看每簇扇区数、FAT表大小以及保留扇区数进行跳转,跳转至DATA数据区。通过目录项查找需要提取文件的所在簇号,将需提取文件所在簇号与每簇扇区数进行相乘,并从目录项向下跳转所提取文件的簇号与每簇扇区数的结果。(在跳转前最好将文件大小记录下来)
注意事项:
1.在计算提取文件的所在簇号时,需要将查看到的簇号进行减2。因为0号FAT项和1号FAT项有特殊用处。
2.FAT32与FAT16系统不同,FAT32在目录项向下跳转查找文件所在簇时不需要向下跳转32个扇区。
3.FAT32与FAT16在DBR中查找FAT表大小的位置时不相同的。
三、FAT16文件提取
FAT16的文件提取与FAT32的文件提取基本无异,但是要记住FAT16的分区起始扇区与FAT32的分区起始扇区是不一样的。
四、ExFAT文件提取
首先通过MBR查看DBR的大小并跳转到DBR,找到簇位图(查看十进制),直接跳转至簇位图所在的扇区然后向下跳转至大写字母表。再从大写字母表向下跳转256个扇区到达DATA。到达DATA数据区时找到C0属性,查看文件所在的扇区和文件的大小
注意事项:
1.在从簇位图跳转至大写字母表时,有时候可能要跳的扇区数超过256.
2.在查找文件的大小时需要注意它的文件大小有两个,一般来说这两个文件的大小是一样的但难免会有些特殊情况,当两个文件大小不相同时需要查看的是上面的文件大小。
WinHexDBR修复
一、ExFAT的DBR修复
(1)通过查找DBR备份进行修复:直接从MBR向下跳转至DBR,然后再从DBR向下跳转12个扇区到达ExFAT的DBR备份。最后只需要将DBR的备份复制写入就可以了。
(2)手动修复DBR:只能修复每簇扇区数的大小,,当DBR和备份都被清空时整个文件就修复不了了
注意事项:
1.当ExFAT的DBR和备份DBR被清空时,重新创建一个磁盘将DBR写入是无法将ExFATDBR修复好。因为每个ExFAT的DBR都有一个专属的卷序列名,当卷序列名错误时是打不开系统的。而卷序列名只存在于ExFAT的DBR和ExFAT的DBR备份里。
二、NTFS的DBR修复
(1)通过查找DBR备份进行修复:首先在MBR文件中记录NTFS的分区总大小和隐藏扇区数,然后向下跳转隐藏扇区数到达DBR。再从DBR向下跳转分区总大小到达NTFS的DBR备份,最后将备份复制写入即可。
注意事项:
1.MBR被破坏时不记得NTFS的隐藏扇区,可以用Ctrl+Alt+X搜索55AA。就可以到达NTFS的DBR了。
三、FAT32的DBR修复
(1)手动修复:通过MBR查找FAT32的隐藏扇区数,然后向下跳转到达FAT32的DBR。通过性创建的一个FAT32的磁盘将新的FAT32的DBR复制下来,回到损坏的FAT32的DBR将复制的文件写入,通过向下查找F8FFFF到达FAT表,然后将FAT表的所在扇区数减去DBR的所在扇区数就是DBR的保留扇区,接着将得出的结果写入DBR中的保留扇区。
(2)通过查找DBR备份进行修复:从DBR向下跳转6个扇区到达FAT32的DBR备份,然后复制,回到损坏的DBR扇区将备份写入即可。
四、FAT16的DBR修复
(1)手动修复:通过MBR查找FAT16的隐藏扇区数,然后向下跳转到达FAT16的DBR。通过性创建的一个FAT16的磁盘将新的FAT16的DBR复制下来,回到损坏的FAT16的DBR将复制的文件写入,通过向下查找F8FFFF到达FAT表,然后将FAT表的所在扇区数减去DBR的所在扇区数就是DBR的保留扇区,接着将得出的结果写入DBR中的保留扇区。
NTFS计算扇区大小的方法
一、从DBR扇区向下跳转6291456个扇区到达MFT,然后再向下跳转12个扇区找到这个扇区的80属性,查看文件的大小,再将文件的大小乘以每簇扇区数再乘以8就是NTFS的文件大小。
JPG图片文件
二、蓝底JPG一般分辨率为600*600
三、JPG文件数据里FF C4的数量固定为4个,其中两个记录亮度,两个记录色度
四、分辨率大时图片向左偏,分辨率小时图片向右偏
五、如果文件色彩出现问题大概率是在ffc0出现问题
六、要替换数据区时从3f后面的00开始到ffd9.
BMP图片文件
RTF文件替换
向下搜索7B5c7274到达数据区的开头,在向下搜索7d7d到达数据区结尾,再向上搜索7d7b即是数据区。用相同步骤在一个好的文档中找到他的数据区并替换掉就可以了。
HFS+文件系统
该文件系统从DBR两个扇区全为0,DBR第二个扇区才是文件开头到达文件目录区后查看需提取文件的后缀名,如:.doc、.xls等的后一个字节再向下跳88个字节就是文件的描述信息,查看64位要用大端就是文件的所在位置,下一行则是文件大小,回到DBR向下跳转每块大小为8.在一段只有FF的数据区的开头向上跳转8个扇区就是这个分区的开头。从FF跳到80的字节数*8乘每簇就是这个分区的大小。在超级块的第三行的后八个字节用大端看32位就是块大小。在卷头看每块字节数(0X28~0X2B),1号节点位置 (卷头倒数第14行),或
寻找目录区:向下搜FFFE偏移248字节
再跳16个扇区到根目录,或向下搜FF01偏移8字节,
找文件大小和位置需要在文件名后一个字节跳88字节64bit到大小,
再跳转16字节(即下一行)32bit为文件的位置。
要切换大端
跳转位置要在卷标起始开始跳o
EXT4文件系统
超级快起始扇区在DBR后的2个扇区(DBR的数据全为00),0X10~0X14是EXT4的总块数,超级块每块大小为2N (N的数据0X18~0X1d)再乘于总块数等于总扇区数。通过搜索53EF到达1号超级块,将1号超级块所在扇区减去超级块起始扇区+2的得数是第1块超级块到第2块超级块的扇区数也是第1块超级块到第0块超级块的扇区数的固定数。从超级块起始扇区向下跳转6个扇区到达i节点表,i节点表的第一行的后8个字节的前4个字节的数值乘于8回到DBR的位置向下跳转得数到达组块描述符。将组块描述符所在扇区先记录下来,找到组块描述符中间有数据那一串最后的四个字节的数,将数据乘于8回到超级块起始扇区向下跳转的数到达根目录,文件夹名前8个字节就是文件夹所在块,所在块减1再乘于256得数,就是文件夹信息所在字节。回到组块描述符向下跳转算出来的数(byte),到达文件夹的所在扇区。中间数据的最后4个字节的数据乘于8就是文件夹根目录所在扇区,回到超级块起始扇区向下跳转刚刚算出来的数据。就到达文件夹所在扇区,找到需提取文件向前8个字节就是文件所在块,文件所在减1乘于256的得数文件所在字节,回到组块描述符向下跳转算出来的字节查看文件的文件位置乘于8就是文件所在位置,四个字节为一块,一块为8个扇区,N*8个扇区
RAR结构修复
头52 61 72 21 1A 07 00 CF 90 73 00 00 0D 00 00
00 00 00 00 <==(后面四个为保留字节)
(0X19-0X1A)为文件头大小(算法:从文件头的最后的保留字节的后面一个字节到文件名的最后一个字母/+5字节)
(0X1B-0X1E)为压缩后文件大小(算法:从文件名的最后一个字母/+5字节的后一个字节到文件尾的C4 3D 7B前的一个字节)
RAR结尾(C4 3D 7B)h
| RAR头: | ANSI:Rar! | (52 61 72 21)h | |
| RAR头占20个字节(0x00-0x13) | !固定! | ||
| 0x1b-0x1f(“08-11”字节)为文件压缩后的大小 | |||
| 0x2e-0x2f(“27-28”字节)为文件名大小 | |||
脚本
1073741824是1个G的字节数
Goto是从文件起始跳转
Move是从光标所在位置跳转
Block a b是选择区域
Block是区域结束
Write写入
Terminate中断脚本
Endif结束if条件命令
Exitloop退出循环
Debug检查脚本命令是否出错
CurrentPos表示光标(常量)
Assign把X写入(变量)
GetSize表示文件大小(常量)
Unlimited整数2147483547(常量)
Read读取多少字节到定义量 (READ 定义量 字节数)从光标所在位置开始;如果字节数为8个字节之内的话输出的是64位的值。
Messagebox输出
计算机用最高位,1代表负数,0代表正数,以8位来表示就是 0xxxxxxxx 的第一个0代表正数, 1xxxxxxxx的第一个1代表负数 ,那么8位的第一个位(最高位)就不能算,也就是说只有7位, 即2^7=128 个数字,一共正负各128种状态,如果不采用特殊处理,这时候0占用2个编码(10000000和00000000),数据表示范围为-127到-0及+0到127,这样总体上一个字节只有255种状态,因为其中0具有正0和负0之分,这不符合数学意义也浪费一个编码(早期硬件很昂贵,一位或者一个编码的浪费都是不可饶恕的)。所以计算机规定,如果是正0,也就是说遇到00000000这个编码(正0)就算它为0,如果遇到10000000(负0)这个编码会特殊处理一下,用下面的算法处理
遇到10000000(负0)这个编码
先取反,得到值为:01111111
再加1,得到值为 :10000000
此时10000000的最高位还是1代表负数的定义,同时原先表示负0的编码被利用起来表示-128
现在能理解为啥一个字节(8位)的范围为-128 ~ 127,即范围就是最小值是-128,最大值是127
接下来 继续:
9位 = 2^ 9=512
10位 = 2^ 10 =1024
..... 以此类推直到第32位,也就是int的存储(4个字节),我们知道int的取值范围是-2147483648 ~ 2147483647 ,那为啥是这个范围呢?结合上面8位的取值范围-128 ~ 127的原理,可以推倒其32位范围的原理
首先公式还是一样,2^32 = 4294967296,总共32位可以代表有这么多个数字,因为知道了计算机是分正负数的,所以4294967296 / 2 = 2147483648 ,也就是说从 -2147483647 ~ -0 和 +0 ~ 2147483647 这么个范围了,但是上面说了-0是浪费的,因为计算机是以补码的形式来存储数字的,
不管-0 (对应的码是1000 0000 0000 0000),
还是+0(对应的码 0000 0000 0000 0000),
补码都是0000 0000 0000 0000,这就造成了没有任何一个数的补码后值是1000 0000 0000 0000,所以就可以把这个补码用来存储一个数(不能浪费资源),就规定用它来存储一个数-214748364
2147483647怎么来的
各类文档数据区
docx数据区:
word\document.xml:
<w:t> (data) <w:t>
带图片:
word\media\
0304数据头后马上跟着图像数据;
xlsx数据区:
xl\sharedStrings.xml:
<t> (data) </t>
pptx数据区:
ppt\slides\slide:
<a:t> (data) <a:t>
Doc数据区:
在一大片空白后面。