能力值:
( LV1,RANK:0 )
|
-
-
2 楼
文章依赖的工具: 1. iced-x86,Rust反汇编库; 2. Constant Folding,常量折叠,将.tvm0的 .tdata区(代码与数据结合的区)直接识别为常量,抬升为立即数后可直接编译优化; 3. InstCombine,在常量折叠基础上添加了代数恒等变换、冗余消除、指令合并等操作。遍历 IR(中间表示)中的每一条指令,利用当前的所有上下文信息,尝试用更简单的指令序列去替换原有的复杂序列; 3. JCC分支指令的判断,作者在此直接略过; 4. 循环的构建,作者在针对 .tvm 还原时遇到循环结构通过 VPC(虚拟程序计数器)判断循环,当 VPC 在 opcode 序列中往回跳可证明是一次循环,但需要确认是否跳转在头部。在这一算法的基础上,最终编译生成出来的程序是 do_while 形式的循环,依赖运行时的动态判断跳转,不确定具体停止条件。循环结束条件的判断依赖 RSP 栈帧的变换; 5. Dead Store Elimination,死代码消除,用于消除覆盖前未被使用的写入、局部变量的冗余初始化、分配后立即失效的内存; 6. Control Flow Graph,程序控制流图,CFG的还原依赖反汇编->基本块->去除Mutation(变异/花指令)后计算出下一个handler地址,hander凑齐后最终用于提升IR。
备注: 1. CET 指的是 Intel Control-flow Enforcement Technology(控制流强制技术)。这是由英特尔推出的一项CPU 硬件安全功能,用于防范特定的恶意软件攻击。这项技术主要针对的是面向返回编程(ROP) 和面向跳转/调用编程(JOP/COP) 这类攻击手段。它的核心是提供两种硬件级别的保护: 1.1 影子堆栈(Shadow Stack):为程序的返回地址创建一个受 CPU 保护的"影子"备份。当函数返回时,CPU 会比对常规堆栈和影子堆栈中的返回地址,如果不一致,就意味着控制流可能被劫持,CPU 会抛出异常阻止执行。这主要防御 ROP 攻击。 1.2
间接分支跟踪(Indirect Branch Tracking, IBT):要求所有间接跳转(如通过函数指针调用)的目标必须以专门的 ENDBR 指令开头。这相当于给合法的跳转目标做了"标记",防止攻击者将程序流跳转到恶意代码片段。这主要防御 JOP/COP 攻击。
2. ACE 驱动里的 __security_init_cookie 与新版 WDK 差很多,用作年代指纹。 2.1 对照结果:与样本一致的是 WDK 10.0.16299(1709,2017-10)的 CALL+RET;更早的 7.1 / 14393 / 15063 多为 TAILCALL。 2.2 语义 CALL 示例之一就是卸 GPR → 临时 VMExit → 调 __security_init_cookie → 立刻回 VM。
3. 图示函数是Mutation,而非VisualMachine。
最后于 2026-8-12 11:32
被Ⅿalware编辑
,原因:
|
能力值:
( LV1,RANK:0 )
|
-
-
3 楼
rflags优化,化简:
蓝方(TVM):在会 clobber flags 的指令之间狂插 pushfq/popfq,把 RFLAGS 存栈再恢复。 红方(Devirt):把这些栈操作 lift 进 SSA,再靠常量传播 / 死代码消除把它们折掉或删掉。
1. 把 RSP 做成显式 SSA 值。 pushfq → 把 flags 存到 [RSP-8],RSP -= 8 popfq → 从 [RSP] 读回 flags,RSP += 8 |
2. RSP SSA 化之后,flags 的读写转化为针对 mem[index] 的读写后,基于此数据类型做死代码消除。
最后于 2026-8-12 11:10
被Ⅿalware编辑
,原因:
|
|
|