Вот такая борода .... Пишу: //******************************************** ... extern NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, OUT PVOID SystemInformation, IN ULONG Length, OUT PULONG ReturnLength ); ... ULONG d = *(PULONG)((PUCHAR)ZwQuerySystemInformation+1); //****************************************************** Все работает отлично! А вот так : //********************************************* ... extern NTSYSAPI NTSTATUS NTAPI ZwWriteVirtualMemory( IN HANDLE ProcessHandle, IN PVOID BaseAddress, IN PVOID Buffer, IN ULONG BufferLength, OUT PULONG ReturnLength OPTIONAL ); ... ULONG d = *(PULONG)((PUCHAR)ZwWriteVirtualMemory+1); //********************************************* Компилиться не хочет: пишет - error LNK2019 unresolvd external symbol .... ZwWriteVirtualMemory .... Может есть какой-нибудь другой способ узнать ее адрес в SST?
ты с ntdll линкуешь или с ntoskrnl? т.е. это код юзермода или драйвера? Если второе то в экспортах ядра её (ZwWriteVirtualMemory) нет
Спасибо за ответ! Это драйвер. Экспорт ядра это и есть SST? Если ее нет в SST, как же ее тогда хукать?
И если в SST ее нет, то ее небудет и на диске в NTOSKRNL.EXE? А как же тогда узнать ее(ZwWriteVirtualMemory) оригинальный адрес, если ее хукнул кспер, или аутпост?
нет. SST - грубо говоря эти функции вызываются из ring3 через "шлюз". она есть в SST. она есть в SST. считать с диска.
Приехали.. а хотя тема ж бегиннерс Експорт - это такой механизм разделения кода, (применяемый в dll\exe) читать мсдн наверно. SST - это таблица принимающая участие в механизм диспетчеризации системных вызовов (в основном используемая для передачи управления из r3 в к0), читать всё что угодно что можешь найти информации море. Из r3 элементарно твоим кодом который выше из r0 чуть сложнее но тоже очень просто: подключаешься к какому нибудь адрессному пространсту процесса (можно гуи можно не гуи ntdll во всех процессах промаплена), затем через peb находишь непосредственно адрес модуля ntdll разбраешь экспорт, находишь адрес фенкции берёшь номер системного сервиса
Спасибо за информацию! Что ZwWriteVirtualMemory есть в SST я поня! Так как же узнать ее номер именно в этой SST! C ZwQuerySystemInformation проблем не возникает, а вот с ZwWriteVirtualMemory ....... !
Вы имели ввиду HMODULE hntdll = GetModuleHandle("ntdll.dll"); *(FARPROC *)&_NtQuerySystemInformation = GetProcAddress(hntdll, "ZwQuerySystemInformation"); но _NtQuerySystemInformation ведь примет адрес отличный от ZwQuerySystemInformation в SST? тоже самое я так понимаю будет и с ZwWriteVirtualMemory?
отличный канечно это же разные модули, но номер сервиса там всё равно будет читать короче Свен Шрайбер "Недокументированные возможности ..."
Есть такая проблема... Решил ее так, при сборке драйвера, в DDK в директории bin есть файл makefile.def. Там есть часть посвященная сборке драйверов - Код (Text): !ELSEIF "$(TARGETTYPE)" == "DRIVER" TARGETEXT=sys !if "$(DRIVERTYPE)" == "wdm" || "$(DRIVERTYPE)" == "WDM" TARGETLIB=$(DDK_LIB_PATH)\wdm.lib !ELSEIF "$(DRIVERTYPE)" == "VXD" TARGETEXT=vxd !ELSE TARGETLIB=$(DDK_LIB_PATH)\ntoskrnl.lib $(DDK_LIB_PATH)\hal.lib $(DDK_LIB_PATH)\wmilib.lib !ENDIF последнюю строку TARGETLIB дополни $(DDK_LIB_PATH)\ntdll.lib, чтобы не парится со командной строкой... и будет тебе счастье... )
Всем спасибо за ответы! Вот вроде бы вседолжно было получится, но нет же! блин! Делаю так: Код (Text): ULONG get_systemservice_index(VOID* f) { return *(PULONG)((PUCHAR)f+1); } ... HMODULE hntdll = GetModuleHandle("ntdll.dll"); VOID* fun1 = GetProcAddress(hntdll, "ZwQuerySystemInformation"); VOID* fun2 = GetProcAddress(hntdll, "ZwWriteVirtualMemory"); ULONG add1 = get_systemservice_index(fun1); ULONG add2 = get_systemservice_index(fun2); в итоге: fun1 = 0x7c90e1aa fun2 = 0x7c90ea32 add1 = 173(0xAD) - все как положено! add2 = 2473913901 - какой-то бред!!!!!!!! Что делаю не так? Я думал что все ф-ии заглушки ntdll имеют одинаковую структуру ?????
Ну ошибка моя наверное в том, что беру ntdll с памяти, а нужно с диска? походу понял ша буду пробовать!
Уже вроде продвинулся на шаг вперед, но все рав но еше есть проблемка: есть код загружающий ntdll c диска и находящий адре ф-ии по имени Код (Text): #define _ALIGN_DOWN(length, align) ((ULONG)(length) & ~(align - 1)) #define INRANGE(base, address, size) ((DWORD_PTR)(address) - (DWORD_PTR)(base) < (DWORD_PTR)(size)) #define MAKE_PTR(type, item, offset) ((type*)((LPBYTE)(item) + (DWORD_PTR)(offset))) PIMAGE_SECTION_HEADER RvaToSection(PIMAGE_NT_HEADERS pNT, DWORD dwRVA) { DWORD i = 0; PIMAGE_SECTION_HEADER pSH = (PIMAGE_SECTION_HEADER)((LPBYTE)&pNT->OptionalHeader + pNT->FileHeader.SizeOfOptionalHeader); for (; i < pNT->FileHeader.NumberOfSections; ++i) { if (dwRVA >= pSH->VirtualAddress && dwRVA < pSH->VirtualAddress + pSH->Misc.VirtualSize) return pSH; ++pSH; } return NULL; } DWORD RvaToFileOffset(PIMAGE_NT_HEADERS pNT, DWORD dwRva) { PIMAGE_SECTION_HEADER pSH = RvaToSection(pNT, dwRva); return pSH ? _ALIGN_DOWN(pSH->PointerToRawData, pNT->OptionalHeader.FileAlignment) + (dwRva - pSH->VirtualAddress) : dwRva; } LPVOID GetAddress(PIMAGE_NT_HEADERS pinth, LPVOID addr, BOOL mappedAsImage) { return mappedAsImage ? addr : (LPVOID)RvaToFileOffset(pinth, addr); } LPVOID XGetProcRva(LPVOID base, LPCSTR name, BOOL mappedAsImage) { DWORD DirSize; DWORD SizeOfImage; PDWORD AddressOfNames ; PDWORD AddressOfFunctions; PWORD AddressOfNameOrdinals; int a = 0, o, i, b; PIMAGE_NT_HEADERS pinth = (PIMAGE_NT_HEADERS)RtlImageNtHeader(base); PIMAGE_EXPORT_DIRECTORY pied = (PIMAGE_EXPORT_DIRECTORY)RtlImageDirectoryEntryToData(base, FALSE, IMAGE_DIRECTORY_ENTRY_EXPORT, &DirSize); SizeOfImage = pinth->OptionalHeader.SizeOfImage; if ((SizeOfImage < (DWORD_PTR)pied - (DWORD_PTR)base) || (SizeOfImage < DirSize + (DWORD_PTR)pied - (DWORD_PTR)base)) return 0; AddressOfNames = MAKE_PTR(DWORD, base, GetAddress(pinth, pied->AddressOfNames, mappedAsImage)); AddressOfFunctions = MAKE_PTR(DWORD, base, GetAddress(pinth, pied->AddressOfFunctions, mappedAsImage)); AddressOfNameOrdinals = MAKE_PTR(WORD, base, GetAddress(pinth, pied->AddressOfNameOrdinals, mappedAsImage)); a = 0; o = i = b = pied->NumberOfNames; while (a < b) { o = (a + b) >> 1; i = strcmp(MAKE_PTR(char, base, GetAddress(pinth, AddressOfNames[o], mappedAsImage)), name); if (!i) { LPVOID pfn = (LPVOID)AddressOfFunctions[AddressOfNameOrdinals[o]]; // check export forwarding return INRANGE(pied, (DWORD_PTR)base + (DWORD_PTR)pfn, DirSize) ? 0 : pfn; } if (i < 0) a = o + 1; else b = o; } return 0; } NTSTATUS LoadModule(LPVOID *base, char *name, ULONG attr) { NTSTATUS status; HANDLE hFile, hSection; IO_STATUS_BLOCK iosb; OBJECT_ATTRIBUTES oa; UNICODE_STRING u_name; LARGE_INTEGER li = {0}; LPVOID ImageBase = 0; DWORD ImageSize = 0; LPWSTR szpath = (LPWSTR)ExAllocatePool(PagedPool, (strlen(name) << 1) + 64); swprintf(szpath, L"\\systemroot\\system32\\%S", name); RtlInitUnicodeString(&u_name, szpath); InitializeObjectAttributes(&oa, &u_name, 0, 0, 0); status = ZwOpenFile(&hFile, GENERIC_READ|SYNCHRONIZE, &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT); ExFreePool(szpath); if (0 > status) return status; status = ZwCreateSection(&hSection, SECTION_MAP_READ, 0, &li, PAGE_READONLY, attr, hFile); ZwClose(hFile); if (status < 0) return status; status = ZwMapViewOfSection(hSection, NtCurrentProcess(), &ImageBase, 0, 0, 0, &ImageSize, ViewUnmap, 0, PAGE_READONLY); ZwClose(hSection); if (status < 0) return status; *base = ImageBase; return STATUS_SUCCESS; } NTSTATUS UnloadModule(LPVOID base) { return ZwUnmapViewOfSection(NtCurrentProcess(), base); } ... LoadModule(&base, "ntdll.dll", SEC_COMMIT); proc = XGetProcRva(base, "ZwQuerySystemInformation", FALSE); UnloadModule(base); Вопрос1 : Как теперь имея адрес ф-ии (proc) добраться до ее номера в SST ? делаю так - *(PULONG)((PUCHAR)proc+1); - BDOS Вопрос2: proc = 0xe1aa; когда загружая способом как в моем предидущем посте proc = 0x7c90e1aa; что значит 0x7c90?
Код (Text): адрес по которой загружен модуль. к твоему rva добавь base. спасибо вроде понял Да я вроде тоже так думаю, но ... Привожу весь код: makefile Код (Text): !INCLUDE $(NTMAKEENV)\makefile.def sources Код (Text): TARGETNAME = MDRIVER TARGETPATH = OBJ TARGETTYPE = DRIVER SOURCES = main.c main.c Код (Text): #include <ntddk.h> #include <ntimage.h> #include <stdio.h> #define DEBUG #ifdef DEBUG #define DBGPRINT DbgPrint #else #define DBGPRINT #endif #define SEC_COMMIT 0x8000000 #define _ALIGN_DOWN(length, align) ((ULONG)(length) & ~(align - 1)) #define INRANGE(base, address, size) ((DWORD_PTR)(address) - (DWORD_PTR)(base) < (DWORD_PTR)(size)) #define MAKE_PTR(type, item, offset) ((type*)((LPBYTE)(item) + (DWORD_PTR)(offset))) typedef BOOLEAN BOOL; typedef ULONG DWORD; typedef USHORT WORD; typedef UCHAR BYTE; typedef NTSTATUS (NTAPI *NTPROC)(); typedef NTPROC *PNTPROC; /*typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; typedef float FLOAT; typedef FLOAT *PFLOAT; typedef BOOL *PBOOL; typedef BOOL *LPBOOL; typedef BYTE *PBYTE; typedef int *PINT; typedef int *LPINT; typedef WORD *PWORD; typedef WORD *LPWORD; typedef long *LPLONG; typedef DWORD *LPDWORD; typedef CONST void *LPCVOID;*/ typedef short *PWORD; typedef DWORD *PDWORD; typedef BYTE *LPBYTE; typedef void *LPVOID; typedef enum _SYSTEM_INFORMATION_CLASS { SystemBasicInformation, SystemProcessorInformation, SystemPerformanceInformation, SystemTimeOfDayInformation, SystemNotImplemented1, SystemProcessesAndThreadsInformation, SystemCallCounts, SystemConfigurationInformation, SystemProcessorTimes, SystemGlobalFlag, SystemNotImplemented2, SystemModuleInformation, SystemLockInformation, SystemNotImplemented3, SystemNotImplemented4, SystemNotImplemented5, SystemHandleInformation, SystemObjectInformation, SystemPagefileInformation, SystemInstructionEmulationCounts, SystemInvalidInfoClass1, SystemCacheInformation, SystemPoolTagInformation, SystemProcessorStatistics, SystemDpcInformation, SystemNotImplemented6, SystemLoadImage, SystemUnloadImage, SystemTimeAdjustment, SystemNotImplemented7, SystemNotImplemented8, SystemNotImplemented9, SystemCrashDumpInformation, SystemExceptionInformation, SystemCrashDumpStateInformation, SystemKernelDebuggerInformation, SystemContextSwitchInformation, SystemRegistryQuotaInformation, SystemLoadAndCallImage, SystemPrioritySeparation, SystemNotImplemented10, SystemNotImplemented11, SystemInvalidInfoClass2, SystemInvalidInfoClass3, SystemTimeZoneInformation, SystemLookasideInformation, SystemSetTimeSlipEvent, SystemCreateSession, SystemDeleteSession, SystemInvalidInfoClass4, SystemRangeStartInformation, SystemVerifierInformation, SystemAddVerifier, SystemSessionProcessesInformation } SYSTEM_INFORMATION_CLASS; typedef struct _SYSTEM_MODULE{ ULONG Reserved[2]; PVOID Base; ULONG Size; ULONG Flags; USHORT Index; USHORT Unknown; USHORT LoadCount; USHORT ModuleNameOffset; CHAR ImageName[256]; } SYSTEM_MODULE, *PSYSTEM_MODULE; typedef struct _SYSTEM_MODULE_INFORMATION { ULONG dwCount; SYSTEM_MODULE Modules[1]; } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION; extern NTSYSAPI NTSTATUS NTAPI ZwCreateSection( OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PLARGE_INTEGER SectionSize OPTIONAL, IN ULONG Protect, IN ULONG Attributes, IN HANDLE FileHandle ); extern NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, OUT PVOID SystemInformation, IN ULONG Length, OUT PULONG ReturnLength ); /* extern NTSYSAPI NTSTATUS NTAPI ZwWriteVirtualMemory( IN HANDLE ProcessHandle, IN PVOID BaseAddress, IN PVOID Buffer, IN ULONG BufferLength, OUT PULONG ReturnLength OPTIONAL );*/ extern NTSYSAPI NTSTATUS NTAPI RtlImageNtHeader(LPVOID); extern NTSYSAPI NTSTATUS NTAPI RtlImageDirectoryEntryToData (PVOID, ULONG, USHORT, PULONG); ULONG get_systemservice_index(NTPROC f) { return *(PULONG)((PUCHAR)f+1); } void DriverUnload(PDRIVER_OBJECT DriverObject){ } PIMAGE_SECTION_HEADER RvaToSection(PIMAGE_NT_HEADERS pNT, DWORD dwRVA) { DWORD i = 0; PIMAGE_SECTION_HEADER pSH = (PIMAGE_SECTION_HEADER)((LPBYTE)&pNT->OptionalHeader + pNT->FileHeader.SizeOfOptionalHeader); for (; i < pNT->FileHeader.NumberOfSections; ++i) { if (dwRVA >= pSH->VirtualAddress && dwRVA < pSH->VirtualAddress + pSH->Misc.VirtualSize) return pSH; ++pSH; } return NULL; } DWORD RvaToFileOffset(PIMAGE_NT_HEADERS pNT, DWORD dwRva) { PIMAGE_SECTION_HEADER pSH = RvaToSection(pNT, dwRva); return pSH ? _ALIGN_DOWN(pSH->PointerToRawData, pNT->OptionalHeader.FileAlignment) + (dwRva - pSH->VirtualAddress) : dwRva; } LPVOID GetAddress(PIMAGE_NT_HEADERS pinth, LPVOID addr, BOOL mappedAsImage) { return mappedAsImage ? addr : (LPVOID)RvaToFileOffset(pinth, addr); } LPVOID XGetProcRva(LPVOID base, LPCSTR name, BOOL mappedAsImage) { DWORD DirSize; DWORD SizeOfImage; PDWORD AddressOfNames ; PDWORD AddressOfFunctions; PWORD AddressOfNameOrdinals; int a = 0, o, i, b; PIMAGE_NT_HEADERS pinth = (PIMAGE_NT_HEADERS)RtlImageNtHeader(base); PIMAGE_EXPORT_DIRECTORY pied = (PIMAGE_EXPORT_DIRECTORY)RtlImageDirectoryEntryToData(base, FALSE, IMAGE_DIRECTORY_ENTRY_EXPORT, &DirSize); SizeOfImage = pinth->OptionalHeader.SizeOfImage; if ((SizeOfImage < (DWORD_PTR)pied - (DWORD_PTR)base) || (SizeOfImage < DirSize + (DWORD_PTR)pied - (DWORD_PTR)base)) return 0; AddressOfNames = MAKE_PTR(DWORD, base, GetAddress(pinth, pied->AddressOfNames, mappedAsImage)); AddressOfFunctions = MAKE_PTR(DWORD, base, GetAddress(pinth, pied->AddressOfFunctions, mappedAsImage)); AddressOfNameOrdinals = MAKE_PTR(WORD, base, GetAddress(pinth, pied->AddressOfNameOrdinals, mappedAsImage)); a = 0; o = i = b = pied->NumberOfNames; while (a < b) { o = (a + b) >> 1; i = strcmp(MAKE_PTR(char, base, GetAddress(pinth, AddressOfNames[o], mappedAsImage)), name); if (!i) { LPVOID pfn = (LPVOID)AddressOfFunctions[AddressOfNameOrdinals[o]]; // check export forwarding return INRANGE(pied, (DWORD_PTR)base + (DWORD_PTR)pfn, DirSize) ? 0 : pfn; } if (i < 0) a = o + 1; else b = o; } return 0; } NTSTATUS LoadModule(LPVOID *base, char *name, ULONG attr) { NTSTATUS status; HANDLE hFile, hSection; IO_STATUS_BLOCK iosb; OBJECT_ATTRIBUTES oa; UNICODE_STRING u_name; LARGE_INTEGER li = {0}; LPVOID ImageBase = 0; DWORD ImageSize = 0; LPWSTR szpath = (LPWSTR)ExAllocatePool(PagedPool, (strlen(name) << 1) + 64); swprintf(szpath, L"\\systemroot\\system32\\%S", name); RtlInitUnicodeString(&u_name, szpath); InitializeObjectAttributes(&oa, &u_name, 0, 0, 0); status = ZwOpenFile(&hFile, GENERIC_READ|SYNCHRONIZE, &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT); ExFreePool(szpath); if (0 > status) return status; status = ZwCreateSection(&hSection, SECTION_MAP_READ, 0, &li, PAGE_READONLY, attr, hFile); ZwClose(hFile); if (status < 0) return status; status = ZwMapViewOfSection(hSection, NtCurrentProcess(), &ImageBase, 0, 0, 0, &ImageSize, ViewUnmap, 0, PAGE_READONLY); ZwClose(hSection); if (status < 0) return status; *base = ImageBase; return STATUS_SUCCESS; } NTSTATUS UnloadModule(LPVOID base) { return ZwUnmapViewOfSection(NtCurrentProcess(), base); } NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath){ LPVOID base; LPVOID proc; LPVOID t_proc; DBGPRINT("Loading driver"); DriverObject->DriverUnload = DriverUnload; LoadModule(&base, "ntdll.dll", SEC_COMMIT); proc = XGetProcRva(base, "ZwQuerySystemInformation", FALSE); t_proc = (LPVOID)((ULONG)base + (ULONG)proc); //DBGPRINT("fun adr2 %x", get_systemservice_index(proc)); DBGPRINT("fun adr2 %x", get_systemservice_index(t_proc)); UnloadModule(base); return STATUS_SUCCESS; } 1) делаю вот так: DBGPRINT("fun adr2 %x", get_systemservice_index(proc)); при запуске драйвера машина перезагружается ! 2) а вот так: t_proc = (LPVOID)((ULONG)base + (ULONG)proc); DBGPRINT("fun adr2 %x", get_systemservice_index(t_proc)); то: base = 0x150000 proc = 0xe1aa t_proc = 0x15e1aa а при выводе(get_systemservice_index(t_proc)) вместо 0xAD результат = c35b5f5e Где опять плужу????????????????
Огромное спасибо всем!!!!!!!!!!!!!! Код (Text): NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { LPVOID base; LPVOID proc; LPVOID t_proc; LPVOID tt; PIMAGE_NT_HEADERS pinth; DBGPRINT("Loading driver"); DriverObject->DriverUnload = DriverUnload; LoadModule(&base, "ntdll.dll", SEC_COMMIT); proc = XGetProcRva(base, "ZwWriteVirtualMemory", FALSE); pinth = (PIMAGE_NT_HEADERS)RtlImageNtHeader(base); tt = (LPVOID)RvaToFileOffset(pinth, (DWORD)proc); t_proc = (LPVOID)((ULONG)base + (ULONG)tt); //tt = (LPVOID)RvaToFileOffset(pinth, (DWORD)proc); //DBGPRINT("fun adr2 %x", get_systemservice_index(proc)); DBGPRINT("fun adr2 %x", t_proc); DBGPRINT("fun adr2 %x", get_systemservice_index(t_proc)); UnloadModule(base); return STATUS_SUCCESS; } Все работае ура! номер ZwWriteVirtualMemory в SST -----------> 0x115 УУУУУУУРРРРААААА!