Показать сообщение отдельно

  #9  
Старый 05.08.2009, 13:23
slesh
Познавший АНТИЧАТ
Регистрация: 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;
}