Ок попробую, пока использовал функцию аналог, бан не получаю
Код:
FARPROC _stdcall HideGetProcAddress(HMODULE hModule, char* lpProcName)
{
ULONG PE;
PIMAGE_EXPORT_DIRECTORY ED;
PULONG NamePointerRVA;
PUSHORT OrdinalTableRVA;
PULONG AddressTableRVA;
ULONG ret = 0;
USHORT hint = 0;
USHORT index;
char * name;
ULONG addr;
ULONG CNT_FUNC;
if ((ULONG)lpProcName <= 0xFFFF)// если импорт по ординалу
{
hint = (USHORT)lpProcName; // запишем наш ординал
}
if (hModule) // если указан модуль откуда грузить
{
PE = *(ULONG*)((ULONG)hModule + 0x3C) + (ULONG)hModule;// адрес PE заголовка
ED = (PIMAGE_EXPORT_DIRECTORY)(*(ULONG*)((ULONG)PE + 0x78) + (ULONG)hModule); // адрес таблицы экспорта
NamePointerRVA = (ULONG*)(ED->AddressOfNames + (ULONG)hModule); // адрес таблицы имен
OrdinalTableRVA = (USHORT*)(ED->AddressOfNameOrdinals + (ULONG)hModule); // адрес таблицы ординалов
AddressTableRVA = (ULONG*)(ED->AddressOfFunctions + (ULONG)hModule); // адрес таблицы адерсов
// вычесляем наибольшее значение - кол-во функций
if (ED->NumberOfNames > ED->NumberOfFunctions)
{
CNT_FUNC = ED->NumberOfNames;
}
else
{
CNT_FUNC = ED->NumberOfFunctions;
}
// пройдемся по всем функциям
for (USHORT x = 0; x < CNT_FUNC; x++)
{
if (x < ED->NumberOfFunctions) // если есть имя у функции
{
name = (char*)(NamePointerRVA[x] + (ULONG)hModule); // запомним имя
index = OrdinalTableRVA[x]; // запомним ординал
}
else // если имени нет
{
name = 0; // имени нет
index = x; // ординал = текущей позиции
}
// вычесляем адрес функции
addr = AddressTableRVA[index] + (ULONG)hModule;
if ((hint == index + ED->Base) || // если это наш ординал
(name && !strcmp(name, lpProcName))) // если есть имя и оно наше
{
ret = addr; // нашли адрес
break; // прекратим обход экспорта
}
}
}
return (FARPROC)ret; // вернем адрес
}
Добавлено через 19 часов 18 минут
Хмм, тут защита GameGuard, почитал о ней в википедии, неужели все так безнадежно, как там написанно?