Не могу определить номер ZwWriteVirtualMemory в SST

Тема в разделе "WASM.BEGINNERS", создана пользователем vanilly_cpp, 5 дек 2007.

  1. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Вот такая борода ....

    Пишу:
    //********************************************
    ...

    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?
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    ты с ntdll линкуешь или с ntoskrnl? т.е. это код юзермода или драйвера? Если второе то в экспортах ядра её (ZwWriteVirtualMemory) нет
     
  3. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Спасибо за ответ!

    Это драйвер.

    Экспорт ядра это и есть SST?

    Если ее нет в SST, как же ее тогда хукать?
     
  4. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    И если в SST ее нет, то ее небудет и на диске в NTOSKRNL.EXE?

    А как же тогда узнать ее(ZwWriteVirtualMemory) оригинальный адрес, если ее хукнул кспер, или аутпост?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    нет. SST - грубо говоря эти функции вызываются из ring3 через "шлюз".
    она есть в SST.
    она есть в SST.
    считать с диска.
     
  6. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Приехали.. а хотя тема ж бегиннерс :)
    Експорт - это такой механизм разделения кода, (применяемый в dll\exe) читать мсдн наверно.
    SST - это таблица принимающая участие в механизм диспетчеризации системных вызовов (в основном используемая для передачи управления из r3 в к0), читать всё что угодно что можешь найти информации море.

    Из r3 элементарно твоим кодом который выше из r0 чуть сложнее но тоже очень просто:
    подключаешься к какому нибудь адрессному пространсту процесса (можно гуи можно не гуи ntdll во всех процессах промаплена), затем через peb находишь непосредственно адрес модуля ntdll разбраешь экспорт, находишь адрес фенкции берёшь номер системного сервиса
     
  7. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    n0name опередил :P
    ну да про чтение с диска забыл )
     
  8. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Спасибо за информацию!

    Что ZwWriteVirtualMemory есть в SST я поня!

    Так как же узнать ее номер именно в этой SST!

    C ZwQuerySystemInformation проблем не возникает, а вот с ZwWriteVirtualMemory ....... !
     
  9. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    тебе уже сказали 2 метода, один читать функцию с файла второй с памяти
     
  10. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Вы имели ввиду

    HMODULE hntdll = GetModuleHandle("ntdll.dll");

    *(FARPROC *)&_NtQuerySystemInformation =
    GetProcAddress(hntdll, "ZwQuerySystemInformation");

    но _NtQuerySystemInformation ведь примет адрес отличный от ZwQuerySystemInformation в SST?
    тоже самое я так понимаю будет и с ZwWriteVirtualMemory?
     
  11. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    отличный канечно это же разные модули, но номер сервиса там всё равно будет читать короче Свен Шрайбер "Недокументированные возможности ..."
     
  12. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Есть такая проблема...
    Решил ее так, при сборке драйвера, в DDK в директории bin есть файл makefile.def. Там есть часть посвященная сборке драйверов -
    Код (Text):
    1. !ELSEIF "$(TARGETTYPE)" == "DRIVER"
    2. TARGETEXT=sys
    3. !if "$(DRIVERTYPE)" == "wdm" || "$(DRIVERTYPE)" == "WDM"
    4. TARGETLIB=$(DDK_LIB_PATH)\wdm.lib
    5. !ELSEIF "$(DRIVERTYPE)" == "VXD"
    6. TARGETEXT=vxd
    7. !ELSE
    8. TARGETLIB=$(DDK_LIB_PATH)\ntoskrnl.lib $(DDK_LIB_PATH)\hal.lib $(DDK_LIB_PATH)\wmilib.lib
    9. !ENDIF
    последнюю строку TARGETLIB дополни $(DDK_LIB_PATH)\ntdll.lib, чтобы не парится со командной строкой...
    и будет тебе счастье... :))
     
  13. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Всем спасибо за ответы!

    Вот вроде бы вседолжно было получится, но нет же! блин!

    Делаю так:

    Код (Text):
    1.  
    2. ULONG get_systemservice_index(VOID* f)
    3. {
    4.     return *(PULONG)((PUCHAR)f+1);
    5. }
    6.  
    7.  
    8.   ...
    9.  
    10.   HMODULE hntdll = GetModuleHandle("ntdll.dll");
    11.    
    12.     VOID* fun1 = GetProcAddress(hntdll, "ZwQuerySystemInformation");
    13.     VOID* fun2 = GetProcAddress(hntdll, "ZwWriteVirtualMemory");
    14.  
    15.     ULONG add1 = get_systemservice_index(fun1);
    16.     ULONG add2 = get_systemservice_index(fun2);
    в итоге:

    fun1 = 0x7c90e1aa
    fun2 = 0x7c90ea32

    add1 = 173(0xAD) - все как положено!
    add2 = 2473913901 - какой-то бред!!!!!!!!

    Что делаю не так?

    Я думал что все ф-ии заглушки ntdll имеют одинаковую структуру ?????
     
  14. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    2473913901 = 0x9374EE2D, уж не хук ли у тебя там какой стоит? )
     
  15. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Ну ошибка моя наверное в том, что беру ntdll с памяти, а нужно с диска?

    походу понял ша буду пробовать!
     
  16. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Уже вроде продвинулся на шаг вперед, но все рав но еше есть проблемка:

    есть код загружающий ntdll c диска и находящий адре ф-ии по имени
    Код (Text):
    1. #define _ALIGN_DOWN(length, align) ((ULONG)(length) & ~(align - 1))
    2. #define INRANGE(base, address, size) ((DWORD_PTR)(address) - (DWORD_PTR)(base) < (DWORD_PTR)(size))
    3. #define MAKE_PTR(type, item, offset) ((type*)((LPBYTE)(item) + (DWORD_PTR)(offset)))
    4.  
    5. PIMAGE_SECTION_HEADER RvaToSection(PIMAGE_NT_HEADERS pNT, DWORD dwRVA)
    6. {
    7. DWORD i = 0;
    8.     PIMAGE_SECTION_HEADER pSH = (PIMAGE_SECTION_HEADER)((LPBYTE)&pNT->OptionalHeader + pNT->FileHeader.SizeOfOptionalHeader);
    9.  
    10.     for (; i < pNT->FileHeader.NumberOfSections; ++i)
    11.     {
    12.         if (dwRVA >= pSH->VirtualAddress && dwRVA < pSH->VirtualAddress + pSH->Misc.VirtualSize)
    13.             return pSH;
    14.         ++pSH;
    15.     }
    16.     return NULL;
    17. }
    18.  
    19. DWORD RvaToFileOffset(PIMAGE_NT_HEADERS pNT, DWORD dwRva)
    20. {
    21.     PIMAGE_SECTION_HEADER pSH = RvaToSection(pNT, dwRva);
    22.     return pSH ? _ALIGN_DOWN(pSH->PointerToRawData, pNT->OptionalHeader.FileAlignment) + (dwRva - pSH->VirtualAddress) : dwRva;
    23. }
    24.  
    25. LPVOID GetAddress(PIMAGE_NT_HEADERS pinth, LPVOID addr, BOOL mappedAsImage)
    26. {
    27.     return mappedAsImage ? addr : (LPVOID)RvaToFileOffset(pinth, addr);
    28. }
    29.  
    30. LPVOID XGetProcRva(LPVOID base, LPCSTR name, BOOL mappedAsImage)
    31. {
    32.  
    33.  
    34.     DWORD DirSize;
    35. DWORD SizeOfImage;
    36. PDWORD AddressOfNames ;
    37. PDWORD AddressOfFunctions;
    38. PWORD AddressOfNameOrdinals;
    39. int a = 0, o, i, b;
    40.  
    41.     PIMAGE_NT_HEADERS pinth = (PIMAGE_NT_HEADERS)RtlImageNtHeader(base);
    42.  
    43.  
    44.     PIMAGE_EXPORT_DIRECTORY pied = (PIMAGE_EXPORT_DIRECTORY)RtlImageDirectoryEntryToData(base, FALSE, IMAGE_DIRECTORY_ENTRY_EXPORT, &DirSize);
    45.  
    46.     SizeOfImage = pinth->OptionalHeader.SizeOfImage;
    47.  
    48.  
    49.     if ((SizeOfImage < (DWORD_PTR)pied - (DWORD_PTR)base) ||
    50.         (SizeOfImage < DirSize + (DWORD_PTR)pied - (DWORD_PTR)base))
    51.         return 0;
    52.  
    53.      AddressOfNames = MAKE_PTR(DWORD, base, GetAddress(pinth, pied->AddressOfNames, mappedAsImage));
    54.      AddressOfFunctions = MAKE_PTR(DWORD, base, GetAddress(pinth, pied->AddressOfFunctions, mappedAsImage));
    55.      AddressOfNameOrdinals = MAKE_PTR(WORD, base, GetAddress(pinth, pied->AddressOfNameOrdinals, mappedAsImage));
    56.      a = 0;
    57.      o = i = b = pied->NumberOfNames;
    58.  
    59.     while (a < b) {
    60.  
    61.         o = (a + b) >> 1;
    62.  
    63.         i = strcmp(MAKE_PTR(char, base, GetAddress(pinth, AddressOfNames[o], mappedAsImage)), name);
    64.  
    65.         if (!i) {
    66.             LPVOID pfn = (LPVOID)AddressOfFunctions[AddressOfNameOrdinals[o]];
    67.  
    68.             // check export forwarding
    69.             return INRANGE(pied, (DWORD_PTR)base + (DWORD_PTR)pfn, DirSize) ? 0 : pfn;
    70.         }
    71.  
    72.         if (i < 0) a = o + 1; else b = o;
    73.     }
    74.  
    75.     return 0;
    76. }
    77.  
    78. NTSTATUS LoadModule(LPVOID *base, char *name, ULONG attr)
    79. {
    80.     NTSTATUS status;
    81.     HANDLE hFile, hSection;
    82.  
    83.     IO_STATUS_BLOCK iosb;
    84.     OBJECT_ATTRIBUTES oa;
    85.     UNICODE_STRING u_name;
    86.     LARGE_INTEGER li = {0};
    87.     LPVOID ImageBase = 0;
    88.     DWORD ImageSize = 0;
    89.  
    90.  
    91.     LPWSTR szpath = (LPWSTR)ExAllocatePool(PagedPool, (strlen(name) << 1) + 64);
    92.  
    93.  
    94.     swprintf(szpath, L"\\systemroot\\system32\\%S", name);
    95.  
    96.  
    97.  
    98.  
    99.     RtlInitUnicodeString(&u_name, szpath);
    100.     InitializeObjectAttributes(&oa, &u_name, 0, 0, 0);
    101.     status = ZwOpenFile(&hFile, GENERIC_READ|SYNCHRONIZE,
    102.         &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT);
    103.     ExFreePool(szpath);
    104.     if (0 > status) return status;
    105.  
    106.  
    107.     status = ZwCreateSection(&hSection, SECTION_MAP_READ, 0,
    108.         &li, PAGE_READONLY, attr, hFile);
    109.     ZwClose(hFile);
    110.     if (status < 0) return status;
    111.  
    112.    
    113.  
    114.     status = ZwMapViewOfSection(hSection, NtCurrentProcess(),
    115.         &ImageBase, 0, 0, 0, &ImageSize, ViewUnmap, 0, PAGE_READONLY);
    116.     ZwClose(hSection);
    117.     if (status < 0) return status;
    118.  
    119.     *base = ImageBase;
    120.  
    121.     return STATUS_SUCCESS;
    122. }
    123.  
    124. NTSTATUS UnloadModule(LPVOID base)
    125. {
    126.     return ZwUnmapViewOfSection(NtCurrentProcess(), base);
    127. }
    128.  
    129.         ...
    130.  
    131.     LoadModule(&base, "ntdll.dll", SEC_COMMIT);
    132.     proc = XGetProcRva(base, "ZwQuerySystemInformation", FALSE);
    133.     UnloadModule(base);
    Вопрос1 :
    Как теперь имея адрес ф-ии (proc) добраться до ее номера в SST ?
    делаю так - *(PULONG)((PUCHAR)proc+1); - BDOS
    Вопрос2:
    proc = 0xe1aa;
    когда загружая способом как в моем предидущем посте
    proc = 0x7c90e1aa; что значит 0x7c90?
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    верно, так и надо делать.
    адрес по которой загружен модуль. к твоему rva добавь base.
     
  18. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Код (Text):
    1. адрес по которой загружен модуль. к твоему rva добавь base.
    спасибо вроде понял

    Да я вроде тоже так думаю, но ...

    Привожу весь код:

    makefile
    Код (Text):
    1. !INCLUDE $(NTMAKEENV)\makefile.def
    sources
    Код (Text):
    1. TARGETNAME = MDRIVER
    2. TARGETPATH = OBJ
    3. TARGETTYPE = DRIVER    
    4.        
    5. SOURCES = main.c
    main.c
    Код (Text):
    1. #include <ntddk.h>
    2. #include <ntimage.h>
    3. #include <stdio.h>
    4.  
    5. #define DEBUG
    6.  
    7. #ifdef DEBUG
    8. #define DBGPRINT DbgPrint
    9. #else
    10. #define DBGPRINT
    11. #endif
    12.  
    13.  
    14.  
    15.  
    16. #define SEC_COMMIT        0x8000000  
    17.  
    18. #define _ALIGN_DOWN(length, align) ((ULONG)(length) & ~(align - 1))
    19. #define INRANGE(base, address, size) ((DWORD_PTR)(address) - (DWORD_PTR)(base) < (DWORD_PTR)(size))
    20. #define MAKE_PTR(type, item, offset) ((type*)((LPBYTE)(item) + (DWORD_PTR)(offset)))
    21.  
    22.  
    23. typedef BOOLEAN     BOOL;
    24. typedef ULONG       DWORD;
    25. typedef USHORT      WORD;
    26. typedef UCHAR       BYTE;
    27.  
    28.  
    29.  
    30. typedef NTSTATUS (NTAPI *NTPROC)();
    31. typedef NTPROC *PNTPROC;
    32.  
    33.  
    34.  
    35.  
    36.  
    37. /*typedef unsigned long       DWORD;
    38. typedef int                 BOOL;
    39. typedef unsigned char       BYTE;
    40. typedef unsigned short      WORD;
    41. typedef float               FLOAT;
    42. typedef FLOAT               *PFLOAT;
    43. typedef BOOL            *PBOOL;
    44. typedef BOOL             *LPBOOL;
    45. typedef BYTE            *PBYTE;
    46.  
    47. typedef int             *PINT;
    48. typedef int              *LPINT;
    49. typedef WORD            *PWORD;
    50. typedef WORD             *LPWORD;
    51. typedef long             *LPLONG;
    52.  
    53. typedef DWORD            *LPDWORD;
    54.  
    55. typedef CONST void       *LPCVOID;*/
    56.  
    57. typedef short           *PWORD;
    58. typedef DWORD           *PDWORD;
    59. typedef BYTE             *LPBYTE;
    60. typedef void             *LPVOID;
    61.  
    62.  
    63. typedef enum _SYSTEM_INFORMATION_CLASS {
    64.     SystemBasicInformation,
    65.     SystemProcessorInformation,
    66.     SystemPerformanceInformation,
    67.     SystemTimeOfDayInformation,
    68.     SystemNotImplemented1,
    69.     SystemProcessesAndThreadsInformation,
    70.     SystemCallCounts,
    71.     SystemConfigurationInformation,
    72.     SystemProcessorTimes,
    73.     SystemGlobalFlag,
    74.     SystemNotImplemented2,
    75.     SystemModuleInformation,
    76.     SystemLockInformation,
    77.     SystemNotImplemented3,
    78.     SystemNotImplemented4,
    79.     SystemNotImplemented5,
    80.     SystemHandleInformation,
    81.     SystemObjectInformation,
    82.     SystemPagefileInformation,
    83.     SystemInstructionEmulationCounts,
    84.     SystemInvalidInfoClass1,
    85.     SystemCacheInformation,
    86.     SystemPoolTagInformation,
    87.     SystemProcessorStatistics,
    88.     SystemDpcInformation,
    89.     SystemNotImplemented6,
    90.     SystemLoadImage,
    91.     SystemUnloadImage,
    92.     SystemTimeAdjustment,
    93.     SystemNotImplemented7,
    94.     SystemNotImplemented8,
    95.     SystemNotImplemented9,
    96.     SystemCrashDumpInformation,
    97.     SystemExceptionInformation,
    98.     SystemCrashDumpStateInformation,
    99.     SystemKernelDebuggerInformation,
    100.     SystemContextSwitchInformation,
    101.     SystemRegistryQuotaInformation,
    102.     SystemLoadAndCallImage,
    103.     SystemPrioritySeparation,
    104.     SystemNotImplemented10,
    105.     SystemNotImplemented11,
    106.     SystemInvalidInfoClass2,
    107.     SystemInvalidInfoClass3,
    108.     SystemTimeZoneInformation,
    109.     SystemLookasideInformation,
    110.     SystemSetTimeSlipEvent,
    111.     SystemCreateSession,
    112.     SystemDeleteSession,
    113.     SystemInvalidInfoClass4,
    114.     SystemRangeStartInformation,
    115.     SystemVerifierInformation,
    116.     SystemAddVerifier,
    117.     SystemSessionProcessesInformation
    118. } SYSTEM_INFORMATION_CLASS;
    119.  
    120. typedef struct _SYSTEM_MODULE{
    121.     ULONG   Reserved[2];
    122.     PVOID   Base;
    123.     ULONG   Size;
    124.     ULONG   Flags;
    125.     USHORT  Index;
    126.     USHORT  Unknown;
    127.     USHORT  LoadCount;
    128.     USHORT  ModuleNameOffset;
    129.     CHAR    ImageName[256];
    130. } SYSTEM_MODULE, *PSYSTEM_MODULE;
    131.  
    132. typedef struct _SYSTEM_MODULE_INFORMATION {
    133.     ULONG dwCount;
    134.     SYSTEM_MODULE Modules[1];
    135. } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
    136.  
    137.  
    138.     extern
    139.         NTSYSAPI
    140.         NTSTATUS
    141.         NTAPI
    142.         ZwCreateSection(
    143.         OUT PHANDLE SectionHandle,
    144.         IN ACCESS_MASK DesiredAccess,
    145.         IN POBJECT_ATTRIBUTES ObjectAttributes,
    146.         IN PLARGE_INTEGER SectionSize OPTIONAL,
    147.         IN ULONG Protect,
    148.         IN ULONG Attributes,
    149.         IN HANDLE FileHandle
    150.         );
    151.     extern
    152.         NTSYSAPI
    153.         NTSTATUS
    154.         NTAPI
    155.         ZwQuerySystemInformation (
    156.         IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
    157.         OUT PVOID                   SystemInformation,
    158.         IN ULONG                    Length,
    159.         OUT PULONG                  ReturnLength
    160.         );
    161.    /* extern
    162.         NTSYSAPI
    163.         NTSTATUS
    164.         NTAPI
    165.         ZwWriteVirtualMemory(
    166.         IN HANDLE ProcessHandle,
    167.         IN PVOID BaseAddress,
    168.         IN PVOID Buffer,
    169.         IN ULONG BufferLength,
    170.         OUT PULONG ReturnLength OPTIONAL
    171.         );*/
    172.     extern
    173.         NTSYSAPI
    174.         NTSTATUS
    175.         NTAPI
    176.         RtlImageNtHeader(LPVOID);
    177.  
    178.     extern
    179.         NTSYSAPI
    180.         NTSTATUS
    181.         NTAPI    
    182.         RtlImageDirectoryEntryToData
    183.         (PVOID, ULONG, USHORT, PULONG);
    184.  
    185. ULONG get_systemservice_index(NTPROC f)
    186. {
    187.     return *(PULONG)((PUCHAR)f+1);
    188. }
    189.  
    190. void DriverUnload(PDRIVER_OBJECT DriverObject){
    191. }
    192.  
    193.  
    194. PIMAGE_SECTION_HEADER RvaToSection(PIMAGE_NT_HEADERS pNT, DWORD dwRVA)
    195. {
    196. DWORD i = 0;
    197.     PIMAGE_SECTION_HEADER pSH = (PIMAGE_SECTION_HEADER)((LPBYTE)&pNT->OptionalHeader + pNT->FileHeader.SizeOfOptionalHeader);
    198.  
    199.     for (; i < pNT->FileHeader.NumberOfSections; ++i)
    200.     {
    201.         if (dwRVA >= pSH->VirtualAddress && dwRVA < pSH->VirtualAddress + pSH->Misc.VirtualSize)
    202.             return pSH;
    203.         ++pSH;
    204.     }
    205.     return NULL;
    206. }
    207.  
    208. DWORD RvaToFileOffset(PIMAGE_NT_HEADERS pNT, DWORD dwRva)
    209. {
    210.     PIMAGE_SECTION_HEADER pSH = RvaToSection(pNT, dwRva);
    211.     return pSH ? _ALIGN_DOWN(pSH->PointerToRawData, pNT->OptionalHeader.FileAlignment) + (dwRva - pSH->VirtualAddress) : dwRva;
    212. }
    213.  
    214. LPVOID GetAddress(PIMAGE_NT_HEADERS pinth, LPVOID addr, BOOL mappedAsImage)
    215. {
    216.     return mappedAsImage ? addr : (LPVOID)RvaToFileOffset(pinth, addr);
    217. }
    218.  
    219. LPVOID XGetProcRva(LPVOID base, LPCSTR name, BOOL mappedAsImage)
    220. {
    221.  
    222.  
    223.     DWORD DirSize;
    224. DWORD SizeOfImage;
    225. PDWORD AddressOfNames ;
    226. PDWORD AddressOfFunctions;
    227. PWORD AddressOfNameOrdinals;
    228. int a = 0, o, i, b;
    229.  
    230.     PIMAGE_NT_HEADERS pinth = (PIMAGE_NT_HEADERS)RtlImageNtHeader(base);
    231.  
    232.  
    233.     PIMAGE_EXPORT_DIRECTORY pied = (PIMAGE_EXPORT_DIRECTORY)RtlImageDirectoryEntryToData(base, FALSE, IMAGE_DIRECTORY_ENTRY_EXPORT, &DirSize);
    234.  
    235.     SizeOfImage = pinth->OptionalHeader.SizeOfImage;
    236.  
    237.  
    238.     if ((SizeOfImage < (DWORD_PTR)pied - (DWORD_PTR)base) ||
    239.         (SizeOfImage < DirSize + (DWORD_PTR)pied - (DWORD_PTR)base))
    240.         return 0;
    241.  
    242.      AddressOfNames = MAKE_PTR(DWORD, base, GetAddress(pinth, pied->AddressOfNames, mappedAsImage));
    243.      AddressOfFunctions = MAKE_PTR(DWORD, base, GetAddress(pinth, pied->AddressOfFunctions, mappedAsImage));
    244.      AddressOfNameOrdinals = MAKE_PTR(WORD, base, GetAddress(pinth, pied->AddressOfNameOrdinals, mappedAsImage));
    245.      a = 0;
    246.      o = i = b = pied->NumberOfNames;
    247.  
    248.     while (a < b) {
    249.  
    250.         o = (a + b) >> 1;
    251.  
    252.         i = strcmp(MAKE_PTR(char, base, GetAddress(pinth, AddressOfNames[o], mappedAsImage)), name);
    253.  
    254.         if (!i) {
    255.             LPVOID pfn = (LPVOID)AddressOfFunctions[AddressOfNameOrdinals[o]];
    256.  
    257.             // check export forwarding
    258.             return INRANGE(pied, (DWORD_PTR)base + (DWORD_PTR)pfn, DirSize) ? 0 : pfn;
    259.         }
    260.  
    261.         if (i < 0) a = o + 1; else b = o;
    262.     }
    263.  
    264.     return 0;
    265. }
    266.  
    267. NTSTATUS LoadModule(LPVOID *base, char *name, ULONG attr)
    268. {
    269.     NTSTATUS status;
    270.     HANDLE hFile, hSection;
    271.  
    272.     IO_STATUS_BLOCK iosb;
    273.     OBJECT_ATTRIBUTES oa;
    274.     UNICODE_STRING u_name;
    275.     LARGE_INTEGER li = {0};
    276.     LPVOID ImageBase = 0;
    277.     DWORD ImageSize = 0;
    278.  
    279.  
    280.     LPWSTR szpath = (LPWSTR)ExAllocatePool(PagedPool, (strlen(name) << 1) + 64);
    281.  
    282.  
    283.     swprintf(szpath, L"\\systemroot\\system32\\%S", name);
    284.  
    285.  
    286.  
    287.  
    288.     RtlInitUnicodeString(&u_name, szpath);
    289.     InitializeObjectAttributes(&oa, &u_name, 0, 0, 0);
    290.     status = ZwOpenFile(&hFile, GENERIC_READ|SYNCHRONIZE,
    291.         &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT);
    292.     ExFreePool(szpath);
    293.     if (0 > status) return status;
    294.  
    295.  
    296.     status = ZwCreateSection(&hSection, SECTION_MAP_READ, 0,
    297.         &li, PAGE_READONLY, attr, hFile);
    298.     ZwClose(hFile);
    299.     if (status < 0) return status;
    300.  
    301.    
    302.  
    303.     status = ZwMapViewOfSection(hSection, NtCurrentProcess(),
    304.         &ImageBase, 0, 0, 0, &ImageSize, ViewUnmap, 0, PAGE_READONLY);
    305.     ZwClose(hSection);
    306.     if (status < 0) return status;
    307.  
    308.     *base = ImageBase;
    309.  
    310.     return STATUS_SUCCESS;
    311. }
    312.  
    313. NTSTATUS UnloadModule(LPVOID base)
    314. {
    315.     return ZwUnmapViewOfSection(NtCurrentProcess(), base);
    316. }
    317.  
    318.  
    319. NTSTATUS DriverEntry(PDRIVER_OBJECT  DriverObject, PUNICODE_STRING RegistryPath){
    320.     LPVOID base;
    321.     LPVOID proc;
    322.  
    323.     LPVOID t_proc;
    324.  
    325.     DBGPRINT("Loading driver");
    326.  
    327.     DriverObject->DriverUnload = DriverUnload;
    328.  
    329.  
    330.     LoadModule(&base, "ntdll.dll", SEC_COMMIT);
    331.     proc = XGetProcRva(base, "ZwQuerySystemInformation", FALSE);
    332.    
    333.     t_proc = (LPVOID)((ULONG)base + (ULONG)proc);
    334.  
    335.     //DBGPRINT("fun adr2  %x", get_systemservice_index(proc));
    336.     DBGPRINT("fun adr2  %x", get_systemservice_index(t_proc));
    337.  
    338.  
    339.     UnloadModule(base);
    340.  
    341.  
    342.     return STATUS_SUCCESS;
    343. }
    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

    Где опять плужу????????????????
     
  19. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    это rva, а тебе нужно физическое смещение. воспользуйся одной из функций кода. RvaToFileOffset
     
  20. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Огромное спасибо всем!!!!!!!!!!!!!!

    Код (Text):
    1. NTSTATUS DriverEntry(PDRIVER_OBJECT  DriverObject, PUNICODE_STRING RegistryPath)
    2. {
    3.     LPVOID base;
    4.     LPVOID proc;
    5.  
    6.     LPVOID t_proc;
    7.     LPVOID tt;
    8.  
    9.     PIMAGE_NT_HEADERS pinth;
    10.  
    11.     DBGPRINT("Loading driver");
    12.  
    13.     DriverObject->DriverUnload = DriverUnload;
    14.  
    15.  
    16.     LoadModule(&base, "ntdll.dll", SEC_COMMIT);
    17.     proc = XGetProcRva(base, "ZwWriteVirtualMemory", FALSE);
    18.  
    19.     pinth = (PIMAGE_NT_HEADERS)RtlImageNtHeader(base);
    20.     tt = (LPVOID)RvaToFileOffset(pinth, (DWORD)proc);  
    21.    
    22.     t_proc = (LPVOID)((ULONG)base + (ULONG)tt);
    23.  
    24.    
    25.     //tt = (LPVOID)RvaToFileOffset(pinth, (DWORD)proc);
    26.  
    27.  
    28.     //DBGPRINT("fun adr2  %x", get_systemservice_index(proc));
    29.     DBGPRINT("fun adr2  %x", t_proc);
    30.     DBGPRINT("fun adr2  %x", get_systemservice_index(t_proc));
    31.  
    32.  
    33.     UnloadModule(base);
    34.  
    35.  
    36.     return STATUS_SUCCESS;
    37. }
    Все работае ура!

    номер ZwWriteVirtualMemory в SST -----------> 0x115 УУУУУУУРРРРААААА!