【发布时间】:2016-01-13 10:29:56
【问题描述】:
我正在构建一个取证工具,它将从文件松弛中读取和写入。目前我使用 JNI 调用 C 函数 read() 和 write() 将缓冲区写入 FAT SD 卡(也可以使用 EXT4 内部存储器) .我使用这些是因为您可以将长度传递给读/写,从而忽略 EOF。 我已经尝试使用标准写入然后 truncate 来写入文件 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;
}
【问题讨论】:
-
lseek()到文件末尾,然后是write()并不能保证您写入文件末尾 - 调用不是原子的。调用open()并设置O_APPEND标志。如果您在从GetStringUTFChars()返回的char *上调用free(),您的代码不会工作。见stackoverflow.com/questions/5859673/…。此外,read()和write()都返回ssize_t,而不是int。它们是不相同的。 JNI非常无情。 -
澄清:上面的代码符合并运行。只是不是我想要的方式。 @AndrewHenle 1. lseek() 和 write() 适合我的目的。 2. 感谢您指出GetStringUTFChars() 这可能会使我的程序更稳定。 3. 正如 types.h 中定义的那样,C ssize_t 实际上是一个 int。我接受改进。我同意 JNI 的无情。谢谢你的评论
-
在 types.h 中为 C 定义的 ssize_t 实际上是一个 int Oh really? 标准中的类型 - 例如
read()/write()返回类型 @987654338 @ - 出于原因而完成。但是,如果您认为您比这些标准的作者更了解这些事情并且您知道得更多,因为您查看了 one 平台上的types.h以实现 one 和看到 ssize_t 实际上是一个 int,继续往下看。 -
我已经同意使用 ssize_t,因为 read() / write () 确实返回 ssize_t 而不是 int。这是我的问题的次要主题。让我们关注一个解决方案 - 如何读取和写入文件 slack。我们可以吗?
-
供您参考维基百科并不总是正确的检查android source code
标签: android c file java-native-interface computer-forensics