PureCrypter evasion and Mallox ransomware execution
An intruder is executing the PureCrypter loader on a compromised SQL server, performing heavy environment checks and establishing user-profile persistence before deploying the Mallox ransomware payload.
Based on research by Sekoia 2026-09-17 11 steps · 5 queries T1047 T1129 T1486 T1497.001 T1547.001 T1562.001
Brief
Recent research from Sekoia.io titled "Mallox ransomware affiliate leverages PureCrypter in MSSQL exploitation" highlights a shift in how these affiliates maintain access and deploy payloads. While many detections focus on the final ransomware binary, this hunt targets the PureCrypter loader's behavioral chain. This loader is particularly noisy in its environment checks, making it an ideal candidate for behavioral hunting on compromised SQL servers.
How the Hunt Flows
The hunt begins by scoping the environment to identify systems running Microsoft SQL Server. This focuses the telemetry gathering on high-value targets, though the parameters allow for a fleet-wide search if lateral movement is suspected beyond the initial entry point.
Next, the hunt gathers evidence from four distinct surfaces simultaneously. It looks for process activity related to WMI queries for hardware identifiers (Win32_BIOS) and the specific list of sandbox-evasion usernames used by PureCrypter. This is often accompanied by network resets (ipconfig release/renew) used to complicate automated analysis.
For persistence, we examine registry activity. The hunt specifically targets the Windows Run keys where the loader points to binaries residing in user-writable paths like AppData. This is a common pivot point because legitimate applications rarely use these paths for auto-start entries on a server.
We also monitor script activity for Windows Defender tampering. The loader frequently uses PowerShell to add its own path or the payload path to the Defender exclusion list. Identifying these Add-MpPreference commands provides high-confidence evidence of an attempt to suppress endpoint security alerts.
Finally, we stack-count rare executables running from the AppData directory. By filtering for binaries seen on only a few hosts, we can isolate the Mallox ransomware payload (e.g., Ydxhjxwf.exe) even if the filename has been rotated since the source article's publication.
What This Hunt Cannot See
There are two primary blind spots to consider. First, if the threat actor uses a non-PowerShell interpreter (like an obfuscated VBScript) to set Defender exclusions without equivalent script block logging, that specific step will be silent. Second, since PureCrypter often employs reflective loading to transition between stages in memory, the initial file-based execution may be the only visible process event before the final ransomware begins its encryption routine.
In this series
Steps
-
Identify candidate SQL servers
Query · scopingFocus the hunt on hosts with Microsoft SQL Server installed, as they are the primary targets of this campaign.
reads hb_software_inventorysqlSELECT DISTINCT device_hostname FROM hb_software_inventory WHERE (LOWER(package_name) LIKE '%sql%server%' OR LOWER(vendor_name) LIKE '%microsoft%') AND asset_scope = 'endpoint'What a hit looks like. A list of hostnames likely hosting SQL Server. If empty, the hunt runs across the full estate.
-
Anti-analysis behavior and WMI checks
Query · detection candidateFind process execution matching the loader's environment checks (WMI for BIOS/System) and the specific usernames it exits for.
reads hb_process_activitysqlSELECT device_hostname, process_cmd_line, user_name, time FROM hb_process_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(process_cmd_line) LIKE '%win32_bios%' OR LOWER(process_cmd_line) LIKE '%win32_computersystem%' OR instr(',' || '{{malicious_usernames}}' || ',', ',' || LOWER(user_name) || ',') > 0 OR LOWER(process_cmd_line) LIKE '%ipconfig%renew%' OR LOWER(process_cmd_line) LIKE '%ipconfig%release%') AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. Processes querying hardware identifiers or matching a known sandbox username. Finding BIOS/System WMI queries paired with ipconfig resets is highly indicative.
-
Persistence in user Run key
Query · enrichmentIdentify the registry entry established by the loader to ensure survival after reboots.
reads hb_registry_activitysqlSELECT device_hostname, reg_target, reg_value_data, time FROM hb_registry_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND LOWER(reg_target) LIKE '%software\microsoft\windows\currentversion\run%' AND (LOWER(reg_value_data) LIKE '%\appdata\local\%' OR LOWER(reg_value_data) LIKE '%\appdata\roaming\%') AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. A Run key pointing to a binary in a user-writable path. Normal applications usually install to Program Files.
-
Windows Defender exclusion activity
Query · enrichmentFind the PowerShell commands used to suppress Defender alerts for the ransomware binary.
reads hb_script_activitysqlSELECT device_hostname, script_content, actor_user_name, time FROM hb_script_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(script_content) LIKE '%mppreference%' AND LOWER(script_content) LIKE '%-exclusion%') AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. Script blocks adding the loader or payload path to MpPreference exclusions.
-
Rare executables in user profile paths
Query · baselineStack-count processes running from AppData to highlight the Mallox binary against fleet background noise.
reads hb_process_activitysqlSELECT LOWER(process_path) as path, COUNT(DISTINCT device_hostname) as hosts, COUNT(*) as runs, MIN(time) as first_seen FROM hb_process_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(process_name) = LOWER('{{mallox_filename}}') OR (LOWER(process_path) LIKE '%\appdata\%' AND LOWER(process_path) LIKE '%.exe')) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY 1 HAVING hosts <= 3 ORDER BY hosts ASCWhat a hit looks like. Binaries seen on only one or two hosts, specifically matching the reported Mallox filename or running from unusual AppData subdirectories.
-
Triaging PureCrypter and Mallox presence
Agent triageAnalyze the correlation between anti-analysis behavior, persistence mechanisms, and rare binary execution.
-
Route based on verdict
DecisionDecide whether to isolate the host or move to analyst review.
-
Isolate host
Response actionPrevent further spread of ransomware by isolating the affected host.
-
Analyst confirmation and tuning
Analyst taskConduct a manual review of the agent's findings to confirm the intrusion and tune future detections.
-
Close out hunt
Analyst taskFinalize the hunt when no malicious activity is identified.
Coverage
Scenario coverage
| Stage | Covered | How, or why not |
|---|---|---|
| PureCrypter Anti-Analysis and Evasion T1497.001 · T1562.001 · T1129 |
Yes | purecrypter-evasion-checks, defender-exclusion-tampering |
| Registry Run Key Persistence T1547.001 |
Yes | run-key-persistence |
| Mallox Ransomware Execution T1486 |
Yes | rare-profile-binaries |
| MS-SQL Brute Force T1110 · T1190 |
Out of scope | Belongs to another part of the 'Mallox ransomware affiliate leverages PureCrypter in MSSQL exploitation' series. |
| MS-SQL Feature Exploitation T1059.003 |
Out of scope | Belongs to another part of the 'Mallox ransomware affiliate leverages PureCrypter in MSSQL exploitation' series. |
| PowerShell Downloader and WMIC Execution T1059.001 · T1047 |
Out of scope | Belongs to another part of the 'Mallox ransomware affiliate leverages PureCrypter in MSSQL exploitation' series. |
Blind spots
- Needs hb_script_activity for non-PowerShell interpreters. PureCrypter commonly uses PowerShell, but if a variant uses a different interpreter without script block logging, the Defender exclusion step will be silent. It would answer Was the exclusion or payload download performed via an obfuscated VBScript or JScript?.
- Needs hb_module_activity. Since reflective loading occurs in memory, file activity will not capture the transition. We rely on process monitoring of the initial loader and the prevalence of the resulting process. It would answer Can we see the reflective loading of the stage 2 DLL or the final payload?.
Parameters & data
Parameters
| Parameter | Type | Default | What it is |
|---|---|---|---|
lookback_days | number | 14 | Days of history to examine. |
malicious_usernames | list[string] | john, anna, xxxxxxxx | Usernames checked by PureCrypter as part of anti-analysis; finding these in activity may indicate an evasion attempt. |
mallox_filename | string | Ydxhjxwf.exe | The specific ransomware filename observed in the report. |
scope_hosts | list[host] | — | Optional list of hostnames to scope the hunt (e.g., confirmed MSSQL servers). |
Telemetry
| Source | Category | Telemetry |
|---|---|---|
| Endpoint telemetry (hb_ surfaces) | endpoint | endpoint |
Source
---
analysis: "While static rules might alert on 'Ydxhjxwf.exe', they are easily bypassed.\
\ This hunt looks for the loader's immutable logic\u2014WMI hardware queries, specific\
\ sandbox-evasion usernames, and stack-counted rare binaries in profile paths\u2014\
correlating three distinct surfaces into one high-fidelity verdict."
blind_spots:
- id: missing-script-telemetry
question: Was the exclusion or payload download performed via an obfuscated VBScript
or JScript?
requires: hb_script_activity for non-PowerShell interpreters
risk: PureCrypter commonly uses PowerShell, but if a variant uses a different interpreter
without script block logging, the Defender exclusion step will be silent.
stage: loader-evasion-and-anti-analysis
- id: reflective-loading-blindspot
question: Can we see the reflective loading of the stage 2 DLL or the final payload?
requires: hb_module_activity
risk: Since reflective loading occurs in memory, file activity will not capture
the transition. We rely on process monitoring of the initial loader and the prevalence
of the resulting process.
stage: mallox-ransomware-execution
coverage:
- stage: loader-evasion-and-anti-analysis
status: covered
steps:
- purecrypter-evasion-checks
- defender-exclusion-tampering
- stage: persistence-run-key
status: covered
steps:
- run-key-persistence
- stage: mallox-ransomware-execution
status: covered
steps:
- rare-profile-binaries
- reason: Belongs to another part of the 'Mallox ransomware affiliate leverages PureCrypter
in MSSQL exploitation' series.
stage: sql-brute-force-access
status: out_of_scope
- reason: Belongs to another part of the 'Mallox ransomware affiliate leverages PureCrypter
in MSSQL exploitation' series.
stage: sql-server-exploitation
status: out_of_scope
- reason: Belongs to another part of the 'Mallox ransomware affiliate leverages PureCrypter
in MSSQL exploitation' series.
stage: initial-payload-delivery
status: out_of_scope
guardrails:
claims: no_unsupported
evidence: citation_required
missing_data: not_benign
telemetry: untrusted
hunt:
applicability: campaign-specific
handoff: promote-to-detection
justification: Mallox ransomware affiliates target database infrastructure to maximize
leverage for extortion. Detecting the PureCrypter loader's heavy anti-analysis
logic and persistence allows intervention before the destructive encryption phase
begins.
methodology: model-assisted
trigger: intel-report
hypothesis: An intruder is executing the PureCrypter loader on a compromised SQL server,
performing heavy environment checks and establishing user-profile persistence before
deploying the Mallox ransomware payload.
labels:
- hunt
- attack.t1497.001
- attack.t1562.001
- attack.t1129
- attack.t1547.001
- attack.t1486
- attack.t1047
name: PureCrypter evasion and Mallox ransomware execution
parameters:
lookback_days:
default: '14'
description: Days of history to examine.
type: number
malicious_usernames:
default:
- john
- anna
- xxxxxxxx
description: Usernames checked by PureCrypter as part of anti-analysis; finding
these in activity may indicate an evasion attempt.
from:
kind: article
observed: '2024-05-02'
ref: https://blog.sekoia.io/mallox-ransomware-affiliate-leverages-purecrypter-in-microsoft-sql-exploitation-campaigns/
type: list[string]
mallox_filename:
default: Ydxhjxwf.exe
description: The specific ransomware filename observed in the report.
from:
kind: article
observed: '2024-05-02'
ref: https://blog.sekoia.io/mallox-ransomware-affiliate-leverages-purecrypter-in-microsoft-sql-exploitation-campaigns/
type: string
scope_hosts:
default: []
description: Optional list of hostnames to scope the hunt (e.g., confirmed MSSQL
servers).
type: list[host]
provenance:
authors:
- name: Huntbase hunt generation
org: huntbase.io
generated:
by: huntbase-hunt-generation
from: https://blog.sekoia.io/mallox-ransomware-affiliate-leverages-purecrypter-in-microsoft-sql-exploitation-campaigns/
gates:
- dry-run
- lint
- critic
model: hb_google/gemini-3-flash-preview
rationale: Focus on high-value assets running SQL Server. The software inventory scoping
step narrows the hunt to these servers, but leaving the scope_hosts parameter empty
allows for a fleet-wide search if lateral movement is suspected.
references:
- name: Mallox ransomware affiliate leverages PureCrypter in MSSQL exploitation
url: https://blog.sekoia.io/mallox-ransomware-affiliate-leverages-purecrypter-in-microsoft-sql-exploitation-campaigns/
related:
- hunt: mssql-bruteforce-and-exploitation
reason: This hunt picks up after the exploitation of the SQL server to deploy the
loader.
relation: follows
- hunt: mallox-mssql-exploitation-initial-delivery
relation: follows
scenario:
stages:
- name: MS-SQL Brute Force
observables:
- Brute-force attempts against 'sa' account
- Source IP address in AS208091 (XHost Internet Solution)
- Approximately 320 authentication attempts per minute
- Targeting MS-SQL port (1433)
slug: sql-brute-force-access
tactic: initial-access
techniques:
- T1110
- T1190
- name: MS-SQL Feature Exploitation
observables:
- Enabling 'TRUSTWORTHY' database parameter
- Enabling 'clr enabled' parameter
- Creating assembly named 'shell' (SqlShell DLL)
- Creating stored procedure 'cmd_exec'
- Enabling 'xp_cmdshell' configuration
- Enabling 'Ole Automation Procedures'
- Use of 'sp_oacreate' to create 'wscript.shell' OLE object
- Application name 'vYMiFrYR' in SQL connection logs
slug: sql-server-exploitation
tactic: execution
techniques:
- T1059.003
- name: PowerShell Downloader and WMIC Execution
observables:
- echo and redirect used to create PowerShell script
- PowerShell script saved to C:\ProgramData
- WMIC used to execute downloaded binary
- Downloading multimedia-themed files (e.g., .mp4, .wav, .pdf) containing encrypted
payloads
slug: initial-payload-delivery
tactic: execution
techniques:
- T1059.001
- T1047
- name: PureCrypter Anti-Analysis and Evasion
observables:
- WMI query 'select * from Win32_BIOS' to check for VMWare, Virtual, AMI, or Xen
- WMI query 'select * from Win32_ComputerSystem' to check for Microsoft or VMWare
- Process search for 'SbieDll.dll'
- Monitor size check for 1440x900
- Username check for 'john', 'anna', or 'xxxxxxxx'
- Execution of 'ipconfig /renew' and 'ipconfig /release' for network testing
- Patching 'EtwEventWrite' and 'AmsiScanBuffer' in memory
- Adding Windows Defender exclusions via 'MpPreference -Exclusion'
slug: loader-evasion-and-anti-analysis
tactic: defense-evasion
techniques:
- T1497.001
- T1562.001
- T1129
- name: Registry Run Key Persistence
observables:
- Registry key addition in 'Software\Microsoft\Windows\CurrentVersion\Run\'
slug: persistence-run-key
tactic: persistence
techniques:
- T1547.001
- name: Mallox Ransomware Execution
observables:
- Ransomware executable named 'Ydxhjxwf.exe' in %appdata%
- Reflective code loading of stage 2 DLL
- Elevation of process privileges with 'SeDebugPrivilege'
slug: mallox-ransomware-execution
tactic: impact
techniques:
- T1486
summary: An affiliate of Mallox ransomware targets internet-facing MS-SQL servers
using brute-force attacks against the 'sa' account. Upon gaining access, the attacker
exploits SQL features such as CLR assemblies and xp_cmdshell to deliver PureCrypter,
a .NET loader that employs extensive anti-analysis and evasion techniques before
executing the final Mallox ransomware payload.
series:
index: 2
slug: mallox-ransomware-affiliate-leverages-purecrypter-in-mssql-exploitation
title: Mallox ransomware affiliate leverages PureCrypter in MSSQL exploitation
total: 2
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
---
# PureCrypter evasion and Mallox ransomware execution
This hunt focuses on the behavioral indicators of the PureCrypter loader and the Mallox ransomware it drops. It identifies unique defense evasion techniques, such as WMI-based BIOS and manufacturer checks, screen size validation, and network resets. It then corroborates these with registry-based persistence in user profile Run keys and stack-counts rare binaries running from AppData. This multi-surface approach ensures visibility even if the final ransomware filenames rotate.
## scope-mssql-servers
<!-- Identify candidate SQL servers -->
Focus the hunt on hosts with Microsoft SQL Server installed, as they are the primary targets of this campaign.
```sqlite target=endpoint role=scoping
~~~yaml
expected: A list of hostnames likely hosting SQL Server. If empty, the hunt runs across
the full estate.
reads:
- device_hostname
- package_name
- vendor_name
- asset_scope
silence: not_evidence_of_absence
source: hb_software_inventory
verified: dry-run
verified_at: '2026-09-17'
~~~
SELECT DISTINCT device_hostname FROM hb_software_inventory WHERE (LOWER(package_name) LIKE '%sql%server%' OR LOWER(vendor_name) LIKE '%microsoft%') AND asset_scope = 'endpoint'
```
## parallel-telemetry-gathering
<!-- Gather multi-surface evidence -->
parallel:
- → purecrypter-evasion-checks
- → run-key-persistence
- → defender-exclusion-tampering
- → rare-profile-binaries
join: → triage-agent
## purecrypter-evasion-checks
<!-- Anti-analysis behavior and WMI checks -->
Find process execution matching the loader's environment checks (WMI for BIOS/System) and the specific usernames it exits for.
```sqlite target=endpoint role=detection-candidate params=(scope_hosts=scope_hosts, malicious_usernames=malicious_usernames, lookback_days=lookback_days)
~~~yaml
expected: Processes querying hardware identifiers or matching a known sandbox username.
Finding BIOS/System WMI queries paired with ipconfig resets is highly indicative.
reads:
- device_hostname
- process_cmd_line
- user_name
- time
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-09-17'
~~~
SELECT device_hostname, process_cmd_line, user_name, time FROM hb_process_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(process_cmd_line) LIKE '%win32_bios%' OR LOWER(process_cmd_line) LIKE '%win32_computersystem%' OR instr(',' || '{{malicious_usernames}}' || ',', ',' || LOWER(user_name) || ',') > 0 OR LOWER(process_cmd_line) LIKE '%ipconfig%renew%' OR LOWER(process_cmd_line) LIKE '%ipconfig%release%') AND time >= datetime('now', '-{{lookback_days}} days')
```
## run-key-persistence
<!-- Persistence in user Run key -->
Identify the registry entry established by the loader to ensure survival after reboots.
```sqlite target=endpoint role=enrichment params=(scope_hosts=scope_hosts, lookback_days=lookback_days)
~~~yaml
expected: A Run key pointing to a binary in a user-writable path. Normal applications
usually install to Program Files.
reads:
- device_hostname
- reg_target
- reg_value_data
- time
silence: not_evidence_of_absence
source: hb_registry_activity
verified: dry-run
verified_at: '2026-09-17'
~~~
SELECT device_hostname, reg_target, reg_value_data, time FROM hb_registry_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND LOWER(reg_target) LIKE '%software\microsoft\windows\currentversion\run%' AND (LOWER(reg_value_data) LIKE '%\appdata\local\%' OR LOWER(reg_value_data) LIKE '%\appdata\roaming\%') AND time >= datetime('now', '-{{lookback_days}} days')
```
## defender-exclusion-tampering
<!-- Windows Defender exclusion activity -->
Find the PowerShell commands used to suppress Defender alerts for the ransomware binary.
```sqlite target=endpoint role=enrichment params=(scope_hosts=scope_hosts, lookback_days=lookback_days)
~~~yaml
expected: Script blocks adding the loader or payload path to MpPreference exclusions.
reads:
- device_hostname
- script_content
- actor_user_name
- time
silence: not_evidence_of_absence
source: hb_script_activity
verified: dry-run
verified_at: '2026-09-17'
~~~
SELECT device_hostname, script_content, actor_user_name, time FROM hb_script_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(script_content) LIKE '%mppreference%' AND LOWER(script_content) LIKE '%-exclusion%') AND time >= datetime('now', '-{{lookback_days}} days')
```
## rare-profile-binaries
<!-- Rare executables in user profile paths -->
Stack-count processes running from AppData to highlight the Mallox binary against fleet background noise.
```sqlite target=endpoint role=baseline params=(scope_hosts=scope_hosts, mallox_filename=mallox_filename, lookback_days=lookback_days)
~~~yaml
baseline:
compare: first_seen
window: '{{lookback_days}}d'
expected: Binaries seen on only one or two hosts, specifically matching the reported
Mallox filename or running from unusual AppData subdirectories.
prevalence:
by: device_hostname
key:
- process_path
rare_below: 3
reads:
- process_path
- device_hostname
- time
- process_name
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-09-17'
~~~
SELECT LOWER(process_path) as path, COUNT(DISTINCT device_hostname) as hosts, COUNT(*) as runs, MIN(time) as first_seen FROM hb_process_activity WHERE ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND (LOWER(process_name) = LOWER('{{mallox_filename}}') OR (LOWER(process_path) LIKE '%\appdata\%' AND LOWER(process_path) LIKE '%.exe')) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY 1 HAVING hosts <= 3 ORDER BY hosts ASC
```
## triage-agent
<!-- Triaging PureCrypter and Mallox presence -->
```agent target=hunter
cite: required
context:
- purecrypter-evasion-checks
- run-key-persistence
- defender-exclusion-tampering
- rare-profile-binaries
max_iterations: 4
objective: 'Determine if any host exhibits the PureCrypter behavior chain: environment
sensing followed by persistence and execution of a rare binary in AppData.'
success_criteria: A detailed verdict citing process paths, registry keys, and specific
WMI queries.
tools:
- endpoint
```
## routing-decision
<!-- Route based on verdict -->
if~: "the triage verdict is malicious for at least one host and confirms ransomware execution indicators" (confidence: high, judge=hunter)
then: → isolate-host
indeterminate: → analyst-review
unavailable: → analyst-review (blind_spot: missing-script-telemetry)
else: → close-out
## isolate-host
<!-- Isolate host -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the host immediately via EDR/Identity control. Collect the rare binary from the identified AppData path for forensic analysis.
```
→ analyst-review
## analyst-review
<!-- Analyst confirmation and tuning -->
```manual target=analyst
Verify the rare process activity and check for signs of volume shadow copy deletion or mass file encryption on the identified hosts.
```
→ end
## close-out
<!-- Close out hunt -->
```manual target=analyst
Log the hosts examined and confirm no PureCrypter/Mallox indicators were found. Retain the scoping results for the next monthly run.
```
→ 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, critic, then reviewed by a person.