SYMBOLCOMMON_NAMEaka. SYNONYMS
win.spygrace (Back to overview)

SpyGrace

aka: SpyGlace

Actor(s): APT-C-60

VTCollection    

A backdoor, capable of providing shell access, loading additional payloads, interacting remotely with the file system and processes, and taking screenshots.

References
2024-12-11JPCERT/CCTomoya Kamei
Attack Exploiting Legitimate Service by APT-C-60
SpyGrace
2024-08-28ESET ResearchESET Research
ESET Research: Spy group exploits WPS Office zero day; analysis uncovers a second vulnerability
SpyGrace
2024-08-28ESET ResearchRomain Dumont
Analysis of two arbitrary code execution vulnerabilities affecting WPS Office
SpyGrace
2022-12-20ThreatBookThreatBook
Analysis of APT-C-60 Attack on South Korea
SpyGrace
Yara Rules
[TLP:WHITE] win_spygrace_auto (20260504 | Detects win.spygrace.)
rule win_spygrace_auto {

    meta:
        author = "Felix Bilstein - yara-signator at cocacoding dot com"
        date = "2026-05-04"
        version = "1"
        description = "Detects win.spygrace."
        info = "autogenerated rule brought to you by yara-signator"
        tool = "yara-signator v0.6.0"
        signator_config = "callsandjumps;datarefs;binvalue"
        malpedia_reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.spygrace"
        malpedia_rule_date = "20260422"
        malpedia_hash = "a182e35da64e6d71cb55f125c4d4225196523f14"
        malpedia_version = "20260504"
        malpedia_license = "CC BY-SA 4.0"
        malpedia_sharing = "TLP:WHITE"

    /* DISCLAIMER
     * The strings used in this rule have been automatically selected from the
     * disassembly of memory dumps and unpacked files, using YARA-Signator.
     * The code and documentation is published here:
     * https://github.com/fxb-cocacoding/yara-signator
     * As Malpedia is used as data source, please note that for a given
     * number of families, only single samples are documented.
     * This likely impacts the degree of generalization these rules will offer.
     * Take the described generation method also into consideration when you
     * apply the rules in your use cases and assign them confidence levels.
     */


    strings:
        $sequence_0 = { 488d8a30000000 e9???????? 488d8a90000000 e9???????? 488d8ae8000000 e9???????? 488d8aa8000000 }
            // n = 7, score = 100
            //   488d8a30000000       | dec                 eax
            //   e9????????           |                     
            //   488d8a90000000       | mov                 edx, dword ptr [esp + 0x60]
            //   e9????????           |                     
            //   488d8ae8000000       | dec                 eax
            //   e9????????           |                     
            //   488d8aa8000000       | cmp                 edx, 0x10

        $sequence_1 = { eb1e 488bc3 498784f640380600 4885c0 7409 488bcb ff15???????? }
            // n = 7, score = 100
            //   eb1e                 | jmp                 0xda
            //   488bc3               | dec                 esp
            //   498784f640380600     | mov                 ecx, dword ptr [esp + 0x58]
            //   4885c0               | mov                 edx, 3
            //   7409                 | dec                 esp
            //   488bcb               | mov                 eax, dword ptr [esp + 0x50]
            //   ff15????????         |                     

        $sequence_2 = { 7203 488b12 488bcb e8???????? 488d93c0020000 48396a18 7203 }
            // n = 7, score = 100
            //   7203                 | inc                 cx
            //   488b12               | test                edx, eax
            //   488bcb               | je                  0xab8
            //   e8????????           |                     
            //   488d93c0020000       | sub                 ax, 0x57
            //   48396a18             | inc                 cx
            //   7203                 | test                edx, eax

        $sequence_3 = { c645df00 488b5517 4883fa10 722e 48ffc2 488b4dff 488bc1 }
            // n = 7, score = 100
            //   c645df00             | ret                 
            //   488b5517             | dec                 eax
            //   4883fa10             | mov                 dword ptr [esp + 0x20], ebx
            //   722e                 | push                ebp
            //   48ffc2               | push                esi
            //   488b4dff             | push                edi
            //   488bc1               | ret                 

        $sequence_4 = { 488b55a0 483bd7 0f829e050000 48ffc2 488b4d88 }
            // n = 5, score = 100
            //   488b55a0             | mov                 edi, eax
            //   483bd7               | dec                 eax
            //   0f829e050000         | xor                 eax, esp
            //   48ffc2               | dec                 eax
            //   488b4d88             | mov                 dword ptr [ebp + 0x70], eax

        $sequence_5 = { 44887c2468 488b542458 4883fa10 722e 48ffc2 488b4c2440 488bc1 }
            // n = 7, score = 100
            //   44887c2468           | mov                 ebp, 1
            //   488b542458           | jmp                 0x8af
            //   4883fa10             | dec                 eax
            //   722e                 | lea                 eax, [0x1fa62]
            //   48ffc2               | inc                 ecx
            //   488b4c2440           | mov                 byte ptr [esp], dl
            //   488bc1               | dec                 esp

        $sequence_6 = { 48035708 0fb60a 83e10f 4c8d05e8b8fdff 4a0fbe8401d8510400 420fb68c01e8510400 482bd0 }
            // n = 7, score = 100
            //   48035708             | inc                 edx
            //   0fb60a               | movzx               eax, byte ptr [esi + ecx + 0x300]
            //   83e10f               | dec                 eax
            //   4c8d05e8b8fdff       | add                 ebx, ecx
            //   4a0fbe8401d8510400     | inc    ecx
            //   420fb68c01e8510400     | add    eax, eax
            //   482bd0               | dec                 eax

        $sequence_7 = { 90 488d4dcf e8???????? 8bc3 488b4d0f 4833cc e8???????? }
            // n = 7, score = 100
            //   90                   | jle                 0x7b5
            //   488d4dcf             | inc                 ecx
            //   e8????????           |                     
            //   8bc3                 | mov                 edi, 0x800000ff
            //   488b4d0f             | inc                 ecx
            //   4833cc               | mov                 esi, 0xffffff00
            //   e8????????           |                     

        $sequence_8 = { 488d542478 488d4d40 e8???????? 488b5590 483bd6 7232 }
            // n = 6, score = 100
            //   488d542478           | dec                 eax
            //   488d4d40             | and                 dword ptr [ecx], 0
            //   e8????????           |                     
            //   488b5590             | dec                 eax
            //   483bd6               | and                 dword ptr [ecx + 0x10], 0
            //   7232                 | dec                 eax

        $sequence_9 = { f30f7f4537 c6452700 488365c700 660f7f45d7 c645c700 488365e700 }
            // n = 6, score = 100
            //   f30f7f4537           | je                  0x474
            //   c6452700             | sub                 ebx, 1
            //   488365c700           | jmp                 0x48e
            //   660f7f45d7           | dec                 esp
            //   c645c700             | lea                 ecx, [0x31d22]
            //   488365e700           | jmp                 0x486

    condition:
        7 of them and filesize < 865280
}
Download all Yara Rules