Номер системного вызова по имени в ядре

Тема в разделе "WASM.NT.KERNEL", создана пользователем Crash, 3 окт 2007.

  1. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Да, использование MmGetSystemRoutineAddress не является решением. Я попробовал получить адрес ZwWriteVirtualMemory или NtWriteVirtualMemory, но не получилось. Функция возвратила 0. Хотя для, например, ZwOpenProcess все нормально.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    в посте #9 я про это и говорил.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну дык не экспортируется же
     
  4. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Twister
    Я был бы тебе благодарен, т.к. нет особо времени писать самому
     
  5. Ra_

    Ra_ New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2007
    Сообщения:
    289
  6. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Ra_

    К дяде Билу обратиться. :)
    ЗЫ: ZwWriteVirtualMemory хм Во блин незадача, если ты в ядре - атачишся к процессу куда хочешь чего писать, пишешь и детатчишся.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    пересобрать ядро...
     
  8. Ra_

    Ra_ New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2007
    Сообщения:
    289
  9. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Ну вы жж0те, это ппц, по-моему, все что надо - уже написали, перечитайте еще раз, если неясно. Ну а если уже совсем неясно, то остается только одно - пить йад и бросить программирование.
     
  10. Ra_

    Ra_ New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2007
    Сообщения:
    289
  11. overfault

    overfault New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    22
    этих функций должно хватить

    Код (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.     PIMAGE_SECTION_HEADER pSH = (PIMAGE_SECTION_HEADER)((LPBYTE)&pNT->OptionalHeader + pNT->FileHeader.SizeOfOptionalHeader);
    8.  
    9.     for (DWORD i = 0; i < pNT->FileHeader.NumberOfSections; ++i)
    10.     {
    11.         if (dwRVA >= pSH->VirtualAddress && dwRVA < pSH->VirtualAddress + pSH->Misc.VirtualSize)
    12.             return pSH;
    13.         ++pSH;
    14.     }
    15.     return NULL;
    16. }
    17.  
    18. DWORD RvaToFileOffset(PIMAGE_NT_HEADERS pNT, DWORD dwRva)
    19. {
    20.     PIMAGE_SECTION_HEADER pSH = RvaToSection(pNT, dwRva);
    21.     return pSH ? _ALIGN_DOWN(pSH->PointerToRawData, pNT->OptionalHeader.FileAlignment) + (dwRva - pSH->VirtualAddress) : dwRva;
    22. }
    23.  
    24. inline LPVOID GetAddress(PIMAGE_NT_HEADERS pinth, LPVOID addr, BOOL mappedAsImage)
    25. {
    26.     return mappedAsImage ? addr : (LPVOID)RvaToFileOffset(pinth, addr);
    27. }
    28.  
    29. LPVOID XGetProcRva(LPVOID base, LPCSTR name, BOOL mappedAsImage)
    30. {
    31.     PIMAGE_NT_HEADERS pinth = RtlImageNtHeader(base);
    32.  
    33.     DWORD DirSize;
    34.     PIMAGE_EXPORT_DIRECTORY pied = (PIMAGE_EXPORT_DIRECTORY)RtlImageDirectoryEntryToData(base, FALSE, IMAGE_DIRECTORY_ENTRY_EXPORT, &DirSize);
    35.  
    36.     DWORD SizeOfImage = pinth->OptionalHeader.SizeOfImage;
    37.  
    38.     if ((SizeOfImage < (DWORD_PTR)pied - (DWORD_PTR)base) ||
    39.         (SizeOfImage < DirSize + (DWORD_PTR)pied - (DWORD_PTR)base))
    40.         return 0;
    41.  
    42.     PDWORD AddressOfNames = MAKE_PTR(DWORD, base, GetAddress(pinth, pied->AddressOfNames, mappedAsImage));
    43.     PDWORD AddressOfFunctions = MAKE_PTR(DWORD, base, GetAddress(pinth, pied->AddressOfFunctions, mappedAsImage));
    44.     PWORD AddressOfNameOrdinals = MAKE_PTR(WORD, base, GetAddress(pinth, pied->AddressOfNameOrdinals, mappedAsImage));
    45.     int a = 0, o, i, b = pied->NumberOfNames;
    46.  
    47.     while (a < b) {
    48.  
    49.         o = (a + b) >> 1;
    50.  
    51.         i = strcmp(MAKE_PTR(char, base, GetAddress(pinth, AddressOfNames[o], mappedAsImage)), name);
    52.  
    53.         if (!i) {
    54.             LPVOID pfn = (LPVOID)AddressOfFunctions[AddressOfNameOrdinals[o]]; 
    55.             // check export forwarding
    56.             return INRANGE(pied, (DWORD_PTR)base + (DWORD_PTR)pfn, DirSize) ? 0 : pfn;
    57.         }
    58.  
    59.         if (i < 0) a = o + 1; else b = o;
    60.     }
    61.  
    62.     return 0;
    63. }
    64.  
    65. NTSTATUS LoadModule(LPVOID *base, char *name, ULONG attr)
    66. {
    67.     LPWSTR szpath = (LPWSTR)ExAllocatePool(PagedPool, (strlen(name) << 1) + 64);
    68.  
    69.     swprintf(szpath, L"\\systemroot\\system32\\%S", name);
    70.  
    71.     NTSTATUS status;
    72.  
    73.     HANDLE hFile, hSection;
    74.     IO_STATUS_BLOCK iosb;
    75.     OBJECT_ATTRIBUTES oa;
    76.     UNICODE_STRING name;
    77.     RtlInitUnicodeString(&name, szpath);
    78.     InitializeObjectAttributes(&oa, &name, 0, 0, 0);
    79.     status = ZwOpenFile(&hFile, GENERIC_READ|SYNCHRONIZE,
    80.         &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT);
    81.     ExFreePool(szpath);
    82.     if (0 > status) return status;
    83.  
    84.     LARGE_INTEGER li = {0};
    85.     status = ZwCreateSection(&hSection, SECTION_MAP_READ, 0,
    86.         &li, PAGE_READONLY, attr, hFile);
    87.     ZwClose(hFile);
    88.     if (status < 0) return status;
    89.  
    90.     LPVOID ImageBase = 0;
    91.     DWORD ImageSize = 0;
    92.  
    93.     status = ZwMapViewOfSection(hSection, NtCurrentProcess(),
    94.         &ImageBase, 0, 0, 0, &ImageSize, ViewUnmap, 0, PAGE_READONLY);
    95.     ZwClose(hSection);
    96.     if (status < 0) return status;
    97.  
    98.     *base = ImageBase;
    99.  
    100.     return STATUS_SUCCESS;
    101. }
    102.  
    103. NTSTATUS UnloadModule(LPVOID base)
    104. {
    105.     return ZwUnmapViewOfSection(NtCurrentProcess(), base);
    106. }
    использовать можно так:
    LoadModule(ntdllbase, "ntdll.dll", SEC_COMMIT), XGetProcRva(ntdllbase, "ZwOpenFile", FALSE), UnloadModule(ntdllbase);
    можно мапить с аттрибутом SEC_IMAGE и mappedAsImage = TRUE,
    но тогда возникают некоторые нюансы с мапингом уже загруженных драйверов
    ну а вытащить индекс уже не сложно
     
  12. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Спасибо большое!
     
  13. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Crash
    Прошу прощения - долгое время меня небыло в сети. Не знаю, нужно еще или нет, но вот обещанные сорцы. Это наработки ms-rem'a.

    На страничке http://twister.orgfree.com/other возъми файл klog.rar
     
  14. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Twister

    Уже не нужно, но все равно спасибо! Пригодится.