sexta-feira, 12 de julho de 2013

Carregando uma dll apartir da memória

Quando se trata de fazer hack's ou vírus o quanto mais stealth for seu código melhor, certo? Exato!

Ao desenvolver um hack para um jogo, vi a necessidade do código ser mais oculto possível. Nisso comecei a codificar e bolar algumas coisas e nisso pensei: porque não carregar meu código apartir da memória?.

Até ai tudo bem, fiz um código que carregava o código da dll na memória do jogo e executava o DllEntry. A primeira vista eu sorri alegremente até ver meu código dar um "access violation", fiquei triste (eu confesso). Depurando um pouco meu código vi que ele não resolvia as referências das funções e nem alocava de modo correto os setores da dll (nessa hora fiquei mais triste ainda).

Com todo o ocorrido resolvi apelar, fui no google e achei exatamente o que eu queria, um cara chamado Joachim Bauch desenvolveu um código (git) e um tutorial (link em inglês) explicando como fazê-lo (Foi tiro e queda).

Única coisa foi que tive que portar as minhas necessidades, já que se trata de uma dll injetável, essa dll injetável que carregava a outra dll, já que o código carrega a dll no processo atual (se é que vocês entenderam a embolação).

O código abaixo ilustra como é fácil carregar a dll apartir da dll injetada.

void InjectDll()
{
    FILE *fp;
    DWORD dwSize;
    unsigned char *data;
    HMEMORYMODULE handle;

    fp = fopen(DLLFILE, "rb"); // DLLFILE = minha dll

    fseek(fp, 0, SEEK_END);
    dwSize = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    data = (unsigned char*)malloc( dwSize );
    fread(data, dwSize, 1, fp);

    handle = MemoryLoadLibrary(data);
    if (handle == NULL)
    {
        // não foi possível carregar a dll
    }
    else
    {
        // dll carregada e DllEntry executado.
    }
}
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            InjectDll();
            return FALSE; // assim esse dll e descarregada automáticamente.
    }
    return TRUE;
}

Reparem no return FALSE; assim a dll é descarregada automáticamente, não deixando rastros :P. Do contrário a dll iria ficar lá.

Então meus pequenos, boa sorte nas suas brincadeiras e códigos.

Att, Gilson Fabiano

Nenhum comentário:

Postar um comentário