如何使用JNI读取/写入Android中的文件松弛?

时间:2016-01-13 10:29:56

标签: android c file java-native-interface computer-forensics

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

1 个答案:

答案 0 :(得分:0)

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