Скрытие вызовов WinAPI


Freddy

Пользователь
Первый уровень
Регистрация
14.01.2019
Сообщения
3
Добрый день! Читал вот эту тему
Как обфусцировать вызовы WinAPI, делал всё по шагам и старался вникать. Вродь было всё понятно, а потом возникло 2 вопроса:
1)
C:
HMODULE (WINAPI *temp_LoadLibraryA)(__in LPCSTR file_name) = NULL
Что это за прототип такой?
2) Как получить доступ к структуре
C:
LDR_MODULE
? Я так понял это из ntdll.dll.
Буду весьма признателен за помощь!!!
 

virt

Уважаемый пользователь
Форумчанин
Регистрация
24.11.2016
Сообщения
704
Репутация
228
Особо не вникал, но попытаюсь ответить:

1)Это указатель на функцию, смысл такой, что в си можно сделать указатель на какую-то функцию, а потом переопределить, пример здесь:https://ru-sfera.org/threads/genera...raja-ispolnjaem-kod-na-letu.3537/#post-144284

В статье, вот переопределение:
temp_LoadLibraryA = (HMODULE (WINAPI *)(LPCSTR))parse_export_table(krnl32, 0x731faae5);

Т.е. реально будет вызываться parse_export_table(krnl32, 0x731faae5);

2)Опять-же особо не вникал, но по тексту это не-что иное, как получение базы kernel32, можно попробовать, как здесь :



C++:
//х64, проверено, работать будет начиная с xp x64 sp2 до последней win 8.
typedef FARPROC (WINAPI * GetProcAddress_t) (HMODULE, const char *);
struct LDR_MODULE
  {
   LIST_ENTRY e[3];
   HMODULE    base;
   void      *entry;
   UINT       size;
   UNICODE_STRING dllPath;
   UNICODE_STRING dllname;
  };
   int offset = 0x60;
   int ModuleList = 0x18;
   int ModuleListFlink = 0x18;
   int KernelBaseAddr = 0x10;

   INT_PTR peb    =__readgsqword(offset);
   INT_PTR mdllist=*(INT_PTR*)(peb+ ModuleList);
   INT_PTR mlink  =*(INT_PTR*)(mdllist+ ModuleListFlink);
   INT_PTR krnbase=*(INT_PTR*)(mlink+ KernelBaseAddr);

   LDR_MODULE *mdl=(LDR_MODULE*)mlink;
   do
   {
      mdl=(LDR_MODULE*)mdl->e[0].Flink;

      if(mdl->base!=NULL)
        {
         if(!lstrcmpiW(mdl->dllname.Buffer,L"kernel32.dll")) //сравниваем имя библиотеки в буфере с необходимым
           {
            break;
           }
        }
   } while (mlink!=(INT_PTR)mdl);

    kernel32base = (HMODULE)mdl->base;
    ULONG_PTR base = (ULONG_PTR) kernel32base;
    IMAGE_NT_HEADERS * pe = PIMAGE_NT_HEADERS(base + PIMAGE_DOS_HEADER(base)->e_lfanew);
    IMAGE_EXPORT_DIRECTORY * exportDir = PIMAGE_EXPORT_DIRECTORY(base + pe->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
    DWORD * namePtr = (DWORD *) (base + exportDir->AddressOfNames); // Адрес имен функций.
    WORD * ordPtr = (WORD *) (base + exportDir->AddressOfNameOrdinals); //Адрес имени для функции.
    for(;_stricmp((const char *) (base +*namePtr), "GetProcAddress"); ++namePtr, ++ordPtr);
    DWORD funcRVA = *(DWORD *) (base + exportDir->AddressOfFunctions + *ordPtr * 4);

    auto myGetProcAddress = (GetProcAddress_t) (base + funcRVA); //получили адрес GetProcAddress.

Вот ещё статья:

На самом деле там разбираться нужно.)))
 

Freddy

Пользователь
Первый уровень
Регистрация
14.01.2019
Сообщения
3
C++:
//х64, проверено, работать будет начиная с xp x64 sp2 до последней win 8.
typedef FARPROC (WINAPI * GetProcAddress_t) (HMODULE, const char *);
struct LDR_MODULE
  {
   LIST_ENTRY e[3];
   HMODULE    base;
   void      *entry;
   UINT       size;
   UNICODE_STRING dllPath;
   UNICODE_STRING dllname;
  };
   int offset = 0x60;
   int ModuleList = 0x18;
   int ModuleListFlink = 0x18;
   int KernelBaseAddr = 0x10;

   INT_PTR peb    =__readgsqword(offset);
   INT_PTR mdllist=*(INT_PTR*)(peb+ ModuleList);
   INT_PTR mlink  =*(INT_PTR*)(mdllist+ ModuleListFlink);
   INT_PTR krnbase=*(INT_PTR*)(mlink+ KernelBaseAddr);

   LDR_MODULE *mdl=(LDR_MODULE*)mlink;
   do
   {
      mdl=(LDR_MODULE*)mdl->e[0].Flink;

      if(mdl->base!=NULL)
        {
         if(!lstrcmpiW(mdl->dllname.Buffer,L"kernel32.dll")) //сравниваем имя библиотеки в буфере с необходимым
           {
            break;
           }
        }
   } while (mlink!=(INT_PTR)mdl);

    kernel32base = (HMODULE)mdl->base;
    ULONG_PTR base = (ULONG_PTR) kernel32base;
    IMAGE_NT_HEADERS * pe = PIMAGE_NT_HEADERS(base + PIMAGE_DOS_HEADER(base)->e_lfanew);
    IMAGE_EXPORT_DIRECTORY * exportDir = PIMAGE_EXPORT_DIRECTORY(base + pe->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
    DWORD * namePtr = (DWORD *) (base + exportDir->AddressOfNames); // Адрес имен функций.
    WORD * ordPtr = (WORD *) (base + exportDir->AddressOfNameOrdinals); //Адрес имени для функции.
    for(;_stricmp((const char *) (base +*namePtr), "GetProcAddress"); ++namePtr, ++ordPtr);
    DWORD funcRVA = *(DWORD *) (base + exportDir->AddressOfFunctions + *ordPtr * 4);

    auto myGetProcAddress = (GetProcAddress_t) (base + funcRVA);
А вот у вас в примере, скажите, я правильно понял, структуру LDR_MODULE нужно самому создать, её и поля?
 

virt

Уважаемый пользователь
Форумчанин
Регистрация
24.11.2016
Сообщения
704
Репутация
228
А вот у вас в примере, скажите, я правильно понял, структуру LDR_MODULE нужно самому создать, её и поля?
Да, это со статьи от хабра, почитайте её для понимания.

Вы получаете указатель на эту структуру, в примере так:

LDR_MODULE *mdl=(LDR_MODULE*)mlink;
do
{
mdl=(LDR_MODULE*)mdl->e[0].Flink;
*****

Далее уже можно обращаться к полям структуры так:

mdl->base и т.д., смотря что нужно...

На античате, тоже можно почитать.
 

Freddy

Пользователь
Первый уровень
Регистрация
14.01.2019
Сообщения
3
Большое Спасибо!
 
Верх Низ