← All hunts high TLP:CLEAR

Trojanized Inno Installer Staging and Callbacks

An adversary has delivered monetization payloads using a trojanized Inno Setup installer that stages numbered executables in temporary paths, contacts offer-tracking infrastructure, and establishes persistence via SYSTEM-level scheduled tasks.

Based on research by Microsoft 2026-11-04 12 steps · 5 queries T1036 T1053.005 T1059.001 T1071.001 T1105 T1195.002 T1204.002 T1496 T1562.001 T1564.003

Brief

Why this hunt

0x0A Microsoft recently detailed a campaign in their report, Fake-download campaign uses trojanized installers to deliver monetization payloads. The adversary lures users with cracked software and activators to run trojanized Inno Setup installers. These installers stage and execute monetization payloads like proxyware or compute-resource miners. These components use business assets for adversary profit and degrade network performance. 0x0A 0x0A

How the hunt flows

0x0A The hunt begins by scoping the environment for initial access indicators using the hb_software_inventory surface. The first query searches for software packages with names like crack, activator, or unlocker. Identifying these lures helps narrow the hunt to hosts where users are most likely to have executed deceptive installers. This targeted approach reduces the volume of data processed in later stages. 0x0A 0x0A Next, the hunt examines process activity for Inno Setup runner patterns on the hb_process_activity surface. One query looks for specific command-line arguments like /SL5 or /spawnwnd that characterize the Inno Setup wrapper. Simultaneously, a second query stack-counts processes executing from Inno-specific temporary directories. This identifies rare, numbered binaries such as eld0.exe or eld1.exe that stand out from legitimate system installers. 0x0A 0x0A The third phase identifies the monetization and persistence phase. The hunt queries the hb_dns_activity surface for resolutions to known offer-tracking and C2 domains listed in the threat intelligence. It also inspects the hb_scheduled_job surface for tasks related to WorldProxyPool, CharityEngine, or BOINC. Finding these persistent tasks confirms that the installer successfully deployed its payload and established a persistent presence on the host. 0x0A 0x0A Finally, an analyst triages the collected evidence. The hunt correlates the staging verdict with the network and persistence indicators. This triage process links the initial execution of the trojanized installer to the subsequent monetization activity. An analyst reviews the host-level evidence to confirm the infection chain before proceeding to containment. If the host shows both staging behavior and persistent monetization tasks, the analyst triggers isolation. 0x0A 0x0A

What the hunt cannot see

0x0A The hunt has two primary blind spots. If DNS logs only capture activity from a central resolver without client IP attribution, the hunt cannot link a tracking callback to a specific host. Additionally, if the HTTP telemetry truncates URL query parameters, the analyst loses the d=inno parameter used for campaign attribution. These visibility gaps mean that absence of network evidence is not proof of a clean host. 0x0A 0x0A

