0

我正在构建一个取证工具,它将从文件松弛中读取和写入。目前,我使用 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;
}
4

1 回答 1

0

显然这种方式是不可能的。但是使用 root 可以通过安装环回设备来写入文件松弛。尽管如此,如果不更改驱动程序或实现自己的内核模块,就不可能忽略 EOF。

于 2016-02-09T17:57:05.953 回答