Тема: Warden
Показать сообщение отдельно
Старый 27.03.2011, 23:02   #78
TOM_RUS
MaNGOS Dev
 
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
TOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небес
По умолчанию

Цитата:
Сообщение от MaS0n Посмотреть сообщение
*** скрытый текст ***
Там юзается либо Module32First/Module32Next, либо EnumProcessModules, если не удалось загрузить kernel32.dll (как это вообще возможно?).

Код:
ApiPointers *__stdcall InitApiPointers(off_408178 **a1)
{
  ApiPointers *result; // eax@1
  ApiPointers *v2; // esi@1
  HMODULE kernel32_dll_0; // eax@3
  HMODULE kernel32_dll_1; // edi@3
  FARPROC Module32Next; // eax@6
  HMODULE psapi_0; // eax@8
  HMODULE psapi_1; // edi@8
  FARPROC GetModuleInformation; // eax@11
  FARPROC CreateToolhelp32Snapshot; // [sp+8h] [bp-Ch]@4
  FARPROC EnumProcessModules; // [sp+8h] [bp-Ch]@9
  FARPROC Module32First; // [sp+Ch] [bp-8h]@5
  FARPROC GetModuleBaseNameA; // [sp+Ch] [bp-8h]@10

  result = (ApiPointers *)((int (__stdcall *)(_DWORD))(*a1)->sub402707)(44);
  v2 = result;
  if ( result )
  {
    kernel32_dll_0 = LoadLibraryA("kernel32.dll");
    kernel32_dll_1 = kernel32_dll_0;
    if ( kernel32_dll_0 )
    {
      CreateToolhelp32Snapshot = GetProcAddress(kernel32_dll_0, "CreateToolhelp32Snapshot");
      if ( CreateToolhelp32Snapshot )
      {
        Module32First = GetProcAddress(kernel32_dll_1, "Module32First");
        if ( Module32First )
        {
          Module32Next = GetProcAddress(kernel32_dll_1, "Module32Next");
          if ( Module32Next )
          {
            v2->kernel32_dll = kernel32_dll_1;
            v2->off408178 = a1;
            v2->CreateToolhelp32Snapshot = CreateToolhelp32Snapshot;
            v2->Module32First = Module32First;
            v2->Module32Next = Module32Next;
            v2->IsKernel32 = 1;
            result = v2;
            v2->vTable = off_408338;
            return result;
          }
        }
      }
      FreeLibrary(kernel32_dll_1);
    }
    psapi_0 = LoadLibraryA("psapi.dll");
    psapi_1 = psapi_0;
    if ( psapi_0 )
    {
      EnumProcessModules = GetProcAddress(psapi_0, "EnumProcessModules");
      if ( EnumProcessModules )
      {
        GetModuleBaseNameA = GetProcAddress(psapi_1, "GetModuleBaseNameA");
        if ( GetModuleBaseNameA )
        {
          GetModuleInformation = GetProcAddress(psapi_1, "GetModuleInformation");
          if ( GetModuleInformation )
          {
            v2->psapi_dll = psapi_1;
            v2->off408178 = a1;
            v2->EnumProcessModules = EnumProcessModules;
            v2->GetModuleBaseNameA = GetModuleBaseNameA;
            v2->GetModuleInformation = GetModuleInformation;
            v2->IsKernel32 = 0;
            result = v2;
            v2->vTable = off_408338;
            return result;
          }
        }
      }
      FreeLibrary(psapi_1);
    }
    ((void (__stdcall *)(_DWORD))(*a1)->sub402916)(v2);
    result = 0;
  }
  return result;
}
MODULE_CHECK это просто HMACSHA1(random_seed).ComputeHash(GetBytes(UPPER_C ASE("some.dll")))

PROC_CHECK http://paste2.org/p/1328034

Код:
struct ProcCheckInfo
{
  _DWORD procAddress; // GetProcAddress(GetModuleHandle(DLL_NAME), FUNCTION_NAME)
  char *hash;
  _DWORD seed;
  _DWORD address;
  _DWORD length;
};
DRIVER_CHECK http://paste2.org/p/1327840

Последний раз редактировалось TOM_RUS; 28.03.2011 в 01:37.
TOM_RUS вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
MaS0n (28.03.2011)