Steps

  1. Scope to hosts with software lures

    Query · scoping

    Identify hosts running software packages commonly used as lures for this campaign, such as cracked tools, activators, or game-related executors.

    reads hb_software_inventorysql
    SELECT device_hostname, package_name, package_version FROM hb_software_inventory WHERE (LOWER(package_name) LIKE '%crack%' OR LOWER(package_name) LIKE '%activator%' OR LOWER(package_name) LIKE '%unlocker%' OR LOWER(package_name) LIKE '%roblox%') AND asset_scope = 'endpoint'

    What a hit looks like. A list of hosts containing suspicious software. Silence means no such software is indexed, but the hunt should still proceed unscoped if the analyst chooses.

  2. Inno runner execution patterns

    Query · detection candidate

    Identify processes executing from the Inno temporary directory or using characteristic wrapper arguments like /SL5.

    reads hb_process_activitysql
    SELECT device_hostname, process_path, process_cmd_line, parent_process_name, time FROM hb_process_activity WHERE (LOWER(process_path) LIKE '%\temp\is-%.tmp\%' OR LOWER(process_cmd_line) LIKE '%/sl5=%' OR LOWER(process_cmd_line) LIKE '%/spawnwnd=%' OR LOWER(process_cmd_line) LIKE '%/firstwnd=%') AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0)

    What a hit looks like. Process rows showing the Inno runner staging environment. The parent may be the original lure filename.

  3. Prevalence of temporary runner names

    Query · baseline

    Stack-count processes running from the Inno temp path so rare numbered stages like eld0.exe stand out from legitimate updaters.

    reads hb_process_activitysql
    SELECT LOWER(process_name) AS p_name, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_process_activity WHERE LOWER(process_path) LIKE '%\temp\is-%.tmp\%' AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) GROUP BY 1 HAVING host_count <= 5 ORDER BY host_count ASC

    What a hit looks like. A binary name seen on very few hosts (e.g., eld1.exe); common installer names are ignored.

  4. Triage early staging activity

    Agent triage

    Determine whether the process execution and prevalence patterns indicate a trojanized Inno Setup installer session.

  5. DNS callbacks to tracking domains

    Query · enrichment

    Match the report's offer-tracking domains to DNS activity on the host.

    reads hb_dns_activitysql
    SELECT device_hostname, query_hostname, process_name, time FROM hb_dns_activity WHERE instr(',' || '{{c2_domains}}' || ',', ',' || LOWER(query_hostname) || ',') > 0 AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0)

    What a hit looks like. Any row links a host to a known campaign tracking domain. Silence is common as domains rotate.

  6. Monetization task persistence

    Query · triage

    Find scheduled tasks associated with WorldProxyPool, CharityEngine, or BOINC installed by the campaign.

    reads hb_scheduled_jobsql
    SELECT device_hostname, job_name, job_cmd_line, job_user_name, time FROM hb_scheduled_job WHERE (LOWER(job_name) LIKE '%worldproxypool%' OR LOWER(job_name) LIKE '%charityengine%' OR LOWER(job_name) LIKE '%boinc%') AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0)

    What a hit looks like. Hosts with monetization tasks. WorldProxyPoolAgent is the high-confidence indicator.

  7. Confirm monetization payload installation

    Agent triage

    Correlate the staging verdict with the network and persistence evidence to confirm a complete infection chain.

  8. Route based on monetization verdict

    Decision

    Direct the hunt to containment for malicious hosts or review for suspicious ones.

  9. Isolate compromised host

    Response action

    Prevent further monetization activity and resource theft from the confirmed beachhead.

  10. Remediation and analyst review

    Analyst task

    Verify the isolation and coordinate the removal of monetization persistence.

  11. Close-out report

    Analyst task

    Finalize the hunt and document findings and gaps.

Coverage

Scenario coverage

StageCoveredHow, or why not
Deceptive download lures
T1195.002 · T1204.002
Yes scope-hosts-with-lures
Inno Setup runner staging
T1059.001 · T1036
Yes inno-staging-activity, rare-temporary-runners
Offer execution callback
T1071.001 · T1105
Yes tracking-callbacks
Monetization payload installation
T1053.005 · T1496 · T1564.003 · T1562.001
Yes monetization-persistence

Blind spots

  • Needs hb_dns_activity with host-to-IP attribution. If DNS logs only capture the resolver's traffic without the client's internal IP, the infected host cannot be identified directly from network telemetry. It would answer Which specific host resolved the campaign tracking domain?.
  • Needs hb_http_activity with url_query retention. The campaign relies on HTTP query parameters for attribution; if proxy logs truncate the URL after the path, the offer-execution signal is lost. It would answer Was the 'd=inno' parameter present in the tracking callback?.

Parameters & data

Parameters

ParameterTypeDefaultWhat it is
c2_domainslist[domain]offerloader.da, orbittrack.cfd, prairielink.cfd, willowbox.xyz, stonestation.cfd, foldlodge.xyz, friendsanchor.xyz, fallport.cfd, wishcourt.cfd, cratebase.cfdOffer-tracking and callback domains identified in the report.
lookback_daysnumber14Days of history to examine.
scope_hostslist[host]—Specific hosts to narrow the hunt; leave empty to scan the full estate.

Telemetry

SourceCategoryTelemetry
Endpoint telemetry (hb_ surfaces)endpointendpoint

Source

Download hunt.md Definition (JSON) An open hunt.md file; it runs anywhere that reads the format.
---
analysis: A simple rule may fire on the task name, but this hunt correlates the initial
  staging behavior, the rare temporary executables, and the network callbacks into
  a two-phase assessment that confirms the infection chain.
blind_spots:
- id: no-dns-attribution
  question: Which specific host resolved the campaign tracking domain?
  requires: hb_dns_activity with host-to-IP attribution
  risk: If DNS logs only capture the resolver's traffic without the client's internal
    IP, the infected host cannot be identified directly from network telemetry.
  stage: c2-offer-callback
