PDA

Просмотр полной версии : inject dll с помощью LordPe, CFF Explorer


Sanek2
27.11.2013, 21:39
Моя dll на с++ - hook addNetworkQueue, работает при обычном инжекте. Но на том сервере, где щас играю, какая - то защита, при обычном инжекте сразу бан по hwid. По этому помогите найти другой способ инжекта или разобраться с импортом в клиентские dll.

Пытаюсь сделать импорт dll с помощью Cff Explorer:
захожу в Import Adder
жму Add выбираю мою dll получаю ошибку:
Invalid PE file. Possible reason: no export table present

Тоже самое в LordPe при открытии моей dll и нажатии export. Если все-таки сделать импорт моей dll в dll клиента, то получаю крит клиента (вроде функции которые были в dll клиента исчезают).

//Способ найден, не актуально....

alexteam
28.11.2013, 01:38
все таки "метод инжекта" ?
или все-таки контролируется целостность самой функции (первые 5 байт) ?

Sanek2
28.11.2013, 01:59
Оказалось что дело не в инжекте, а в перехвате API функций (определил методом тыка в виртуалке, слава Снапшотам), при вызове GetProcAdress.
При вызове GetModuleHandleA, Read|WriteProcessMemory бана не наблюдается.

И бан какой - то локальный (не пускает при попытке логина), т.е при инжекта без интернета все-равно бан, решается переустановкой виндовс или откатом с помощью снапшота в виртуалке.

alexteam
28.11.2013, 02:13
при вызове GetProcAdress.
вызывай GetProcAdress + 5

Sanek2
28.11.2013, 23:29
Ок попробую, пока использовал функцию аналог, бан не получаю
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 + (ULONG)hModule;
if ((hint == index + ED->Base) || // если это наш ординал
(name && !strcmp(name, lpProcName))) // если есть имя и оно наше
{
ret = addr; // нашли адрес
break; // прекратим обход экспорта
}
}
}

return (FARPROC)ret; // вернем адрес
}

[I]Добавлено через 19 часов 18 минут
Хмм, тут защита GameGuard, почитал о ней в википедии, неужели все так безнадежно, как там написанно?

St1mul
30.11.2013, 19:29
1) если размер файла изменяется ( основных типа л2.ехе, енгайн, коре и тп ) - тебя банит автоматом - локальная защита ( размер файла изменяется когда добавляешь через импорт адд)
2) я почти уверен, что твоя хук процедура не будет работать с геймгвардом, ГГ чекает в енгайн длл некоторые адреса, которые нужны для хука