刚刚干了件自己觉得比较牛逼的事情
版主: huangchong
#34 Re: 刚刚干了件自己觉得比较牛逼的事情
代码: 全选
#!/usr/bin/env python3
import os, sys, struct
assert os.path.isfile(sys.argv[1])
with open(sys.argv[1],'rb') as f:
sb=f.read()
#print(len(sb))
def cal_csum(a):
csum=0
for i in range(0,len(a),4):
if i!=216:
value=struct.unpack('<I',a[i:i+4])[0]
csum+=value
sb_csum= (csum & 0xffffffff) + (csum >>32)
return sb_csum
sb_csum=cal_csum(sb)
print(f'{sb_csum:x}','{:x}' .format(struct.unpack('<I',sb[216:220])[0]))
out1= sb[:160]+ \
chr(sb[160]-1).encode('latin-1')+ \
sb[161:183] + \
chr(sb[183]+1).encode('latin-1') + \
sb[184:]
new_csum=cal_csum(out1)
out2=out1[:216]+struct.pack('<I',new_csum)+out1[220:]
with open('c','wb') as f:
f.write(out2)
out1= sb[:160]+ \
chr(sb[160]-2).encode('latin-1')+ \
sb[161:183] + \
chr(sb[183]+2).encode('latin-1') + \
sb[184:]
new_csum=cal_csum(out1)
out2=out1[:216]+struct.pack('<I',new_csum)+out1[220:]
with open('d','wb') as f:
f.write(out2)
linux的 md(multiple device,就是raid) superblock 1.2版本,字节160是存该盘在raid里的序号,字节183是该盘uuid的最后一个字节,我拷出来的好盘的superblock字节160是2号,所以其他俩应该是0和1号
cal_csum是看了linux源程序以后写的,算法很简单,就一句话,所以基本就是照抄。源程序是把4k的原始superblock全加起来,然后把32位的和放在216-219字节处,原始superblock 216到219是0,所以我得把这四个跳过。
https://linux.die.net/man/4/md
https://www.jeffgeerling.com/blog/2021/ ... inux-mdadm
https://archive.kernel.org/oldwiki/raid ... rmats.html
https://github.com/spotify/linux/blob/m ... aid/md_p.h
Linux自己的 算checksum的函数:
https://stash.phytec.com/projects/PUB/r ... 1dc587aacb
代码: 全选
static u32 md_csum_fold(u32 csum)
{
csum = (csum & 0xffff) + (csum >> 16);
return (csum & 0xffff) + (csum >> 16);
}
static unsigned int calc_sb_csum(mdp_super_t * sb)
{
u64 newcsum = 0;
u32 *sb32 = (u32*)sb;
int i;
unsigned int disk_csum, csum;
disk_csum = sb->sb_csum;
sb->sb_csum = 0;
for (i = 0; i < MD_SB_BYTES/4 ; i++)
newcsum += sb32[i];
csum = (newcsum & 0xffffffff) + (newcsum>>32);
#ifdef CONFIG_ALPHA
/* This used to use csum_partial, which was wrong for several
* reasons including that different results are returned on
* different architectures. It isn't critical that we get exactly
* the same return value as before (we always csum_fold before
* testing, and that removes any differences). However as we
* know that csum_partial always returned a 16bit value on
* alphas, do a fold to maximise conformity to previous behaviour.
*/
sb->sb_csum = md_csum_fold(disk_csum);
#else
sb->sb_csum = disk_csum;
#endif
return csum;
}
x2

