
05.08.2009, 13:23
|
|
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами:
10097606
Репутация:
3349
|
|
UPDATE 1
Нашел вот небольшой баг в функции Обработки импорта, в частности глюки при работе с импортом по ординалам. Исправил. Вот нова версия функции
Код:
ULONG ProgressImport(ULONG filebase)
{
ULONG PE;
HMODULE lib;
PIMPORT_TABLE ImportTable;
PADDRESS_TABLE AddressTable;
ULONG IAT_Index;
ULONG RVA;
ULONG addr;
PE = *(ULONG*)(filebase + 0x3C) + filebase; // адрес PE заголовка
if (!*(ULONG*)(PE + 0x80)) return 1; // если нет импорта то выходим
ImportTable = (PIMPORT_TABLE)(*(ULONG*)(PE + 0x80) + filebase); // адрес таблицыы импорта
while (ImportTable->NameRVA) // пока есть DLL откуда нужно импортировать функции
{
// проверим что DLL была ранее загружена
lib = GetModuleHandleA((char*)(ImportTable->NameRVA + filebase));
if (!lib) // если не загружена была, то загрузим её.
{
lib = LoadLibraryA((char*)(ImportTable->NameRVA + filebase));
}
if (!lib) return 0; // если не загрузилась, значит ошибка
if (ImportTable->LookUp) // Если импорт идет через LookUp
{
RVA = ImportTable->LookUp + filebase;
}
else // если через таблицу адресов импорта
{
RVA = ImportTable->AddresTableRVA + filebase;
}
IAT_Index = 0;
while (*(ULONG*)RVA) // если есть ссылка на таблицу имен
{
AddressTable = (PADDRESS_TABLE)(*(ULONG*)RVA + filebase); // получаем адрес структуры где хранится HINT NAME
if ((ULONG)AddressTable < 0x80000000 && AddressTable->Name[0]) // если импорт по имени
{
addr = (ULONG)GetProcAddress(lib, AddressTable->Name); // найдем адрес
}
else // если импорт по ординалу
{
addr = (ULONG)GetProcAddress(lib, (char*)((USHORT)AddressTable));
}
// если есть IAT то сохраним в неё найденный адрес
if (ImportTable->AddresTableRVA)
{
*(ULONG*)(ImportTable->AddresTableRVA + filebase + IAT_Index) = addr;
}
else // иначе сохраним туда откуда брали
{
*(ULONG*)RVA = addr;
}
RVA += 4; // сделающий элемент
IAT_Index += 4;
}
ImportTable = (PIMPORT_TABLE)((ULONG)ImportTable+sizeof(IMPORT_TABLE)); // следующая таблица
}
return 1;
}
|
|
|