Ir ao conteúdo

Dúvida sobre importações de funções em executáveis


NullException

Posts recomendados

Postado

Olá, obrigado por ler o tópico.

Estou desenvolvendo um injetor de dll binário, ele modifica os bytes do executavel alvo a ponto de carregar uma dll qualquer antes da inicialização do seu código original.

O problema está em escrever os bytes referentes à chamada da função LoadLibraryA (kernel32.dll) para poder carregar a dll. Já pensei em fazer uma rotina de busca entre o buffer do executavel afim de encontrar referencias á LoadLibraryA e encontrar o offset da DataStack referente a importação da mesma.

Desejo saber se é possivel encontrar o offset da função LoadLibrary na DataStack, e caso existir, poder usar. Caso não exista, desejo saber se ainda assim é possível "forçar" uma importação dessa função na memória do aplicativo (já pensei em alternativas como realocar a IAT {import address table} para algum buffer e re-escrever a mesma.).

Agradeço desde já a todos.

A função atual que altera o buffer é essa:


/*global data*/
BYTE *fbufr; //file buffer
DWORD cc_addr, //code cave address {caught by a function}
*EP_ptr, //EntryPoint pointer {EP_ptr = (DWORD*)(&fbufr[(*(DWORD*)&fbufr[60])] + 40)}
OEP_value, //Original EntryPoint {OEP_value = *EP_ptr}
LoadLibraryA_ptr; //Address of LoadLibraryA {LoadLibraryA_ptr = (DWORD)strtol(argv[2], NULL, (int)strtol(argv[1], NULL, 10))
char dll_dir[255]; //Full directory (name) of dll that be injected {caught by keyboard input}

void write_inject()
{
DWORD i, //loop counter
fptr, //current position of file buffer aux pointer
dll_dir_addr; //address that be written the ASCII bytes for dll's directory in code cave

dll_dir_addr = fptr = cc_addr + 10; //injection code will be written in the addres CODE_CAVE:10

//load dll's directory in file buffer
for(i = 0; i < strlen(dll_dir); i++)
fbufr[fptr + i] = dll_dir[i];

fptr += (i + 10); //increment current position of file buffer aux pointer to more 10 bytes
*EP_ptr = fptr; //set the new entry point

//write PUSH arg1
fbufr[fptr++] = 0x68; //PUSH
*(DWORD*)&fbufr[fptr] = (0x400000 + dll_dir_addr); fptr += sizeof(DWORD); //arg1
fbufr[fptr++] = 0x90; //NOP

//write CALL LoadLibraryA
*(WORD*)&fbufr[fptr] = 0x15FF; fptr += sizeof(WORD); //CALL
*(DWORD*)&fbufr[fptr] = LoadLibraryA_ptr; fptr += sizeof(DWORD); //LoadLibraryA
fbufr[fptr++] = 0x90; //NOP

//write JMP {OEP}
fbufr[fptr++] = 0xE9; //JMP
*(DWORD*)&fbufr[fptr] = OEP_value - (fptr + sizeof(DWORD)); // {OEP}
}

Eu entendo a complexidade da situação mas ainda assim aguardo respostas. Obrigado novamente.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...