我尝试在Ubuntu 16中使用加密密钥来解密磁盘,我想从磁盘末端读取它,就像原始数据一样,出于安全原因不创建任何文件,即像dd在方式
sudo dd if=some_disk bs=1 skip=end_of_disk - keysize count=keysize
所以,我写了一个测试程序
#include <fcntl.h>
#include <linux/fs.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
unsigned long long disksize(char *drivename)
{
int fd;
unsigned long long numblocks=0;
fd = open(drivename, O_RDONLY);
ioctl(fd, BLKGETSIZE64, &numblocks);
close(fd);
return numblocks;
}
int main(int argc, char **argv)
{
int fd;
FILE *device;
int keySize = 2048;
int count;
unsigned char *block;
unsigned long long endOfDisk=disksize(argv[1]);
unsigned long long startFrom = endOfDisk - keySize;
block = calloc(keySize, sizeof(char));
// fd=open(argv[1], O_RDWR | O_DIRECT);
device = fopen(argv[1], "r");
long res = fseek(device, startFrom, SEEK_SET);
perror("nSeeking error:");
fread(block, 1, keySize, device);
fclose(device);
printf("nDevice Size: %lldn", endOfDisk);
printf("nReading data starting from: %lldn", startFrom);
for(count = 0; count < keySize; count++){
printf("%c", block[count]);
}
free(block);
}
它在小磁盘上工作得很好,比如说,在引导分区或容量为1Gb的USB棒上,但是当我试图从4Gb的USB棒上获取密钥时,我不能:程序在磁盘上打印超出密钥区域的东西和错误显示无效参数"fseek。看起来像fseek不能设置指针正确,我不明白为什么:
fdisk -l some_disk
显示的磁盘大小与endOfDisk完全相同
注:正如有人可以从几个基本原理中看到的那样,我也尝试了lseek,结果完全相同,打印完全相同的信息,而不是存储在磁盘密钥上。
ioctl(fd, BLKGETSIZE64, &numblocks)
返回512字节块大小,fseek()
期望以字节为单位的偏移量。顺便说一句,你可以设置指针相对于磁盘的末端,而不知道它的大小:
fseek(device, -keySize, SEEK_END);