- id: http-query-truncation
  question: Was the 'd=inno' parameter present in the tracking callback?
  requires: hb_http_activity with url_query retention
  risk: The campaign relies on HTTP query parameters for attribution; if proxy logs
    truncate the URL after the path, the offer-execution signal is lost.
  stage: c2-offer-callback
coverage:
- stage: initial-access-deceptive-lures
  status: covered
  steps:
  - scope-hosts-with-lures
- stage: execution-inno-runner-staging
  status: covered
  steps:
  - inno-staging-activity
  - rare-temporary-runners
- stage: c2-offer-callback
  status: covered
  steps:
  - tracking-callbacks
- stage: persistence-monetization-payloads
  status: covered
  steps:
  - monetization-persistence
guardrails:
  claims: no_unsupported
  evidence: citation_required
  missing_data: not_benign
  telemetry: untrusted
hunt:
  applicability: campaign-specific
  handoff: promote-to-detection
  justification: Silent proxyware and compute-resource theft expose an organization
    to unauthorized network traffic and resource degradation; identifying and clearing
    these persistent tasks is necessary to stop the ongoing monetization of business
    assets.
  methodology: model-assisted
  trigger: intel-report
hypothesis: An adversary has delivered monetization payloads using a trojanized Inno
  Setup installer that stages numbered executables in temporary paths, contacts offer-tracking
  infrastructure, and establishes persistence via SYSTEM-level scheduled tasks.
labels:
- hunt
- attack.t1036
- attack.t1053.005
- attack.t1059.001
- attack.t1071.001
- attack.t1105
- attack.t1195.002
- attack.t1204.002
- attack.t1496
- attack.t1562.001
- attack.t1564.003
- command and control
- execution
- initial access
- persistence
name: Trojanized Inno Installer Staging and Callbacks
parameters:
  c2_domains:
    default:
    - offerloader.da
    - orbittrack.cfd
    - prairielink.cfd
    - willowbox.xyz
    - stonestation.cfd
    - foldlodge.xyz
    - friendsanchor.xyz
    - fallport.cfd
    - wishcourt.cfd
    - cratebase.cfd
    description: Offer-tracking and callback domains identified in the report.
    from:
      kind: article
      observed: '2026-11-03'
      ref: msrc-blog-20261103
    type: list[domain]
  lookback_days:
    default: '14'
    description: Days of history to examine.
    type: number
  scope_hosts:
    default: []
    description: Specific hosts to narrow the hunt; leave empty to scan the full estate.
    type: list[host]
provenance:
  authors:
  - name: Huntbase hunt generation
    org: huntbase.io
  generated:
    by: huntbase-hunt-generation
    from: https://www.microsoft.com/en-us/security/blog/2026/11/03/fake-download-campaign-uses-trojanized-installers-deliver-monetization-payloads/
    gates:
    - dry-run
    - lint
    model: hb_google/gemini-3-flash-preview
rationale: Focus on user workstations where software inventory shows activators or
  cracked tools. If these are not present, expand to the whole estate filtering for
  Inno-specific temp paths.
references:
- name: "Microsoft Security Blog \u2014 Fake-download campaign uses trojanized installers\
    \ to deliver monetization payloads"
  url: https://www.microsoft.com/en-us/security/blog/2026/11/03/fake-download-campaign-uses-trojanized-installers-deliver-monetization-payloads/
related:
- hunt: proxyware-resource-theft
  reason: This hunt focuses on the Inno Setup delivery mechanism; a broader hunt would
    look for any proxyware installation regardless of the original lure.
  relation: out-of-scope-alternative
