Azov勒索软件的演进之路( 四 )


文章插图
函数BackdoorExeFile的邻近图
尽管存在多态后门 , 但解包和后门过程中使用的加密/解密算法是一致的 , 可用于Azov检测 。

Azov勒索软件的演进之路

文章插图
使用与解包期间相同的算法和密钥重新加密shellcode的主blob
Azov勒索软件的演进之路

文章插图
反分析和代码混淆技术
防止使用软件断点——如果设置了软件断点 , 使用例程将已经解密并正在执行的部分shellcode复制到新分配的内存中 , 然后将执行转移到它 , 迟早会导致异常 。在这种情况下 , 有必要使用硬件断点 。
Azov勒索软件的演进之路

文章插图
防止使用软件断点的反分析技术
不透明常量——用产生相同结果常量值的代码例程替换常量 。(这可以在负责计算常量偏移量的例程中反复看到 , 而不是直接使用它们 , 以便直接调用可以被间接调用取代)
Azov勒索软件的演进之路

文章插图
不透明常数
语法混乱——用语义上不地道或完全扩展的等效指令替换指令 。这方面的一个例子可以在负责解析导出目录的程序中找到;另一种是用直接或间接jmp重复替换调用 。两者如下图所示 。
Azov勒索软件的演进之路

文章插图
语法扩展
Azov勒索软件的演进之路

文章插图
在调用中使用间接跳转和直接跳转
下面可以看到解析导出目录的程序集的简化版本 。
Azov勒索软件的演进之路

文章插图
垃圾代码——插入垃圾字节 , 导致没有有意义的指令 , 甚至根本没有指令 。
不透明谓词——jz/jnz乍一看似乎是一个条件跳转 , 但实际上条件总是满足或总是不满足 , 并且有效地充当无条件跳转 , 使静态分析混淆 。这两种混淆都可以在函数FindGetProcAddress()中看到 。
Azov勒索软件的演进之路

文章插图
垃圾字节插入和不透明谓词混淆
调用-返回滥用——使用push-ret或Call而不是jmp 。
Azov勒索软件的演进之路

文章插图
控制间接
Volatile Homebrew IAT ——一个动态分配的结构 , 包含API函数地址 , 被用作嵌套结构 , 作为参数推送给需要使用特定WIN API例程而不是使用普通导入的函数 。
Azov勒索软件的演进之路

文章插图
动态创建的IAT类结构用作嵌套结构
Azov勒索软件的演进之路

文章插图
总结
尽管Azov样本在第一次被发现时被认为是一个普通的勒索软件 , 但当进一步调查时 , 我们发现了非常先进的技术——手工制作的组装 , 将有效载荷注入可执行文件以打开后门 。


推荐阅读