样本取自755K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1j5i4A6S2j5i4u0Q4x3X3g2S2j5Y4g2K6k6g2)9J5k6h3y4Z5i4K6u0r3j5Y4u0G2N6%4y4W2i4K6u0r3N6r3q4Y4i4K6u0r3f1$3W2D9N6X3g2J5c8X3!0^5i4K6u0r3
样本:524b0b9f10daa60f347cf8f906fd79fa43855df1d5fef2b9a58a90d543c5fdf4.exe(38 MB,x64,来自 abuse.ch/bazaar 的 SilverFox 标签页) 环境:VMware Win11 虚拟机 + IDA(静态)+ x64dbg(动态),宿主机 Python 3.14
用DIE打开看一下这个exe文件

查看签名,发现是空的

查看版本

我们用PE-bear打开看一下有哪些导入表


静态加载的dll没啥,有可能是动态加载的dll.我们去ida里搜索一下%s.dll

发现是crypto\dso\dso_win32.c,是 OpenSSL 源码路径。Windows 上 OpenSSL 用 DSO(动态库)加载引擎时,就是 "%s.dll" 这种拼法。6MB 的业务/打印相关程序里链一份 OpenSSL 很常见.
我们直接静态分析一下
ida打开exe文件
start函数
我们看第一个函数
这个函数是栈保护函数,常数 47936899621426 = 0x2B992DDFA232,这是 MSVC 默认 栈保护cookie
我们看第二个函数sub_401161

看下函数401196函数的汇编
分析汇编
call sub_401190
单纯恶心,rdtscp 循环,等到 CPU 时间戳差 ≥ 0xEE6B2800 + 单步调试的循环了16 * 82354371,继续往下看汇编
rax = 0 -> loc_401190 ,rax != 0 -> loc_401440,这里我们ida动调一下看看rax的值到底是多少,发现rax = 2 -> ZF = 0 -> jz不成立,所以只能跳转loc_401440

先看loc_401190
enter 0FFFFFFFFFFFF8348h帧大小被写成一个大到离谱的数,所以这个分支会直接退出
再看loc_401440
loc_401440->loc_4023D5->loc_402A4E->loc_4023D5->sub_4032EB->sub_4039A9,会循环1963664186次才跳出循环执行后面的函数sub_4032EB->sub_4039A9
sub_4032EB函数
0x7FFE0000这是 Windows 映射给每个进程的只读页,里面有中断时间、Tick、倍率等。常见偏移:
sub_4039A9
VirtualAlloc(lpAddress: nullptr, dwSize: 0xDE7Au, flAllocationType: 0x1000u, flProtect: 0x40u) 作用是向系统要一块虚拟内存,
lpAddress — 想要的起始地址
dwSize — 要多少字节
flAllocationType — 怎么分配
flProtect — 页权限
unk_42D10D这个数据会复制到VirtualAlloc开辟的区间,然后就跳转到r11寄存器了,于是动调一下r11寄存器看看是怎么个事,打开x64dbg,在0x403A39打断点,看看寄存器的值

此时寄存器RSI = 0x0299DE7A,RDI = 0x0043AF87,R12 = R11 = 0x02990000,RAX = 0x00403AE4
说明sub_4039A9这个函数执行完之后就跳转到了0x02990000这个地址,然后我们直接ctrl + G跳转到这个内存看看

直接在x64dbg中dump出来
用ida打开这个bin文件

然后x64dbg单步F8

发现RIP刚好指到了0x2990000的位置,并且第一条就是call 299DE2D,偏移和ida里显示的一样,感觉像是加载器在运行期动态构造解密桩
看一下299DE2D
动调进入299DE2D函数,这时候那四个字节应该解密完成,我们dump出来看一眼

savedata C:\Users\sfoxlab1\Desktop\patch_applied.bin, 0x2990000, 0xDE7A, 用ida打开看一眼是不是解密出一部分代码了

x64dbg
ida
用滚动异或,把 0x2990024~0x299DE2C 解开。
那就在x64dbg里在0x2990024打硬件断点bphws 0x2990024,然后再dump出解密的部分savedata C:\Users\sfoxlab1\Desktop\payload_C2_v2.bin, 0x2990000, 0xDE7A

打开看一下

发现还是没有解密成功,x64dbg往下继续执行吧,看看有没有发现
下一步0000000002990028 | E9 60BF0000 | jmp 299BF8D,我们直接在ida里看一下BF8D
这一块应该就是解密的核心函数了