本帖最后由 adld 于 2026-7-13 20:05 编辑
跑了十分钟,耗费巨款5毛钱,搞定。
CheckMe.exe 解题报告
结论
密码:@TWProtector!_v2
样本信息
- 文件:
C:\Users\Administrator\Desktop\CheckMe.exe
- SHA256:
6F5FCCCA61597756D7E986742C9018803E86157984306D0D5EBAA12E6B63BFDF
- 类型:.NET PE32,带
TWSoft.Runtime.VirtualMachine 虚拟化保护
- 资源:
vhqqhutbztqp,解密后头部为 VMBC
分析过程摘要
- 静态检查 PE/CLR 头,确认是 .NET 程序。
- 通过反射枚举类型,发现
Program.Main、Program._a、Program._b 均转发到 TWSoft.Runtime.VirtualMachine.Invoke。
- 调用 VM 的
Initialize() 后读取内部表:
- 虚拟化方法 token:
0x06000004、0x06000005、0x06000006
_a 为主校验函数,_b 为单字节轮函数。
- 抽取并解释 VM 字节码,得到关键常量:
arr0 = 7B 3D E9 51 A4 86 3F C2
arr2 = 15 4C A7 38 ED 91 6A 0F
stored = BA A1 22 51 53 83 DE EB 39 1B 86 5D C7 D3 91 E2
- 派生密钥:
key = 74 98 EE CF 80 48 91 70
- 目标密文:
target = 6F 87 1B 5C F7 ED 7D 6B FC 0D AF A0 53 8D 02 92
Main 要求输入长度为 16。_a 对每 2 字节做 8 轮 Feistel 变换后与 target 比较。
- 逆向 Feistel 变换得到明文:
40 54 57 50 72 6F 74 65 63 74 6F 72 21 5F 76 32,即 @TWProtector!_v2。
核心算法
_b(x, k, r):
v = ((x * 109) + k) & 0xff
v ^= ((x >> 3) | ((x << 5) & 0xff)) & 0xff
v = (v + k * 31 + r * 75) & 0xff
v ^= r & 0xff
v = (((v << 1) & 0xff) | (v >> 7)) ^ k
return v & 0xff
2 字节块加密:
for r in 0..7:
newR = L ^ _b(R, key[r], r)
L = R
R = newR
逆向每个 2 字节块即可还原密码。
验证
执行:
"@TWProtector!_v2" | .\work\CheckMe.exe
程序输出:
恭喜,密码正确!
|