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??
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??
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:
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
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
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!