我有一个任务是创建一个小图像,以最简单的方式加密它并编写解密驱动程序。
制作图片:
dd if=/dev/zero of=myFS bs=1024 count=60
mkfs.ext2 myFS
使用XOR加密:
int main()
{
std::fstream streamIn;
std::fstream streamOut;
const char key = 0b00001111;
streamIn.open("myFS", std::ios_base::binary | std::ios_base::in);
streamOut.open("newFS", std::ios_base::binary | std::ios_base::trunc | std::ios_base::out);
char b;
while (streamIn.read(&b, 1))
{
b ^= key;
streamOut.write(&b, 1);
}
streamIn.close();
streamOut.close();
return 0;
}
然后,写下司机。它基于device-mapper-target内核模块,因此它的主映射函数有这个原型:
static int sddm_target_map(struct dm_target *ti, struct bio *bio);
你知道,我有一个生物结构,我想,我应该解密它包含的每个字节。我现在拥有的:
struct bio_vec vec;
struct bvec_iter it;
unsigned int len;
char *addr;
unsigned int i;
unsigned long flag;
bio_for_each_segment(vec, bio, it)
{
len = vec.bv_len;
addr = bvec_kmap_irq(&vec, &flag);
for (i = 0; i != len; ++i)
{
*(addr+i) ^= 0b00001111;
}
bvec_kunmap_irq(addr, &flag);
}
当然,它不起作用。不知道为什么,但它甚至不会改变查询中的任何内容。我可以写*(addr+i) ^= 0;
,什么都不会改变。如果我将此驱动程序应用于非加密图像,它将安装得很好。
所以我的问题是如何更改存储在生物结构中的数据?