James R. Campbell

46 papers Misc 21Journal 10Unranked 15
YearRankTypeTitle / Venue / Authors
2022 Misc conf
AMIA
James R. Campbell, James Svoboda, Alfred Anzalone, Mary Campbell, Johnelle Sparks, Carol Geary
2019 J jnl
Int. J. Medical Informatics
Kin Wah Fung, Julia Xu, S. Trent Rosenbloom, James R. Campbell
2018 Misc conf
AMIA
James R. Campbell
2018 J jnl
J. Am. Medical Informatics Assoc.
Walter S. Campbell, Daniel Karlsson, Daniel J. Vreeman, Audrey Lazenby, Geoffrey Talmon, James R. Campbell
2018 Misc conf
AMIA
Jay Pedersen, Bret J. Gardner, James R. Campbell, Walter S. Campbell, Carol Geary, Lee B. Peters, Olivier Bodenreider, James C. McClay
2017 Misc conf
AMIA
Bret J. Gardner, Jay Pedersen, James R. Campbell, James C. McClay
2017 conf
CRI
Jay G. Pedersen, Bret J. Gardner, Walter S. Campbell, James R. Campbell, James C. McClay
2017 conf
CRI
Walter S. Campbell, Daniel Karlsson, Audrey Lazenby, Geoffrey Talmon, James R. Campbell
2016 Misc conf
AMIA
James R. Campbell
2016 conf
eHealth
Marzouk Mamou, Alan L. Rector, Stefan Schulz, James R. Campbell, Harold Solbrig, Jean Marie Rodrigues
2016 conf
CRI
James C. McClay, James R. Campbell, Ashok Mudgapalli, Russ Waitman
2016 conf
MIE
Marzouk Mamou, Alan L. Rector, Stefan Schulz, James R. Campbell, Harold R. Solbrig, Jean Marie Rodrigues
2015 J jnl
J. Biomed. Informatics
W. Scott Campbell, Jay Pedersen, James C. McClay, Praveen Rao, Dhundy Bastola, James R. Campbell
2015 Misc conf
AMIA
James R. Campbell, Walter S. Campbell, Hubert Hickman, Jay Pedersen, James C. McClay
2015 Misc conf
AMIA
Alan L. Rector, James R. Campbell, Bedirhan Üstün, Christopher G. Chute, Harold R. Solbrig
2015 conf
MedInfo
Jean Marie Rodrigues, David J. Robinson, Vincenzo Della Mea, James R. Campbell, Alan L. Rector, Stefan Schulz, Hazel Brear, Bedirhan Üstün, Kent A. Spackman, Christopher G. Chute, Jane Millar, Harold R. Solbrig, Kristina Brand Persson
2014 conf
ICHI
Vincenzo Della Mea, Omar Vuattolo, Bedirhan Üstün, Alan L. Rector, Stefan Schulz, Jean Marie Rodrigues, Kent A. Spackman, David J. Robinson, Jane Millar, James R. Campbell, Christopher G. Chute, Harold R. Solbrig, Kristina Brand Persson
2014 J jnl
J. Am. Medical Informatics Assoc.
Lemuel R. Waitman, Lauren S. Aaronson, Prakash M. Nadkarni, Daniel W. Connolly, James R. Campbell
2014 conf
MIE
Jean Marie Rodrigues, Stefan Schulz, Alan L. Rector, Kent A. Spackman, Jane Millar, James R. Campbell, Bedirhan Üstün, Christopher G. Chute, Harold R. Solbrig, Vincenzo Della Mea, Kristina Brand Persson
2014 J jnl
J. Am. Medical Informatics Assoc.
Walter S. Campbell, James R. Campbell, William W. West, James C. McClay, Steven H. Hinrichs
2014 conf
MIE
Stefan Schulz, Jean Marie Rodrigues, Alan L. Rector, Kent A. Spackman, James R. Campbell, Bedirhan Üstün, Christopher G. Chute, Harold R. Solbrig, Vincenzo Della Mea, Jane Millar, Kristina Brand Persson
2013 conf
MedInfo
James R. Campbell, Hazel Brear, Rita Scichilone, Susan White, Kathy L. Giannangelo, Brian Carlsen, Harold R. Solbrig, Kin Wah Fung
2007 conf
MedInfo
Karen M. Hrabak, James R. Campbell, Samson W. Tu, Robert C. McClure, Robert Weida
2007 J jnl
J. Am. Medical Informatics Assoc.
Samson W. Tu, James R. Campbell, Julie Glasgow, Mark A. Nyman, Robert C. McClure, James C. McClay, Craig G. Parker, Karen M. Hrabak, David Berg, Tony Weida, James G. Mansfield, Mark A. Musen, Robert M. Abarbanel
2006 Misc conf
AMIA
Robert M. Abarbanel, David Berg, James R. Campbell, Julie Glasgow, Karen M. Hrabak, James G. Mansfield, James C. McClay, Robert C. McClure, Mark A. Nyman, Craig G. Parker, Sidna M. Scheitel, Samson W. Tu, Tony Weida
2006 Misc conf
AMIA
James C. McClay, James R. Campbell, Craig G. Parker, Karen M. Hrabak, Samson W. Tu, Robert M. Abarbanel
2006 Misc conf
AMIA
Samson W. Tu, Karen M. Hrabak, James R. Campbell, Julie Glasgow, Mark A. Nyman, Robert C. McClure, James C. McClay, Robert M. Abarbanel, James G. Mansfield, Susana B. Martins, Mary K. Goldstein, Mark A. Musen
2004 conf
MedInfo
Craig G. Parker, Roberto A. Rocha, James R. Campbell, Samson W. Tu, Stanley M. Huff
2004 conf
MedInfo
Samson W. Tu, Mark A. Musen, Ravi D. Shankar, James R. Campbell, Karen M. Hrabak, James C. McClay, Stanley M. Huff, Robert C. McClure, Craig G. Parker, Roberto A. Rocha, Robert M. Abarbanel, Nick Beard, Julie Glasgow, Guy Mansfield, Prabhu Ram, Qin Ye, Eric Mays, Tony Weida, Christopher G. Chute, Kevin McDonald, David N. Mohr, Mark A. Nyman, Sidna M. Scheitel, Harold Solbrig, David A. Zill, Mary K. Goldstein
2004 conf
CGP
Samson W. Tu, James R. Campbell, Mark A. Musen
2003 Misc conf
AMIA
John R. Windle, Glen Van-Milligan, Sean Duffy, James C. McClay, James R. Campbell
2003 Misc conf
AMIA
Samson W. Tu, James R. Campbell, Mark A. Musen
2003 Misc conf
AMIA
John R. Windle, Glen Van-Milligan, Sean Duffy, James C. McClay, James R. Campbell
2002 J jnl
Int. J. Inf. Technol. Decis. Mak.
Thomas G. Tape, Stephen D. Flach, James R. Campbell
2002 Misc conf
AMIA
James C. McClay, James R. Campbell
2002 Misc conf
AMIA
Nick Beard, James R. Campbell, Stanley M. Huff, Mauricio Leon, James G. Mansfield, Eric Mays, James C. McClay, David N. Mohr, Mark A. Musen, David O'Brien, Roberto A. Rocha, Anne Saulovich, Sidna M. Scheitel, Samson W. Tu
2001 conf
MedInfo
James R. Campbell
1999 Misc conf
AMIA
James R. Campbell, Peter L. Elkin
1998 Misc conf
AMIA
Judith J. Warren, Jeanne Collins, Catherine Sorrentino, James R. Campbell
1998 J jnl
J. Am. Medical Informatics Assoc.
Christopher G. Chute, Simon P. Cohn, James R. Campbell
1998 Misc conf
AMIA
James R. Campbell
1997 Misc conf
AMIA
Jane R. Thompson, Robin A. Stoupa, Katie Sorrentino, Jane M. Carrothers, James R. Campbell
1997 Misc conf
AMIA
Judith J. Warren, Stephen D. Flach, Julie Lazure, Catherine Sorrentino, James R. Campbell
1997 J jnl
J. Am. Medical Informatics Assoc.
James R. Campbell, Paul C. Carpenter, Charles Sneiderman, Simon P. Cohn, Christopher G. Chute, Judith J. Warren
1997 Misc conf
AMIA
James R. Campbell, James Veline, Debra Hilton, Catherine Sorrentino, Joseph H. Sisson, James A. Bahensky
1996 J jnl
J. Am. Medical Informatics Assoc.
Christopher G. Chute, Simon P. Cohn, Keith E. Campbell, Diane E. Oliver, James R. Campbell
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)));