Удаление экспортированных символов из DLL и связанной с ней библиотеки импорта (VS8) - PullRequest
4 голосов
/ 14 сентября 2011

Есть ли способ постобработки DLL и ее .lib-файла для удаления символов, которые мне не нужны внутри них?

Справочная информация:

Код DLL использует boost :: serialization, который dllexports (много много) символов. Очевидно, это сделано для того, чтобы компоновщик не пропускал статические объекты, на которые нет ссылок, но которые имеют важные побочные эффекты при инициализации.

Однако я бы очень предпочел, чтобы в экспортированных символах DLL не было намека на повышение.

Я полагаю, что после завершения шага связывания было бы безопасно удалить беспорядок в таблице символов, вызванный библиотекой.

Следовательно, мне интересно, существует ли какой-либо инструмент для достижения этой цели.

1 Ответ

4 голосов
/ 20 сентября 2011

Я не знаю инструмента, который делает это, но вот фрагмент кода C ++, который вы можете создать, который может изменить экспортируемые имена DLL.В этом случае вы можете установить имена, которые вы не хотите, в пустую строку (символ 0):

void RemoveUnwantedExports(PSTR ImageName)
{
    LOADED_IMAGE image;
    // load dll in memory for r/w access
    // you'll need Imagehlp.h and Imagehlp.lib to compile successfully
    if (MapAndLoad(ImageName, NULL, &image, TRUE, FALSE))
    {
        // get the export table
        ULONG size;
        PIMAGE_EXPORT_DIRECTORY exports = (PIMAGE_EXPORT_DIRECTORY)ImageDirectoryEntryToData(image.MappedAddress, FALSE, IMAGE_DIRECTORY_ENTRY_EXPORT, &size);

        PIMAGE_SECTION_HEADER *pHeader = new PIMAGE_SECTION_HEADER();

        // get the names address
        PULONG names = (PULONG)ImageRvaToVa(image.FileHeader, image.MappedAddress, exports->AddressOfNames, pHeader);

        for (ULONG i = 0; i < exports->NumberOfNames; i++)
        {
            // get a given name
            PSTR name = (PSTR)ImageRvaToVa(image.FileHeader, image.MappedAddress, names[i] , pHeader);

            // printf("%s\n", name); // debug info

            if (IsUnwanted(name))
            {
                name[0] = 0; // set it to an empty string
            }
        }

        UnMapAndLoad(&image); // commit & write
    }
}

BOOL IsUnwanted(PSTR name)
{
  // implement this
}

Это скорее своего рода запутывание, но полное удаление имен более сложно, так как для этого требуетсяполная последовательная перезапись раздела экспорта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...