【问题标题】:Named pipe between Rust and Java Ghidra Process Access RightsRust 和 Java Ghidra 进程访问权限之间的命名管道
【发布时间】:2021-02-09 10:13:51
【问题描述】:

我正在尝试在执行 Ghidra 进程的 Rust 程序和作为 Ghidra 进程的一部分运行的 Java 程序之间创建一个命名管道。我目前无法获得正确的访问权限(权限位)。

java.io.FileNotFoundException: /home/.../ghidra_rust_pipe/pipe/.tmpkOE0zg/pcode.pipe (Permission denied)

我的 Rust 程序看起来像这样(我尝试设置权限位以让其他用户拥有写入权限。)

...

let tmp_dir = TempDir::new_in("pipe").unwrap();
let fifo_path = tmp_dir.path().join("pcode.pipe");

// create new fifo and set permission bits
match unistd::mkfifo(&fifo_path, stat::Mode::S_IWOTH) {
   Ok(_) => println!("created {:?}", fifo_path),
   Err(err) => println!("Error creating fifo: {}", err),
}

// Execute Ghidra
let output =  Command::new(&headless_path)
    .arg(tmp_ghidra_project)
    .arg("PcodeExtractor")
    .arg("-import")
    .arg(file_path)
    .arg("-postScript")
    .arg("PcodeExtractor.java")
    .arg(fifo_path.clone())     // Path to the named pipe
    .arg("-scriptPath")
    .arg(script_path)
    .arg("-deleteProject")
    .output()
    .unwrap();

...

if let Ok(mut file) = File::open(fifo_path) {
    let mut contents = String::new();
    match file.read_to_string(&mut contents) {
        Ok(_) => println!("{}", contents),
        Err(err) => panic!("Failed to write contents {}", err),
    }
}

在Java程序中我尝试像这样访问访问管道(路径是Rust程序给出的管道参数):

...

Gson gson = new GsonBuilder().setPrettyPrinting().addSerializationExclusionStrategy(strategy).create();
try {
    FileOutputStream pcodeStream = new  FileOutputStream(path);
    String jsonString = gson.toJson(project);
    pcodeStream.write(jsonString.getBytes());
    pcodeStream.flush();
    pcodeStream.close();
} catch (JsonIOException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

...

我已经尝试过其中一些代码:https://www.gnu.org/software/libc/manual/html_node/Permission-Bits.html。有谁知道如何正确设置权限?

这是 Java 异常的完整跟踪:

java.io.FileNotFoundException: /home/.../ghidra_rust_pipe/pipe/.tmpmazu66/pcode.pipe (Permission denied)
        at java.base/java.io.FileOutputStream.open0(Native Method)
        at java.base/java.io.FileOutputStream.open(FileOutputStream.java:298)
        at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:237)
        at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:126)
        at serializer.Serializer.serializeProject(Serializer.java:66)
        at PcodeExtractor.run(PcodeExtractor.java:61)
        at ghidra.app.script.GhidraScript.executeNormal(GhidraScript.java:379)
        at ghidra.app.script.GhidraScript.doExecute(GhidraScript.java:234)
        at ghidra.app.script.GhidraScript.execute(GhidraScript.java:212)
        at ghidra.app.util.headless.HeadlessAnalyzer.runScript(HeadlessAnalyzer.java:574)
        at ghidra.app.util.headless.HeadlessAnalyzer.runScriptsList(HeadlessAnalyzer.java:891)
        at ghidra.app.util.headless.HeadlessAnalyzer.analyzeProgram(HeadlessAnalyzer.java:1039)
        at ghidra.app.util.headless.HeadlessAnalyzer.processFileWithImport(HeadlessAnalyzer.java:1532)
        at ghidra.app.util.headless.HeadlessAnalyzer.processWithImport(HeadlessAnalyzer.java:1670)
        at ghidra.app.util.headless.HeadlessAnalyzer.processWithImport(HeadlessAnalyzer.java:1735)
        at ghidra.app.util.headless.HeadlessAnalyzer.processLocal(HeadlessAnalyzer.java:443)
        at ghidra.app.util.headless.AnalyzeHeadless.launch(AnalyzeHeadless.java:121)
        at ghidra.GhidraLauncher.main(GhidraLauncher.java:82)

【问题讨论】:

  • 你能发布 Java 异常的完整堆栈跟踪吗?
  • @HHK 我已经用完整的堆栈跟踪更新了帖子。
  • 您是否以同一用户身份运行这两个进程?如果是这样,请尝试改用 S_IRWXU 权限(因为您作为管道的所有者同时从它读取和写入)。
  • 很奇怪。如果使用 S_IRWXU,Java 中的错误是否相同?我怀疑Java进程挂起。这可能是因为您正在等待 Java 进程以 output() 结束,然后再在 Rust 中打开管道。管道的工作方式是进程阻塞open(),直到读取器和写入器都尝试打开()。因此,启动 Java 进程并在一个额外的线程中等待它会有所帮助。

标签: java rust pipe access-rights ghidra


【解决方案1】:

对于任何有同样问题的人,HHK在我的问题下的评论包含为另一个进程创建一个新线程的答案,这样管道就不会阻塞。

见下面的代码:

...

let ghidra_subprocess = 
    thread::spawn(move || { . . . }); // Put Ghidra or any command command here

if let Ok(mut file) = File::open(fifo_path) {
    let mut contents = String::new();
    match file.read_to_string(&mut contents) {
        Ok(_) => println!("{}", contents),
        Err(err) => panic!("Failed to write contents {}", err),
    }
}

ghidra_subprocess.join().expect("Ghidra Subprocess panicked!");

...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2016-09-22
    相关资源
    最近更新 更多