Цитата:
Сообщение от 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