středa 25. dubna 2012

Tajemství Duqu rámce


Zatímco analýzu složek Duqu , jsme objevili zajímavou anomálii v hlavní součást, která je odpovědná za jeho obchodní logiky a Payload DLL. Chtěli bychom se podělit o své poznatky a požádat o pomoc identifikační kód.

Kód rozvržení

Na první pohled vypadá jako Payload DLL pravidelně Windows PE souboru DLL kompilován s Microsoft Visual Studio 2008 (linker verze 9.0). Vstupní bod kód je naprosto standardní, a tam je jedna funkce vyváží pořadové číslo 1, která také vypadá jako MSVC + +. Tato funkce je volána z DLL PNF a to je vlastně "hlavní" funkce, která provádí veškeré logiky kontaktu s C & C serverů, obdrží další užitečné zatížení modulů a spuštění je. Nejzajímavější je, jak byla tato logika naprogramován a jaké nástroje byly používány.
Kód část Payload DLL je společné pro binární, která byla provedena z několika kusů kódu. Skládá se z "řezy" kódu, které mohou být zpočátku sestavených v samostatném objektu soubory předtím, než byly spojeny v jediném DLL. Většina z nich lze nalézt v jakémkoli jazyce C + + programu, jako Standard Template Library (STL) funkce, run-time knihovna funkcí a uživatelsky literou zákona, s výjimkou Největší část, která obsahuje většinu z C & C interakce kód.

Uspořádání kódu části Payload DLL souboru
Tento řez se liší od ostatních, protože nebyl sestaven z C + + zdrojů. Neobsahuje žádné odkazy na jakékoliv úrovni, nebo uživatelsky napsaných C + + funkce, ale je rozhodně objektově orientovaný.Říkáme, že rámcová Duqu.

Rámcová

Funkce

Kód, který implementuje rámec Duqu má několik charakteristické vlastnosti:
  • Vše je zabaleno do objektů
  • Funkce stůl je umístěn přímo do instance třídy a může být změněno po výstavbě
  • Neexistuje žádný rozdíl mezi užitkových tříd (spojené seznamy, hashe) a uživatelsky písemného kód
  • Objekty komunikují pomocí metody hovory, odložené spuštění fronty a událostmi řízené zpětných volání
  • Neexistují žádné odkazy na run-time knihovny funkcí, je nativní Windows API používá místo

Objekty

Všechny objekty jsou instance nějaké třídy, jsme identifikovali 60 tříd. Každý objekt je konstruován s "konstruktor" funkci, která alokuje paměť, vyplní v tabulce a inicializuje funkce členů.

Funkce konstruktoru pro propojeného seznamu třídy.
Uspořádání jednotlivých objektů závisí na jeho třídě. Některé třídy Zdá se, že binárně kompatibilní funkce tabulek, ale nic nenasvědčuje tomu, že mají nějaké společné nadřazené třídy (stejně jako v jiných jazycích OO). Kromě toho je umístění stolu funkce není pevně stanovena: některé třídy mají to na posunu 0 instance, ale některé ne.

Uspořádání propojeného seznamu objektu. Prvních 10 pole jsou odkazy na členské funkce.
Objekty jsou zničeny příslušných funkcí "destruktor". Tyto funkce obvykle zničí všechny objekty, které odkazuje členských polí a bez jakékoliv použité paměti.
Členské funkce lze odkazovat pomocí objektu funkce stolu (stejně jako "virtuální" funkcí v C + +), nebo mohou volat přímo. Ve většině objektově orientovaných jazycích, členské funkce obdrží "to" parametr, který odkazuje na instanci objektu, a tam je volání konvence, která definuje umístění parametru - buď v registru nebo v zásobníku. To není případ rámcových tříd Duqu - mohou přijímat "to" parametr v každém rejstříku nebo v zásobníku.

Člen funkce propojeného seznamu, dostane parametr "to" na zásobníku

Událostmi řízené rámec

Uspořádání a realizace objektů v rámci Duqu rozhodně není nativní C + +, který byl použit k naprogramování zbytek Trojana. Tam je ještě zajímavější vlastnost rámce, který je používán značně v průběhu celého kódu: je řízené událostmi.
Existují speciální objekty, které implementují událost-řízený model:
  • Objekty událostí, založené na nativní Windows API rukojetí
  • Objekty závit souvislosti, které drží seznamy událostí a odložené exekučního fronty
  • Callback objekty, které jsou spojené s akcí
  • Událost monitory, vytvořené každým závitem kontextu pro monitorování událostí výkonných zpětné volání objekty
  • Závit souvislosti skladování spravuje seznam aktivních vláken a poskytuje přístup k za-závit kontext objektů
Tato událost-řízený model se podobá Cíl C a jeho poselství procházející funkce, ale kód nemá žádné přímé odkazy na jazyk, ani to vypadá sestavují se známými cíle kompilátory C.

Událostmi řízený model Duqu rámce
Každý závit daný objekt může začít "hlavní smyčku", který hledá a zpracovává nové položky v seznamu.Většina kódu Duqu podle stejného principu: vytvořit objekt, svázat několik zpětná volání na vnitřní nebo vnější události a zpět. Zpětné volání rutiny jsou pak prováděny objektu události monitoru, který je vytvořen v rámci každé vlákno kontextu.
Zde je příklad pseudokód pro socket objektu:
SocketObjectConstructor {
    NativeSocket = socket ();
    SocketEvent = new MonitoredEvent (NativeSocket)
    SocketObjectCallback = new ObjectCallback (to, SocketEvent, OnCallbackFunc),
    connect (NativeSocket, ...);
}
{OnCallbackFunc
    switch (GetType (událost)) {
    případ Připojeno : ...
    případ ReadData: ...
...}
}

Závěry

  • Rámcová Duqu Zdá se, že byl napsán v neznámém programovacím jazyce.
  • Na rozdíl od zbytku těla Duqu, že to není C + + a to není zkompilován s Microsoft Visual C + + 2008.
  • Velmi událostmi architekturu body kódu, který byl navržen pro použití v docela hodně jakékoli podmínky, včetně asynchronních commutations.
  • Vzhledem k velikosti projektu Duqu, je možné, že jiný tým byl zodpovědný za rámec, než tým, který vytvořil ovladače a napsal systému infekci a využívá.
  • Tajemný programovací jazyk není rozhodně C + +, Objective C, Java, Python, Ada, Lua a mnoho dalších jazyků jsme zkontrolovali.
  • Ve srovnání s Stuxnet odst. celý napsán v MSVC + +), to je jeden z určujících zvláštnosti rámci Duqu.

Duqu Framework: Co to bylo?

Po provedení analýzy bezpočet hodin, jsme 100% přesvědčeni, že Duqu rámec nebyl naprogramován s Visual C + +. Je možné, že autoři používají in-house rámec pro generování kódu C zprostředkovatele, nebo použít jiný úplně jiný programovací jazyk.
Chtěli bychom podat odvolání do programovacího komunity a zeptejte se někoho, kdo uznává rámec, toolkit nebo programovací jazyk, který může generovat kód podobné stavby, aby nás kontaktovat a napište nám komentář v tomto blogpost. Jsme přesvědčeni, že s Vaší pomocí můžeme vyřešit tuto záhadu hluboko v příběhu Duqu.

Žádné komentáře:

Okomentovat