Vincent Daanen

25 papers Journal 15Unranked 10
YearRankTypeTitle / Venue / Authors
2012 J jnl
Medical Image Anal.
Michael Baumann, Pierre Mozer, Vincent Daanen, Jocelyne Troccaz
2011 J jnl
CoRR
Michael Baumann, Michel Bolla, Vincent Daanen, Jean-Luc Descotes, Jean-Yves Giraud, Nikolai Hungr, Antoine Leroy, Jean-Alexandre Long, Sébastien Martin, Jocelyne Troccaz
2011 J jnl
CoRR
Michael Baumann, Pierre Mozer, Vincent Daanen, Jocelyne Troccaz
2010 conf
ISBI
Sébastien Martin, Michael Baumann, Vincent Daanen, Jocelyne Troccaz
2009 J jnl
CoRR
Michael Baumann, Pierre Mozer, Vincent Daanen, Jocelyne Troccaz
2009 conf
MICCAI (1)
Michael Baumann, Pierre Mozer, Vincent Daanen, Jocelyne Troccaz
2009 conf
ISBI
Michael Baumann, Pierre Mozer, Vincent Daanen, Jocelyne Troccaz
2008 J jnl
CoRR
Michael Baumann, Vincent Daanen, Antoine Leroy, Jocelyne Troccaz
2008 J jnl
CoRR
Jonathan Schers, Jocelyne Troccaz, Vincent Daanen, Céline Fouard, Christopher Plaskos, Pascal Kilian
2008 J jnl
CoRR
Sébastien Martin, Vincent Daanen, Jocelyne Troccaz
2008 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Sébastien Martin, Vincent Daanen, Jocelyne Troccaz
2008 J jnl
CoRR
Jean-Alexandre Long, Vincent Daanen, Alexandre Moreau-Gaudry, Jocelyne Troccaz, Jean-Jacques Rambeaud, Jean-Luc Descotes
2008 J jnl
CoRR
Pierre Mozer, Michael Baumann, Grégoire Chevreau, Vincent Daanen, Alexandre Moreau-Gaudry, Jocelyne Troccaz
2007 J jnl
CoRR
Vincent Daanen, J. Gastaldo, Jean-Yves Giraud, Philippe Fourneret, Jean-Luc Descotes, Michel Bolla, D. Collomb, Jocelyne Troccaz
2007 J jnl
CoRR
Jocelyne Troccaz, Michael Baumann, Peter J. Berkelman, Philippe Cinquin, Vincent Daanen, Antoine Leroy, Maud Marchal, Yohan Payan, Emmanuel Promayon, Sandrine Voros, Stéphane Bart, Michel Bolla, Emmanuel Chartier-Kastler, Jean-Luc Descotes, Andrée Dusserre, Jean-Yves Giraud, Jean-Alexandre Long, Ronan Moalic, Pierre Mozer
2007 J jnl
CoRR
Jean-Alexandre Long, Vincent Daanen, Alexandre Moreau-Gaudry, Jocelyne Troccaz, Jean-Jacques Rambeaud, Jean-Luc Descotes
2007 conf
MICCAI (2)
Michael Baumann, Pierre Mozer, Vincent Daanen, Jocelyne Troccaz
2007 J jnl
CoRR
Michael Baumann, Pierre Mozer, Vincent Daanen, Jocelyne Troccaz
2006 conf
CVAMIA
Michael Baumann, Vincent Daanen, Antoine Leroy, Jocelyne Troccaz
2006 conf
CVAMIA
Sébastien Martin, Vincent Daanen, Olivier Chavanon, Jocelyne Troccaz
2006 J jnl
Proc. IEEE
Jocelyne Troccaz, Michael Baumann, Peter J. Berkelman, Philippe Cinquin, Vincent Daanen, Antoine Leroy, Maud Marchal, Yohan Payan, Emmanuel Promayon, Sandrine Voros, Stéphane Bart, Michel Bolla, Emmanuel Chartier-Kastler, Jean-Luc Descotes, Andrée Dusserre, Jean-Yves Giraud, Jean-Alexandre Long, Ronan Moalic, Pierre Mozer
2006 conf
ISBI
Sébastien Martin, Vincent Daanen, Jocelyne Troccaz, Olivier Chavanon
2004 conf
MICCAI (1)
Vincent Daanen, Jerome Tonetti, Jocelyne Troccaz
2004 conf
ECCV Workshops CVAMIA and MMBIA
Vincent Daanen, Jerome Tonetti, Jocelyne Troccaz
2004 conf
CARS
Vincent Daanen, Jerome Tonetti, C. Marescaux, Jocelyne Troccaz
redb/extractors/js_extractors/scripts/js-xray-runner.js
← Index redb/extractors/js_extractors/scripts/js-xray-runner.js javascript
#!/usr/bin/env node
// Bridge between the Python JS pipeline and @nodesecure/js-x-ray.
//
// Usage: node js-xray-runner.js <path-to-js-file>
//   stdout  one JSON object: {"obfuscator": <name|null>, "warnings": [...]}
//   stderr  human-readable error on failure
//   exit 0  analysis ran (the file may still be benign — see "obfuscator")
//   exit 1  the file could not be read or analysed
//
// Each warning is emitted as {kind, value} so the Python side can tag
// supporting signals (encoded-literal, short-identifiers, suspicious-literal,
// unsafe-stmt) without having to mirror js-x-ray's whole schema.
//
// js-x-ray ≥7 ships as an ES module, which CommonJS `require()` cannot load
// from a `.js` script — the dynamic `import()` below is what makes the
// bridge work without renaming the file to `.mjs` or adding `"type":
// "module"` to package.json (which would break tools that still
// `require()` from this directory).

