quarta-feira, 13 de janeiro de 2010

Instruções invisíveis

Resouvi escrever essa postagem porque meus amigos fazem virus como troianos (trojan's) que depois de um tempo ficam detectáveis, por exemplo:

Vou pegar uma linha de código em C++ detectável:
WSADATA WSA_Conn;
WSAStartup (0x202, WSA_Conn);
O Antivirus detecta a chamada da API com os parâmetros, já que um deles é dinâmico ele precisa rodar o aplicativo.

Se formos transformar essa chamada em Asm, ficaria assim:
push WSA_Conn (offset)
push 0x202
call WSAStartup (offset)
Para torna-lo indetectável, devemos passar qualquer falor para o registrador EAX e chama-lo, exemplo:
mov eax, WSA_Conn (offset)
push eax
push 0x202
mov eax, WSAStartup (offset)
call eax
Agora é fácil, vou fazer um código indetectável no DevCpp:

Variáveis globais:

int RetornoWSAFunc;
int WSA_Conn_ASM;

WSADATA WSA_Conn;

Linha de código:

HMODULE hMod = LoadLibrary("Ws2_32.dll");
if (hMod == NULL) { throw "ERRO"; }

RetornoWSAFunc = (int) GetProcAddress(hMod, "WSAStartup");
if (RetornoWSAFunc == 0) { throw "ERRO"; }

WSA_Conn_ASM = (int)&WSA_Conn;

__asm ("PUSHL _WSA_Conn_ASM");
__asm ("PUSHL $0x202");
__asm ("CALL *_RetornoWSAFunc");
__asm ("MOV _RetornoWSAFunc, %EAX");

if (RetornoWSAFunc == -1) { throw "ERRO"; }
;D

GonG4