1
resposta

localizando manualmente ntdll.dll no PEB até encontrar o system call através de parse da tabela EAT

Estou tentando localizar manualmente a dll ntdll.dll no PEB in Python até encontrar o system call através de parse da tabela EAT. até agora, a unica coisa que fiz foi importar a lib Pefile. Alguém aí tem uma ideia de como prosseguir??

1 resposta

Olá Andre! Joia?

Essa é uma questão bem avançada e interessante! Trabalhar com o PEB (Process Environment Block) e a EAT (Export Address Table) requer um bom entendimento de como o Windows gerencia processos e bibliotecas. Vou tentar te guiar pelos passos principais para alcançar seu objetivo.

Primeiro, é importante entender que o PEB contém informações sobre os módulos carregados no processo, incluindo ntdll.dll. Aqui está um exemplo básico de como você pode começar a localizar ntdll.dll no PEB usando Python:

  1. Obtendo o PEB: Você pode usar a biblioteca ctypes para acessar o PEB.

    import ctypes
    from ctypes import wintypes
    
    class PEB(ctypes.Structure):
        _fields_ = [
            ("Reserved1", ctypes.c_byte * 2),
            ("BeingDebugged", ctypes.c_byte),
            ("Reserved2", ctypes.c_byte),
            ("Reserved3", ctypes.c_void_p * 2),
            ("Ldr", ctypes.c_void_p)
        ]
    
    class LDR_DATA_TABLE_ENTRY(ctypes.Structure):
        _fields_ = [
            ("Reserved1", ctypes.c_void_p * 2),
            ("InMemoryOrderLinks", ctypes.c_void_p * 2),
            ("Reserved2", ctypes.c_void_p * 2),
            ("DllBase", ctypes.c_void_p),
            ("Reserved3", ctypes.c_void_p),
            ("FullDllName", ctypes.c_wchar_p)
        ]
    
    class PEB_LDR_DATA(ctypes.Structure):
        _fields_ = [
            ("Reserved1", ctypes.c_byte * 8),
            ("InMemoryOrderModuleList", ctypes.c_void_p * 2)
        ]
    
    def get_peb():
        return ctypes.windll.kernel32.NtCurrentTeb().contents.ProcessEnvironmentBlock
    
    peb = get_peb()
    ldr = ctypes.cast(peb.Ldr, ctypes.POINTER(PEB_LDR_DATA)).contents
    
  2. Iterando pelos módulos carregados: Agora você pode iterar pelos módulos carregados no processo para encontrar ntdll.dll.

    module_list = ldr.InMemoryOrderModuleList
    entry = ctypes.cast(module_list[0], ctypes.POINTER(LDR_DATA_TABLE_ENTRY)).contents
    
    while True:
        dll_name = entry.FullDllName
        if dll_name and "ntdll.dll" in dll_name:
            print(f"Found ntdll.dll at: {entry.DllBase}")
            break
        entry = ctypes.cast(entry.InMemoryOrderLinks[0], ctypes.POINTER(LDR_DATA_TABLE_ENTRY)).contents
    
  3. Parsing da EAT: Para parsear a Export Address Table (EAT) de ntdll.dll, você pode usar a biblioteca pefile que você já mencionou. Aqui está um exemplo básico:

    import pefile
    
    ntdll_base = entry.DllBase  # Endereço base de ntdll.dll obtido anteriormente
    ntdll_pe = pefile.PE(ntdll_base)
    
    for exp in ntdll_pe.DIRECTORY_ENTRY_EXPORT.symbols:
        print(f"Exported function: {exp.name} at {hex(ntdll_base + exp.address)}")
    

Esses exemplos devem te dar um bom ponto de partida. Claro, há muitos detalhes adicionais e nuances ao trabalhar com essas estruturas, então recomendo estudar mais sobre o PEB, EAT e como o Windows gerencia processos e bibliotecas.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.