const fs = require("fs");
const path = require("path");

function fail(msg) {
  process.stderr.write(msg + "\n");
  process.exit(1);
}

async function main() {
  const target = process.argv[2];
  if (!target) fail("usage: js-xray-runner.js <file>");

  let source;
  try {
    source = fs.readFileSync(target, "utf8");
  } catch (e) {
    fail(`read failed: ${e.message}`);
  }

  // The legacy `runASTAnalysis` function is deprecated (removed in v8); the
  // current API is the `AstAnalyser` class. Both produce a result with the
  // same `warnings` shape, so the rest of the bridge is unchanged.
  let AstAnalyser;
  try {
    ({ AstAnalyser } = await import("@nodesecure/js-x-ray"));
  } catch (e) {
    fail(`@nodesecure/js-x-ray not installed (run \`npm install\` in ${path.dirname(__filename)}): ${e.message}`);
  }

  // js-x-ray defaults to module-mode parsing, which rejects scripts that
  // (legally) use reserved words as identifiers, top-level `return`, etc.
  // A lot of real-world JS malware is script-style (WScript/HTA bodies,
  // pasted snippets) — retrying in script mode catches those without
  // pulling in a more lenient parser. Both attempts share the same
  // analyser; only the parse mode flips. If both fail, the original error
  // (module-mode) is reported because that's the more informative one for
  // genuinely broken sources.
  let result;
  const analyser = new AstAnalyser();
  let firstErr;
  try {
    result = await analyser.analyse(source, { module: true });
  } catch (e) {
    firstErr = e;
    try {
      result = await analyser.analyse(source, { module: false });
    } catch (e2) {
      fail(`js-x-ray analysis failed: ${firstErr.message}`);
    }
  }

  const warnings = (result.warnings || []).map((w) => ({
    kind: w.kind,
    value: w.value !== undefined ? w.value : null,
  }));

  // js-x-ray flags the obfuscator family in a warning whose kind is
  // "obfuscated-code" and whose value names the family (jsfuck, obfuscator.io,
  // freejsobfuscator, morse, jjencode, ...). Absent => not detected.
  const obfWarning = warnings.find((w) => w.kind === "obfuscated-code");
  const obfuscator = obfWarning ? obfWarning.value : null;

  // js-x-ray runs its own AST internally with a modern parser, so its
  // identifier-length average is the only path the Python pipeline has to
  // that signal on ES2015+ sources — pyjsparser is ES5.1-only and silently
  // drops to 0 the moment it hits destructuring, classes, optional chaining,
  // etc. Surfacing this lets the heuristic's `avg_identifier_length<2`
  // strong signal fire on real obfuscator.io output. `null` when the value
  // is missing or non-numeric (defensive — older js-x-ray builds may differ).
  const idsLengthAvg =
    typeof result.idsLengthAvg === "number" && !Number.isNaN(result.idsLengthAvg)
      ? result.idsLengthAvg
      : null;

  process.stdout.write(JSON.stringify({ obfuscator, warnings, idsLengthAvg }));
}

main().catch((e) => fail(e.message || String(e)));