【问题标题】:How to read/write file slacks in Android with JNI?如何使用 JNI 在 Android 中读取/写入文件松弛?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多