Fingerprint Pro Internals
Collector s209

Canvas noise check

a seeded pattern drawn and read back, which exposes per-call canvas randomisation

Group: Graphics · signal map · run it live

// s209 — sig_s209_getRandomValues
// module cm, stage3, codes 0 -1
//
// measures
//   window.crypto.getRandomValues() document.createElement("canvas") TextEncoder
// engine
//   Math.floor() Array.from() ArrayBuffer Object.getOwnPropertyNames() Object.getPrototypeOf()
//   Uint32Array Uint8Array
// reported value
//   null {s,p,d}
// probes
//   "," ",255)" "2d" "data" "function" "height" "rgba(" "width"
// compares against
//   < 4 == "function" === "string"
// decides on
//   !v338
//   h_s209_fn: (v328 >>> 0) / 4294967296
//   readVaultedProp: typeof v316 == "function"
//   resolveNameByHash: typeof arg801 === "string"
//   resolveNameByHash: fn48(v928) === arg801
//
// 2 owned helpers inlined below.
// shared with other collectors, see agent.clean.js:
//   asUint8Array:6496 crc32OfBytes:4943 fn48:3370 readVaultedProp:1674 resolveNameByHash:7015
//   stringToBytes:7901

// agent.clean.js:404
function h_s209_getRandomValues() {
  const uint32Array2 = new Uint32Array(4);
  window.crypto.getRandomValues(uint32Array2);
  return [uint32Array2[0] | 0, uint32Array2[1] | 0, uint32Array2[2] | 0, uint32Array2[3] | 0];
}

// agent.clean.js:1771
function h_s209_fn(arg267, arg268, arg269, arg270) {
  return function () {
    const v327 = arg268 << 9;
    let v328 = 5 * arg267;
    v328 = 9 * ((v328 << 7) | (v328 >>> 25));
    arg270 ^= arg268;
    arg268 ^= arg269 ^= arg267;
    arg267 ^= arg270;
    arg269 ^= v327;
    arg270 = (arg270 << 11) | (arg270 >>> 21);
    return (v328 >>> 0) / 4294967296;
  };
}

// agent.clean.js:1844
function sig_s209_getRandomValues() {
  const v337 = function (arg281, arg282, arg283, arg284, arg285) {
      return arg281(arg282, arg283, arg284, arg285);
    },
    canvas2 = document.createElement("canvas"),
    v338 = canvas2.getContext("2d");
  if (!v338) {
    return { s: -1, v: null };
  }
  canvas2.width = 4;
  canvas2.height = 4;
  const v339 = h_s209_getRandomValues(),
    v340 = v337(h_s209_fn, v339[0], v339[1], v339[2], v339[3]);
  for (let v342 = 0; v342 < 4; v342++) {
    for (let v343 = 0; v343 < 4; v343++) {
      const v344 = Math.floor(v340() * 256),
        v345 = Math.floor(v340() * 256),
        v346 = Math.floor(v340() * 256);
      v338.fillStyle = "rgba(" + v344 + "," + v345 + "," + v346 + ",255)";
      v338.fillRect(v343, v342, 1, 1);
    }
  }
  const v341 = v338.getImageData(
    0,
    0,
    readVaultedProp(canvas2, "width"),
    readVaultedProp(canvas2, "height"),
  );
  return { s: 0, v: { s: v339, p: Array.from(readVaultedProp(v341, "data")), d: 4 } };
}