scenario:
  stages:
  - name: Deceptive download lures
    observables:
    - Echo Client.exe
    - FabFilter Total Bundle.exe
    - Navicat Premium crack.exe
    - auto-clicker.exe
    - clownfishvoicechanger.exe
    slug: initial-access-deceptive-lures
    tactic: initial-access
    techniques:
    - T1195.002
    - T1204.002
  - name: Inno Setup runner staging
    observables:
    - '%TEMP%\is-*.tmp\'
    - eld0.exe
    - eld1.exe
    - eld5.exe
    - set_*.exe
    - /SL5=
    - /SPAWNWND=
    - /FIRSTWND=
    slug: execution-inno-runner-staging
    tactic: execution
    techniques:
    - T1059.001
    - T1036
  - name: Offer execution callback
    observables:
    - d=inno
    - r=offer_execution
    - r=offer_execution_fail
    - orbittrack.cfd
    - prairielink.cfd
    - willowbox.xyz
    - stonestation.cfd
    - foldlodge.xyz
    - friendsanchor.xyz
    - fallport.cfd
    - wishcourt.cfd
    - cratebase.cfd
    - beliefdesk.xyz
    - companyharbor.xyz
    - signalpane.cfd
    - inkact.xyz
    - wishgrove.cfd
    slug: c2-offer-callback
    tactic: command-and-control
    techniques:
    - T1071.001
    - T1105
  - name: Monetization payload installation
    observables:
    - C:\Program Files\WorldProxyPool\sdk-agent.exe
    - WorldProxyPoolAgent
    - WorldProxyPoolWatchdog
    - WorldProxyPoolUpdater
    - CharityEngine
    - Berkeley Open Infrastructure for Network Computing
    - Advanced Windows Manager
    - Windows Manager
    slug: persistence-monetization-payloads
    tactic: persistence
    techniques:
    - T1053.005
    - T1496
    - T1564.003
    - T1562.001
  summary: A campaign using trojanized Inno Setup installers delivered via fake software
    downloads to install various monetization payloads such as proxyware, distributed
    computing agents, and adware. The campaign utilizes a structured HTTP callback
    system to track offer installation status and secures persistence through SYSTEM-level
    scheduled tasks.
severity: high
targets:
  analyst:
    name: Tier-2 analyst
    role: analyst
  endpoint:
    category: endpoint
    name: Endpoint telemetry (hb_ surfaces)
    telemetry:
    - endpoint
  hunter:
    agent: true
    name: Hunt agent
tlp: clear
type: investigation
---


# Trojanized Inno Installer Staging and Callbacks

This hunt identifies the multi-stage execution and persistence model used by a fake-download campaign. The campaign lures users with cracked software and activators to run Inno Setup-style wrappers. These wrappers stage numbered payloads in the user's temp directory and contact rotating infrastructure to report offer outcomes. Finally, the campaign installs monetization components like proxyware or compute-resource miners, often persistent through SYSTEM-level scheduled tasks. The hunt follows these stages in two phases: first identifying the temporary staging activity and then corroborating it with the network callbacks and persistence mechanisms.

## scope-hosts-with-lures
<!-- Scope to hosts with software lures -->
Identify hosts running software packages commonly used as lures for this campaign, such as cracked tools, activators, or game-related executors.

```sqlite target=endpoint role=scoping
~~~yaml
expected: A list of hosts containing suspicious software. Silence means no such software
  is indexed, but the hunt should still proceed unscoped if the analyst chooses.
reads:
- asset_scope
- device_hostname
- package_name
- package_version
silence: not_evidence_of_absence
source: hb_software_inventory
verified: dry-run
verified_at: '2026-11-04'
~~~
SELECT device_hostname, package_name, package_version FROM hb_software_inventory WHERE (LOWER(package_name) LIKE '%crack%' OR LOWER(package_name) LIKE '%activator%' OR LOWER(package_name) LIKE '%unlocker%' OR LOWER(package_name) LIKE '%roblox%') AND asset_scope = 'endpoint'
```

## early-stage-fan-out
<!-- Early staging search -->
parallel:
- → inno-staging-activity
- → rare-temporary-runners
join: → triage-early-staging

## inno-staging-activity
<!-- Inno runner execution patterns -->
Identify processes executing from the Inno temporary directory or using characteristic wrapper arguments like /SL5.

```sqlite target=endpoint role=detection-candidate params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
expected: Process rows showing the Inno runner staging environment. The parent may
  be the original lure filename.
reads:
- device_hostname
- parent_process_name
- process_cmd_line
- process_path
- time
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-11-04'
~~~
SELECT device_hostname, process_path, process_cmd_line, parent_process_name, time FROM hb_process_activity WHERE (LOWER(process_path) LIKE '%\temp\is-%.tmp\%' OR LOWER(process_cmd_line) LIKE '%/sl5=%' OR LOWER(process_cmd_line) LIKE '%/spawnwnd=%' OR LOWER(process_cmd_line) LIKE '%/firstwnd=%') AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0)
```

## rare-temporary-runners
<!-- Prevalence of temporary runner names -->
Stack-count processes running from the Inno temp path so rare numbered stages like eld0.exe stand out from legitimate updaters.

