Victoria Yaneva

41 papers A* 1A 2B 4Misc 5Journal 8Unranked 17
YearRankTypeTitle / Venue / Authors
2025 J jnl
Biomed. Signal Process. Control.
Sukru Eraslan, Yeliz Yesilada, Ali Shafique, Victoria Yaneva, Le An Ha
2025 J jnl
CoRR
Sahar Yarmohammadtoosky, Yiyun Zhou, Victoria Yaneva, Peter Baldwin, Saed Rezayi, Brian Clauser, Polina Harik
2024 conf
BEA
Victoria Yaneva, King Yiu Suen, Le An Ha, Janet Mee, Milton Quranda, Polina Harik
2024 conf
BEA
Victoria Yaneva, Kai North, Peter Baldwin, Le An Ha, Saed Rezayi, Yiyun Zhou, Sagnik Ray Choudhury, Polina Harik, Brian Clauser
2024 ed.
BEA
Ekaterina Kochmar, Marie Bexte, Jill Burstein, Andrea Horbach, Ronja Laarmann-Quante, Anaïs Tack, Victoria Yaneva, Zheng Yuan
2023 conf
BEA@ACL
King Yiu Suen, Victoria Yaneva, Le An Ha, Janet Mee, Yiyun Zhou, Polina Harik
2023 J jnl
Behav. Inf. Technol.
Erfan Khalaji, Sukru Eraslan, Yeliz Yesilada, Victoria Yaneva
2023 J jnl
ACM Trans. Access. Comput.
Victoria Yaneva, Dragan Ahmetovic
2023 ed.
BEA@ACL
Ekaterina Kochmar, Jill Burstein, Andrea Horbach, Ronja Laarmann-Quante, Nitin Madnani, Anaïs Tack, Victoria Yaneva, Zheng Yuan, Torsten Zesch
2022 conf
NAACL-HLT
Victoria Yaneva, Janet Mee, Le An Ha, Polina Harik, Michael Jodoin, Alex Mechaber
2022 ed.
W4A
Dragan Ahmetovic, Victoria Yaneva
2021 J jnl
Univers. Access Inf. Soc.
Sukru Eraslan, Yeliz Yesilada, Victoria Yaneva, Le An Ha
2021 conf
BEA@EACL
Victoria Yaneva, Daniel Jurich, Le An Ha, Peter Baldwin
2021 ed.
W4A
Silvia Rodríguez Vázquez, Ted Drake, Dragan Ahmetovic, Victoria Yaneva
2020 conf
W4A
Sukru Eraslan, Yeliz Yesilada, Victoria Yaneva, Simon Harper
2020 B conf
COLING
Le An Ha, Victoria Yaneva, Polina Harik, Ravi Pandian, Amy Morales, Brian Clauser
2020 J jnl
CoRR
Victoria Yaneva, Le An Ha, Richard Evans, Ruslan Mitkov
2020 B conf
LREC
Victoria Yaneva, Le An Ha, Peter Baldwin, Janet Mee
2020 conf
BEA@ACL
Kang Xue, Victoria Yaneva, Christopher Runyon, Peter Baldwin
2020 conf
W4A
Victoria Yaneva, Dragan Ahmetovic
2019 Misc conf
RANLP
Victoria Yaneva, Constantin Orasan, Le An Ha, Natalia Ponomareva
2019 conf
W4A
Victoria Yaneva, Le An Ha, Sukru Eraslan, Yeliz Yesilada
2019 Misc conf
RANLP
Le An Ha, Victoria Yaneva
2019 A conf
UMAP
Oludamilare Matthews, Sukru Eraslan, Victoria Yaneva, Alan Davies, Yeliz Yesilada, Markel Vigo, Simon Harper
2019 conf
BEA@ACL
Le An Ha, Victoria Yaneva, Peter Baldwin, Janet Mee
2019 J jnl
Behav. Inf. Technol.
Sukru Eraslan, Victoria Yaneva, Yeliz Yesilada, Simon Harper
2018 J jnl
ACM SIGACCESS Access. Comput.
Victoria Yaneva
2018 conf
BEA@NAACL-HLT
Le An Ha, Victoria Yaneva
2018 A* conf
EMNLP
Victoria Yaneva, Le An Ha, Richard Evans, Ruslan Mitkov
2018 conf
W4A
Victoria Yaneva, Le An Ha, Sukru Eraslan, Yeliz Yesilada, Ruslan Mitkov
2017 conf
Europhras
Victoria Yaneva, Shiva Taslimipoor, Omid Rohanian, Le An Ha
2017 conf
BEA@EMNLP
Victoria Yaneva, Constantin Orasan, Richard Evans, Omid Rohanian
2017 conf
W4A
Sukru Eraslan, Victoria Yaneva, Yeliz Yesilada, Simon Harper
2017 conf
BEA@EMNLP
Sanja Stajner, Victoria Yaneva, Ruslan Mitkov, Simone Paolo Ponzetto
2017 Misc conf
RANLP
Omid Rohanian, Shiva Taslimipoor, Victoria Yaneva, Le An Ha
2016 B conf
LREC
Victoria Yaneva, Irina P. Temnikova, Ruslan Mitkov
2016 B conf
LREC
Victoria Yaneva, Irina P. Temnikova, Ruslan Mitkov
2015 A conf
ASSETS
Victoria Yaneva, Irina P. Temnikova, Ruslan Mitkov
2015 Misc conf
RANLP
Victoria Yaneva
2015 Misc conf
RANLP
Victoria Yaneva, Richard Evans
2013 conf
ACL (Student Research Workshop)
Vlad Niculae, Victoria Yaneva
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)));