GetProcRVA????

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

  1. blood_raven

    blood_raven New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    55
    На следующей ветки форума обсуждалось снятие перехватов методом подмены адересо в KiST http://www.wasm.ru/forum/viewtopic.php?id=19538&p=2
    agent007 привел функцию FindKiServiceTable в ее коде я встретил незнакомую
    мне функцию, собственно сабж. кто может подсказать что это за функция и где ее взять!
    ЗЫ.Не пинайте если туплю, я этим увлекся недавно! Поиск по форуму не дал результатов!
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Эта функция парсит экспорт PE-модуля и ищет экспортируемую переменную KeServiceDesctiptorTable. Аналог GetProcAddress.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    А посмотреть можешь в оригинале на www.rootkit.com.
     
  4. blood_raven

    blood_raven New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    55
    n0name спасибо за разъяснение, я впринципе так и полагал, но почему то на
    rootkit.com я ее не нашел, может скинишь линк или выложи тут, plz!
     
  5. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    Код (Text):
    1. ULONG NTAPI GetProcRva(ULONG hModule,PCHAR szProcName) {
    2.     PIMAGE_DOS_HEADER       pDOSHeader = (PIMAGE_DOS_HEADER) hModule;
    3.     PIMAGE_NT_HEADERS32     pNtHeader;
    4.     PIMAGE_EXPORT_DIRECTORY pImageExportDirectory;
    5.     BOOLEAN                 bDumbLinker,bFindByOrdinal;
    6.     ULONG                   i,uOrdinals = 0;
    7.     PULONG                  pName;
    8.     USHORT                  nOrdinal;
    9.     ULONG                   uFuncRva = 0;
    10.     ULONG                   uReturnRva = 0;
    11.     //
    12.     __try {
    13.         bFindByOrdinal=((ULONG)szProcName==(USHORT)szProcName);
    14.         if(pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE) return 0;
    15.         pNtHeader = (PIMAGE_NT_HEADERS32)(((char *)pDOSHeader) + pDOSHeader->e_lfanew);
    16.         if(pNtHeader->Signature != IMAGE_NT_SIGNATURE) return 0;
    17.         if (pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress) {
    18.             pImageExportDirectory = (PIMAGE_EXPORT_DIRECTORY) (hModule+pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
    19.             pName = (PULONG) (hModule+pImageExportDirectory->AddressOfNames);
    20.             for (i=0;i<pImageExportDirectory->NumberOfFunctions;i++,pName++) {
    21.                 bDumbLinker=FALSE;
    22.                 // hack to avoid access violation when addressing bad pointers:
    23.                 // some dumb linkers set NumberOfFunctions to the largest ordinal
    24.                 // and NumberOfNames to the real functions number.
    25.                 if (i*2+(ULONG) (hModule+pImageExportDirectory->AddressOfNameOrdinals)==               
    26.                     (ULONG) (hModule+pImageExportDirectory->Name)) {
    27.                     bDumbLinker=TRUE;
    28.                     break;
    29.                 }
    30.                 __try {
    31.                     nOrdinal=((PUSHORT) (hModule+pImageExportDirectory->AddressOfNameOrdinals))[i];
    32.                     uFuncRva=((PULONG)(hModule+pImageExportDirectory->AddressOfFunctions))[nOrdinal];
    33.                 } __except(EXCEPTION_EXECUTE_HANDLER) {
    34.                     bDumbLinker=TRUE;                  
    35.                 }
    36.                 if (bDumbLinker) break;
    37.                 nOrdinal += (USHORT)pImageExportDirectory->Base;
    38.                 if (!bFindByOrdinal && pName && i<pImageExportDirectory->NumberOfNames) {                  
    39.                     if (!strcmp(szProcName,(PCHAR)(hModule+(ULONG)*pName))) {
    40.                         uReturnRva = uFuncRva;
    41.                         break;
    42.                     }
    43.                 } else
    44.                     if (bFindByOrdinal && (nOrdinal==(USHORT)szProcName)) {
    45.                         uReturnRva = uFuncRva;
    46.                         break;
    47.                     }              
    48.             }          
    49.         }
    50.     } __except(EXCEPTION_EXECUTE_HANDLER) {
    51.     }
    52.     return uReturnRva;
    53. }
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    весьма оригинально, особенно в r3.
    А код какой-то не целостный, половина проверок есть, половины нет. Проверяем на сигнатуры, а вот то, что таблицы экспорта может и не быть - нет.
     
  7. blood_raven

    blood_raven New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    55
    большое спасибо, буду разбираться, но если у кого есть ссылка на оригинал буду благодарен!
     
  8. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    blood_raven какой оригинал? Ты процитировал мой кодес, я тебе дал эту функу... что еще надо?
     
  9. blood_raven

    blood_raven New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    55
    не мои слова а n0name. Вот у меня и сложилось впечатление что
    это не полностью твой код, если не так то извини.