难倒卡巴斯基Duqu病毒真相揭秘 “OO C”而非“C++”

Duqu病毒,即使是Kaspersky这样专业的反病毒公司都无法搞清楚它究竟是用什么语言编写,最终通过在Kaspersky Lab和热心网友的帮助终于水落石出,下文是Kaspersky Lab专家的回应。

在我之前的关于Duqu的博文中,我描述了一个关于Duqu的最大的谜题——C&C通信模块非常奇怪,它竟然和其他部分不是使用同一种语言编写。作为业内技术专家,我们觉得这很有趣但也令人迷惑,于是我们决定在社区中分享它。

我们收到的反馈远远超出预计,总共收到超过200条回复和60多条邮件都是关于可能的语言或框架的建议。我们在这里参与帮助我们鉴别这一“迷之代码”的朋友们说一声“非常感谢!”

先来看看大家所认为最有可能的语言:

  • Variants of LISP
  • Forth
  • Erlang
  • Google Go
  • Delphi
  • OO C
  • 旧的C++和其他语言编译器

非常感谢那些充满智慧的评论,我们现在已经能非常确定正确答案了。下面我引用一下最有用的评论:

igorskSimple Object Orientation (for C)It seems someone over at reddit (http://www.reddit.com/r/ReverseEngineering/) hit the jackpot: the code snippets look _very_ similar to what this would produce: http://daifukkat.su/wiki/index.php/SOO

There are a few other OO frameworks for C, but they don’t match as well: http://ooc-coding.sourceforge.net/ http://sooc.sourceforge.net/

JonwilRe: Other C/C++ compiler?I have seen how GCC works internally and its ABI (for a number of different versions) and I can confirm that the Duqu code is definitely not generated by GCC. I don’t know how other C++ compilers work but the things I see in the ASM (like where the pointers to the functions go, the way the “this” pointer is passed etc) do not suggest C++ to me but something else entirely. (such as the aforementioned “object-oriented” frameworks for C that exist)
igorskRe: Other C/C++ compiler?I’m 99% sure the machine code was generated by MSVC. It’s something you get a feel with experience, but I can point out two things that are quite characteristic of MSVC: 1) it uses esi as the first candidate for temporary storage; 2) “pop ecx” instead of “add esp, 4”.

我们还收到Pascal Bertrand aka bps和一位匿名人士的有趣的邮件,他们认为这是一个定制的面向对象的C语言,被称为”OO C”。

这两条信息非常重要,因为它给我们找到真正的编译器——Microsoft Visual Studio compiler(MSVC)的线索。之后我尝试了不同版本的MSVC和不同的源代码配合不同的编译选项来尝试重制Duqu的二进制代码而且最终成功了。

Duqu原始代码分解:链表类架构

手动反编译C代码

上面的C代码,当用MSVC2008和选项/O1(最小规格)/Ob1(仅内联扩展)[译者注:此处均为大写字母O]产生出来的指令码,和Duqu的完全相同。改变运算顺序和if/else结构产生的代码,MSVC2005也能产生出近乎相同的二进制代码。因此我们能高度确定Duqu是纯C代码用MSVC2008以/O1 /OBb1选项编译出来的结果。

这又意味着什么呢?简单地说,给了我们最开始的问题两个可能的答案:

  1. 这个代码是定制的OO C框架写,基于宏或者是预处理指令。正如你们所想,因为它确实很接近OO C的程序。
  2. 所有代码都是用OO C手动写的,没有使用任何相关扩展。我们不能完全否认这种可能,因为技术角度来讲,完全无法区分宏指令代码和手抄代码的区别。

从各个构造函数以及成员方法的相似性来看,我们可以假定使用了源代码预处理,而且猜想1更有可能。

现在,又有多个开源”OO C”框架可供选择,它们中一些产生的结果和Duqu非常相似,最接近的要数”SOO”(Simple Object Orientation for C),但它是在Duqu问世之后才出现的。

无论以上两个猜想哪一个是正确的,都非常有意义。Playload DLL包含95Kb事件驱动的由OO C这个没有自动内存管理以及安全指针的语言所写的代码。这种编程方式在大型正规程序中非常常见,而不是那样的恶意软件。另外,整个事件驱动架构肯定是作为Duqu代码的一部分或者它的OO C扩展而写的。

很难解释为什么它的作者会使用OO C而不是C++,但我们有过去相似的案例作为参考,一些更倾向这么做人给了我们两个理由:

  1. 他们不相信C++编译器。这只是过去人们首选汇编语言时用来做编程入门的语言。而C是是一项大的革新,并且迅速成为了标准。当C++发布时,很多old school的程序员不愿意接近他,因为不相信内存分配以及其它模糊的会导致间接执行的语言特色,例如:构造函数。
  2. 极度可移植性。过去(10-12年前)C++并没有完全标准化,所以在MSVC上编译通过的程序并不一定能在Watcom上编译。如果你需要极度的可移植性,希望能够在所有平台上都能运行的话,你应该使用C语言。

所有迹象都指明了这必定是个有经验的”old-school”开发者团队的“杰作”!

结论:

  1. Duqu框架是”C”语言代码经由MSVC2008使用/O1 /Ob1特殊选项编译而成。
  2. 代码很有可能由C语言的定制的”OO C”编写
  3. 事件驱动架构是作为Duqu框架的一部分或者是”OO C”的扩展而开发
  4. C&C代码是从已经存在的软件项目重用的,并且集成在了Duqu木马中。

以上所有结论表明是由一个相当专业的开发者团队,他们能够重用陈旧的由顶尖”old school”开发者所写的代码。这样的技术常常在专业软件而不是现在的恶意软件中出现,所以Duqu同Stuxnet(译者注:2010年肆虐全球的超级工厂病毒)一样是在恶意软件中鹤立鸡群般独一无二的存在。

原文出处:securelist.com