我正在构建一个取证工具,它将从文件松弛中读取和写入。目前,我使用 JNI 调用 C 函数read()和write()将缓冲区写入 FAT SD 卡(也可以使用 EXT4 内部存储器)。我使用这些是因为您可以将长度传递给读/写,从而忽略 EOF。我已经尝试使用标准写入然后截断它是为了写入文件 slack,该文件适用于 ubuntu 14.04,但不适用于 Android(API 21)。从文件中读取比实际文件大小更多的内容并不能反映 SD 卡上的文件松弛。有一些工具,例如“bmap”或“slacker.exe”(用于 NTFS),可以管理访问文件松弛。我需要一种方法来忽略 EOF 或自己处理它。我不希望更改现有的文件系统驱动程序。我很感激任何建议。
这是一些示例代码(尚未工作):
jstring
Java_com_example_hellojni_HelloJni_write(JNIEnv *env, jobject thiz, jstring path)
{
char *cpath = (*env)->GetStringUTFChars(env, path, NULL);
int raw_file_descriptor = open(cpath,O_WRONLY,0);
lseek(raw_file_descriptor,0,SEEK_END);
char block_buffer [4096] = "hidden";
int buffer_length = 6;
int wret = write(raw_file_descriptor,block_buffer,buffer_length); // increases file size and moves EOF - I don't want that
LOGD(" char written: %d", wret);
free(cpath);
return (*env)->NewStringUTF(env, "write ok ");
}
jbyteArray
Java_com_example_hellojni_HelloJni_read2(JNIEnv *env, jobject thiz, jstring path) {
char *cpath = (*env)->GetStringUTFChars(env, path, NULL);
LOGD("open %s with ", cpath);
int raw_file_descriptor = open(cpath,O_RDONLY,0);
char buffer [4096];
int readretval = read(raw_file_descriptor, buffer, 50); // stops at EOF - I want it to continue reading all 50 bytes from the SD-card - This gives me the file content until EOF and then I get some random characters from the uninitialized buffer.
LOGD("read (%d) buffer with length %d: %s", readretval, sizeof(buffer), buffer);
int i; // Debug code
for (i=0; i < 49; ++i) {
LOGD("%c",buffer[i]);
}
close(raw_file_descriptor);
free(cpath);
return NULL;
}