Kari Tammi

50 papers C 6Misc 1Journal 40Unranked 3
YearRankTypeTitle / Venue / Authors
2026 J jnl
Comput. Ind. Eng.
Chao Yang, Xiaodu Hu, Zhengyang Wang, Shouxuan Wu, Jinzhi Lu, Lei Feng, Dimitris Kiritsis, Kari Tammi
2026 J jnl
IEEE Access
Pejman Habibiroudkenar, David Forkel, Risto Ojala, Hari Prasanth S. M., Dadi Hrannar Davidsson, Kari Tammi, Eloise Matheson, Mario Di Castro
2025 J jnl
IEEE Netw.
Chao Yang, Hao Yu, Qize Guo, Tarik Taleb, José Costa-Requena, Kari Tammi
2025 J jnl
IEEE Access
Joel Mattila, Riku Ala-Laurinaho, Juuso Autiosalo, Kari Tammi
2025 J jnl
IEEE Access
Nilusha Jayawickrama, Risto Ojala, Hossein Firooz, Kari Tammi
2025 J jnl
IEEE Access
Eerik Alamikkotervo, Henrik Toikka, Kari Tammi, Risto Ojala
2025 C conf
INDIN
Chao Yang, Xinyi Tu, Riku Ala-Laurinaho, Joel Mattila, Jari Juhanko, Kari Tammi, Stefan Vogt, Paul Patolla, Dirk Reichelt
2024 J jnl
CoRR
Pejman Habibiroudkenar, Risto Ojala, Kari Tammi
2024 J jnl
J. Intell. Robotic Syst.
Pejman Habibiroudkenar, Risto Ojala, Kari Tammi
2024 C conf
INDIN
Chao Yang, Yuan Zheng, Yuan Hua, Riku Ala-Laurinaho, Udayanto Dwi Atmojo, Kari Tammi
2024 J jnl
J. Big Data
Alvari Seppänen, Eerik Alamikkotervo, Risto Ojala, Giacomo Dario, Kari Tammi
2024 J jnl
Pattern Recognit. Lett.
Alvari Seppänen, Risto Ojala, Kari Tammi
2024 C conf
IECON
Chao Yang, Hao Yu, Yuan Zheng, Riku Ala-Laurinaho, Lei Feng, Kari Tammi
2024 J jnl
CoRR
Eerik Alamikkotervo, Henrik Toikka, Kari Tammi, Risto Ojala
2023 J jnl
IEEE Robotics Autom. Lett.
Alvari Seppänen, Risto Ojala, Kari Tammi
2023 J jnl
J. Big Data
Nilusha Jayawickrama, Enric Perarnau Ollé, Jesse Pirhonen, Risto Ojala, Klaus Kivekas, Jari Vepsäläinen, Kari Tammi
2023 J jnl
IEEE Access
Antti Ritari, Panagiotis Mouratidis, Kari Tammi
2023 J jnl
CoRR
Alvari Seppänen, Risto Ojala, Kari Tammi
2023 J jnl
Adv. Eng. Informatics
Chao Yang, Yuan Zheng, Xinyi Tu, Riku Ala-Laurinaho, Juuso Autiosalo, Olli Seppänen, Kari Tammi
2023 J jnl
CoRR
Eerik Alamikkotervo, Risto Ojala, Alvari Seppänen, Kari Tammi
2023 J jnl
Frontiers Virtual Real.
Xinyi Tu, Juuso Autiosalo, Riku Ala-Laurinaho, Chao Yang, Pauli Salminen, Kari Tammi
2022 J jnl
CoRR
Alvari Seppänen, Risto Ojala, Kari Tammi
2022 J jnl
IEEE Trans. Intell. Transp. Syst.
Sanchari Deb, Kari Tammi, Xiao-Zhi Gao, Karuna Kalita, Pinakeswar Mahanta, Sam Cross
2022 J jnl
Comput.
Riku Ala-Laurinaho, Joel Mattila, Juuso Autiosalo, Jani Hietala, Heikki Laaki, Kari Tammi
2022 J jnl
J. Intell. Robotic Syst.
Alvari Seppänen, Jari Vepsäläinen, Risto Ojala, Kari Tammi
2022 J jnl
J. Big Data
Risto Ojala, Jari Vepsäläinen, Kari Tammi
2022 J jnl
CoRR
Alvari Seppänen, Eerik Alamikkotervo, Risto Ojala, Giacomo Dario, Kari Tammi
2022 J jnl
IEEE Access
Jesse Pirhonen, Risto Ojala, Klaus Kivekas, Kari Tammi
2021 J jnl
IEEE Access
Juuso Autiosalo, Joshua Siegel, Kari Tammi
2020 J jnl
IEEE Access
Juuso Autiosalo, Jari Vepsäläinen, Raine Viitala, Kari Tammi
2020 J jnl
IEEE Access
Sanchari Deb, Kari Tammi, Xiao-Zhi Gao, Karuna Kalita, Pinakeswar Mahanta
2020 J jnl
Soft Comput.
Sanchari Deb, Xiao-Zhi Gao, Kari Tammi, Karuna Kalita, Pinakeswar Mahanta
2020 J jnl
IEEE Access
Riku Ala-Laurinaho, Juuso Autiosalo, Anna Nikander, Joel Mattila, Kari Tammi
2020 J jnl
IEEE Trans. Intell. Transp. Syst.
Risto Ojala, Jari Vepsäläinen, Jussi Hanhirova, Vesa Hirvisalo, Kari Tammi
2020 J jnl
J. Sens. Actuator Networks
Riku Ala-Laurinaho, Juuso Autiosalo, Kari Tammi
2020 J jnl
Artif. Intell. Rev.
Sanchari Deb, Xiao-Zhi Gao, Kari Tammi, Karuna Kalita, Pinakeswar Mahanta
2019 J jnl
IEEE Access
Sanchari Deb, Kari Tammi, Karuna Kalita, Pinakeswar Mahanta
2019 J jnl
IEEE Access
Heikki Laaki, Yoan Miche, Kari Tammi
2019 J jnl
IEEE Access
Janne Huotari, Antti Ritari, Risto Ojala, Jari Vepsäläinen, Kari Tammi
2019 J jnl
IEEE Trans. Veh. Technol.
Klaus Kivekas, Antti Lajunen, Francesco Baldi, Jari Vepsäläinen, Kari Tammi
2018 conf
ITSC
Jari Vepsäläinen, Francesco Baldi, Antti Lajunen, Klaus Kivekas, Kari Tammi
2018 J jnl
IEEE Access
Klaus Kivekas, Jari Vepsäläinen, Kari Tammi
2018 J jnl
IEEE Access
Kari Tammi, Tatiana A. Minav, Juha Kortelainen
2016 C conf
IECON
Jari Kataja, Marko Antila, Maksim Sokolov, Marko Hinkkanen, Seppo Saarakkala, Kari Tammi
2014 J jnl
IEEE Trans. Signal Process.
Tuomas Haarnoja, Kari Tammi, Kai Zenger
2014 conf
ISIE
Teemu Halmeaho, Pekka Rahkola, Jenni Pippuri, Kari Tammi
2013 C conf
IECON
Antti Kosonen, Lassi Aarniovuori, Juha J. Pyrhönen, Jero Ahola, Markku Niemela, Kari Tammi
2012 Misc conf
ICASSP
Tuomas Haarnoja, Kari Tammi, Kai Zenger
2010 C conf
ICARCV
Kai Zenger, Ali Altowati, Kari Tammi, Eero Vesaoja
2010 conf
PSYCO
Antti Laiho, Kari Tammi, Ville Vidqvist
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)));