上次由 huangchong 在 2025年 7月 12日 15:25 修改。
原因: 未提供修改原因
原因: 未提供修改原因
#35 Re: 刚刚干了件自己觉得比较牛逼的事情
好棒
为啥c,d是sb[160]-1和-2? 好盘是sb[160]还是sb[160]-3?
检查#print(len(sb))?如果超过216呢?会顺推4位吗?
检查#print(len(sb))?如果超过216呢?会顺推4位吗?
#36 Re: 刚刚干了件自己觉得比较牛逼的事情
好盘是2 剩下两个应该就是0和1了 这0和1如果互换 是否就不工作了 这个我还没试验 晚上可以试试WideAnimals 写了: 昨天 15:16 好棒为啥c,d是sb[160]-1和-2? 好盘是sb[160]还是sb[160]-3?
检查#print(len(sb))?如果超过216呢?会顺推4位吗?
len(sb)结果应该是512 因为这是我拿dd抓的一个扇区 按文档说 superblock应该是4k 但是我观察的是其实就头512byte有内容 所以光抓了512bytes
216必须是216 因为每个位置放什么都是规定好的 错位就不行了
再有一个细节是 所有的数字都是le 可能是因为这是Linux 所以一切按pc的标准来
上面之所以只用改 160 也是因为数字是le 这个序号按文档其实是可以占四位的 但是因为是le 又是个很小的整数 所以改第一个byte就够了
上次由 huangchong 在 2025年 7月 12日 15:23 修改。
原因: 未提供修改原因
原因: 未提供修改原因
#37 Re: 刚刚干了件自己觉得比较牛逼的事情
黄总优秀。你不是看起来像生物索南吗?huangchong 写了: 昨天 14:28说明:代码: 全选
#!/usr/bin/env python3 import os, sys, struct assert os.path.isfile(sys.argv[1]) with open(sys.argv[1],'rb') as f: sb=f.read() #print(len(sb)) def cal_csum(a): csum=0 for i in range(0,len(a),4): if i!=216: value=struct.unpack('<I',a[i:i+4])[0] csum+=value sb_csum= (csum & 0xffffffff) + (csum >>32) return sb_csum sb_csum=cal_csum(sb) print(f'{sb_csum:x}','{:x}' .format(struct.unpack('<I',sb[216:220])[0])) out1= sb[:160]+ \ chr(sb[160]-1).encode('latin-1')+ \ sb[161:183] + \ chr(sb[183]+1).encode('latin-1') + \ sb[184:] new_csum=cal_csum(out1) out2=out1[:216]+struct.pack('<I',new_csum)+out1[220:] with open('c','wb') as f: f.write(out2) out1= sb[:160]+ \ chr(sb[160]-2).encode('latin-1')+ \ sb[161:183] + \ chr(sb[183]+2).encode('latin-1') + \ sb[184:] new_csum=cal_csum(out1) out2=out1[:216]+struct.pack('<I',new_csum)+out1[220:] with open('d','wb') as f: f.write(out2)
linux的 md(multiple device,就是raid) superblock 1.2版本,字节160是存该盘在raid里的序号,字节183是该盘uuid的最后一个字节,我拷出来的好盘的superblock字节160是2号,所以其他俩应该是0和1号
cal_csum是看了linux源程序以后写的,算法很简单,就一句话,所以基本就是照抄。源程序是把4k的原始superblock全加起来,然后把32位的和放在216-219字节处,原始superblock 216到219是0,所以我得把这四个跳过。
https://linux.die.net/man/4/md
https://www.jeffgeerling.com/blog/2021/ ... inux-mdadm
https://archive.kernel.org/oldwiki/raid ... rmats.html
https://github.com/spotify/linux/blob/m ... aid/md_p.h
Linux自己的 算checksum的函数:
https://stash.phytec.com/projects/PUB/r ... 1dc587aacb代码: 全选
static u32 md_csum_fold(u32 csum) { csum = (csum & 0xffff) + (csum >> 16); return (csum & 0xffff) + (csum >> 16); } static unsigned int calc_sb_csum(mdp_super_t * sb) { u64 newcsum = 0; u32 *sb32 = (u32*)sb; int i; unsigned int disk_csum, csum; disk_csum = sb->sb_csum; sb->sb_csum = 0; for (i = 0; i < MD_SB_BYTES/4 ; i++) newcsum += sb32[i]; csum = (newcsum & 0xffffffff) + (newcsum>>32); #ifdef CONFIG_ALPHA /* This used to use csum_partial, which was wrong for several * reasons including that different results are returned on * different architectures. It isn't critical that we get exactly * the same return value as before (we always csum_fold before * testing, and that removes any differences). However as we * know that csum_partial always returned a 16bit value on * alphas, do a fold to maximise conformity to previous behaviour. */ sb->sb_csum = md_csum_fold(disk_csum); #else sb->sb_csum = disk_csum; #endif return csum; }
锁男一名,喜欢diy。有个不成功的油管频管 https://youtube.com/handydoctor89
有个亚马逊大折扣信息网站,各种各样类别,常备几千件货,可搜索。山寨名牌都有。每天更新。大部分5折,其它地方没有的哈,欢迎围观指导: https://amzdealshq.com Best Coupon Site for Amazon, Huge Discounts
有个亚马逊大折扣信息网站,各种各样类别,常备几千件货,可搜索。山寨名牌都有。每天更新。大部分5折,其它地方没有的哈,欢迎围观指导: https://amzdealshq.com Best Coupon Site for Amazon, Huge Discounts
#38 Re: 刚刚干了件自己觉得比较牛逼的事情
另外其实dd没那么吓人 只要使用前做好备份 使用时候养成良好习惯 加上认真仔细就行
比如读硬盘sdc上第 9-12个扇区 把它存进一个文件来备份:
把存着一个扇区内容的文件 写进sdc扇区9:
把sdc扇区9-12 用0 覆盖
测试硬盘读取速度
观赏拷出来的二进制文件
更高级的观赏加修改
比如读硬盘sdc上第 9-12个扇区 把它存进一个文件来备份:
代码: 全选
sudo dd if=/dev/sdc of=sdc9-12 bs=512 skip=8 count=4
代码: 全选
sudo dd if=./sec9 of=/dev/sdc bs=512 seek=8
把sdc扇区9-12 用0 覆盖
代码: 全选
sudo dd if=/dev/zero of=/dev/sdc bs=512 seek=8 count=4
代码: 全选
sudo dd if=/dev/sda of=/dev/null bs=1G count=10 oflag=dsync status=progress
代码: 全选
xxd diskdump
代码: 全选
bless diskdump
上次由 huangchong 在 2025年 7月 12日 15:40 修改。
原因: 未提供修改原因
原因: 未提供修改原因
#40 Re: 刚刚干了件自己觉得比较牛逼的事情
黄总你用哪个灵牛?huangchong 写了: 昨天 15:35 另外其实dd没那么吓人 只要使用前做好备份 使用时候养成良好习惯 加上认真仔细就行
比如读硬盘sdc上第 9-12个扇区 把它存进一个文件来备份:
把存着一个扇区内容的文件 写进sdc扇区9:代码: 全选
sudo dd if=/dev/sdc of=sdc9-12 bs=512 skip=8 count=4
代码: 全选
sudo dd if=./sec9 of=/dev/sdc bs=512 seek=8
把sdc扇区9-12 用0 覆盖
测试硬盘读取速度代码: 全选
sudo dd if=/dev/zero of=/dev/sdc bs=512 seek=8 count=4
观赏拷出来的二进制文件代码: 全选
sudo dd if=/dev/sda of=/dev/null bs=1G count=10 oflag=dsync status=progress
更高级的观赏加修改代码: 全选
xxd diskdump
代码: 全选
bless diskdump
锁男一名,喜欢diy。有个不成功的油管频管 https://youtube.com/handydoctor89
有个亚马逊大折扣信息网站,各种各样类别,常备几千件货,可搜索。山寨名牌都有。每天更新。大部分5折,其它地方没有的哈,欢迎围观指导: https://amzdealshq.com Best Coupon Site for Amazon, Huge Discounts
有个亚马逊大折扣信息网站,各种各样类别,常备几千件货,可搜索。山寨名牌都有。每天更新。大部分5折,其它地方没有的哈,欢迎围观指导: https://amzdealshq.com Best Coupon Site for Amazon, Huge Discounts