```sqlite target=endpoint role=baseline params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
baseline:
  compare: first_seen
  window: '{{lookback_days}}d'
expected: A binary name seen on very few hosts (e.g., eld1.exe); common installer
  names are ignored.
prevalence:
  by: device_hostname
  key:
  - process_name
  rare_below: 5
reads:
- device_hostname
- process_name
- process_path
- time
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-11-04'
~~~
SELECT LOWER(process_name) AS p_name, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_process_activity WHERE LOWER(process_path) LIKE '%\temp\is-%.tmp\%' AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) GROUP BY 1 HAVING host_count <= 5 ORDER BY host_count ASC
```

## triage-early-staging
<!-- Triage early staging activity -->
```agent target=hunter
cite: required
context:
- inno-staging-activity
- rare-temporary-runners
max_iterations: 3
objective: Identify hosts showing Inno Setup runner activity based on temp paths and
  rare numbered process names.
success_criteria: A verdict of suspicious if rare processes execute from the Inno
  temp path with /SL5 arguments.
tools:
- endpoint
```

## follow-on-fan-out
<!-- Search for follow-on activity -->
parallel:
- → tracking-callbacks
- → monetization-persistence
join: → final-monetization-triage

## tracking-callbacks
<!-- DNS callbacks to tracking domains -->
Match the report's offer-tracking domains to DNS activity on the host.

```sqlite target=endpoint role=enrichment params=(c2_domains=c2_domains, lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
expected: Any row links a host to a known campaign tracking domain. Silence is common
  as domains rotate.
reads:
- device_hostname
- process_name
- query_hostname
- time
silence: not_evidence_of_absence
source: hb_dns_activity
verified: dry-run
verified_at: '2026-11-04'
~~~
SELECT device_hostname, query_hostname, process_name, time FROM hb_dns_activity WHERE instr(',' || '{{c2_domains}}' || ',', ',' || LOWER(query_hostname) || ',') > 0 AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0)
```

## monetization-persistence
<!-- Monetization task persistence -->
Find scheduled tasks associated with WorldProxyPool, CharityEngine, or BOINC installed by the campaign.

```sqlite target=endpoint role=triage params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
expected: Hosts with monetization tasks. WorldProxyPoolAgent is the high-confidence
  indicator.
reads:
- device_hostname
- job_cmd_line
- job_name
- job_user_name
- time
silence: not_evidence_of_absence
source: hb_scheduled_job
verified: dry-run
verified_at: '2026-11-04'
~~~
SELECT device_hostname, job_name, job_cmd_line, job_user_name, time FROM hb_scheduled_job WHERE (LOWER(job_name) LIKE '%worldproxypool%' OR LOWER(job_name) LIKE '%charityengine%' OR LOWER(job_name) LIKE '%boinc%') AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0)
```

## final-monetization-triage
<!-- Confirm monetization payload installation -->
```agent target=hunter
cite: required
context:
- triage-early-staging
- tracking-callbacks
- monetization-persistence
max_iterations: 3
objective: Confirm whether the host has been compromised by the fake-download campaign
  by linking the Inno staging activity to follow-on callbacks and monetization tasks.
success_criteria: A verdict of malicious for hosts showing both staging activity and
  either persistent tasks or DNS callbacks.
tools:
- endpoint
```

## route-on-verdict
<!-- Route based on monetization verdict -->
if~: "the final-monetization-triage verdict is malicious for at least one host" (confidence: high, judge=hunter)
then: → isolate-host
indeterminate: → remediation-review
unavailable: → remediation-review (blind_spot: no-dns-attribution)
else: → close-out-report

## isolate-host
<!-- Isolate compromised host -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the host to prevent proxyware traffic and compute monetization. Collect temporary files and task XML for forensic capture.
```
→ remediation-review

## remediation-review
<!-- Remediation and analyst review -->
```manual target=analyst
Review the rows cited by the agents. Confirm the removal of the WorldProxyPool or CharityEngine tasks and their associated binaries from Program Files. Scan for other PUA components that may have been bundled.
```
→ close-out-report

## close-out-report
<!-- Close-out report -->
```manual target=analyst
Summarize the number of hosts identified and the specific monetization branches found. Note any blind spots in DNS or HTTP telemetry encountered during the hunt.
```
→ end

Run it

Take this hunt into your environment.

Open it in Huntbase to run every step against your own connections, with Scout weighing the evidence and your analysts in command. Or take the open hunt.md file anywhere that reads the format.

Machine-drafted by huntbase-hunt-generation using hb_google/gemini-3-flash-preview, gated by dry-run, lint, then reviewed by a person.

Locked pack

Sign up to unlock

Pack contents are available to Huntbase users.