# in2al5dp3in4er Loader **[research.openanalysis.net/in2al5dp3in4er/loader/analysis/sandbox/invalid printer/2023/04/23/in2al5dp3in4er.html](https://research.openanalysis.net/in2al5dp3in4er/loader/analysis/sandbox/invalid%20printer/2023/04/23/in2al5dp3in4er.html)** OALABS Research April 23, 2023 ## Overview #### This new? loader was exposed by Morphisec. According to the post, the loader is compiled with Embarcadero RAD Studio and employs a graphics card check to ensure it is not running in a sandbox before deploying its embedded payload (the loader). The loader is simply used to download and execute a final payload (main functionality). ## References Samples `66383d931f13bcdd07ca6aa50030968e44d8607cf19bdaf70ed4f9ac704ac4d1` [UnpacMe](https://www.unpac.me/results/346236af-1c81-4cbf-88f3-514061ce1a40#/) ## Analysis ``` data = open('/tmp/blob.bin', 'rb').read() out = [] for i in range(len(data)): tmp = data[i] tmp = (tmp - 52) & 0xff tmp ^= 0x55 tmp = (tmp + i - 18) & 0xff out.append(tmp) out = bytes(out) out[:100] open('/tmp/out.bin','wb').write(out) 3168770 ### Aurora Stealer #### The extracted 2nd stage is the golang stealer sold as "Aurora Stealer" malpedia. 21545028cac12fc9e8692a71247040718e6d640ee6117d1b19f4521f886586beUnpacMe ## Packer ID #### We can make a simple yara rule based on the following ``` ----- ### riid for CreateDXGIFactory call ``` EC 66 71 7B C7 21 AE 44 B2 1A C9 AE 32 1A E3 69 imports CreateDXGIFactory from DXGI.dll checks cmp eax, 887A0002h 3D 02 00 7A 88 gfx whitelist ids {29 9? 01 00} Rule import "pe" import "math" rule riid_hunt { strings: $riid = { EC 66 71 7B C7 21 AE 44 B2 1A C9 AE 32 1A E3 69 } $embarcadero = "This program must be run under Win32" ascii $import = "CreateDXGIFactory" ascii wide condition: all of them and for any i in (0..(pe.number_of_sections)-1) : ( pe.sections[i].name == ".data" and math.entropy(pe.sections[i].raw_data_offset, pe.sections[i].raw_data_size) >= 7 ) } ## Unpacking ``` ----- ``` 48 8D 05 9A 94 16 00 lea rax, blob 48 B9 EE EE DE DD CD CC BB 0A mov rcx, 0ABBCCCDDDDEEEEEh 48 BA 55 55 45 44 34 23 12 00 mov rdx, 12233444455555h 49 B8 CC CC B3 BB A2 1A 00 00 mov r8, 1AA2BBB3CCCCh 4C 63 4D E0 movsxd r9, [rbp+var_20] 48 8D 05 D1 93 16 00 lea rax, blob 48 B9 81 FD A9 98 F6 50 00 00 mov rcx, 50F698A9FD81h 48 BA 1B 06 AC 5D DE F8 ED 00 mov rdx, 0EDF8DE5DAC061Bh 49 B8 04 68 7C AA 99 9D 0B 00 mov r8, 0B9D99AA7C6804h 4C 63 4D E8 movsxd r9, [rbp+var_18] import re import struct import pefile file_data = open('/tmp/pointer.bin', 'rb').read() pe = pefile.PE(data=file_data) crypto_egg = rb'\x48\x8D\x05(....)\x48\xB9(.).......\x48\xBA(.).......\x49\xB8(.).......\x4C' match = re.search(crypto_egg, file_data, re.DOTALL) assert match is not None match_offset = match.start() payload_offset = struct.unpack('