Во время загрузки любого .exe в мою программу командной строки. Я получаю этот вывод:
http://www.privatepaste.com/22dc18e88d/output
Как видно из вывода. Я получаю 21 импортированных DLL.
Он импортирует wsock32.dll, так как я продолжаю анализировать информацию в формате pe файла аргументов командной строки .exe. Я вижу:
wsock32.dll импортирует все порядковые номера. При взгляде на флаг 80000000 Уберите все это, и вы получите:
[Import_By_Ordinal]: 00000016
[Import_By_Ordinal]: 00000003
[Import_By_Ordinal]: 00000073
[Import_By_Ordinal]: 00000017
[Import_By_Ordinal]: 00000015
[Import_By_Ordinal]: 0000000B
[Import_By_Ordinal]: 00000014
[Import_By_Ordinal]: 0000000E
[Import_By_Ordinal]: 0000000A
[Import_By_Ordinal]: 00000034
[Import_By_Ordinal]: 00000011
[Import_By_Ordinal]: 00000013
[Import_By_Ordinal]: 00000010
[Import_By_Ordinal]: 00000009
[Import_By_Ordinal]: 00000002
[Import_By_Ordinal]: 00000008
[Import_By_Ordinal]: 0000006F
[Import_By_Ordinal]: 00000097
[Import_By_Ordinal]: 00000012
[Import_By_Ordinal]: 00000004
[Import_By_Ordinal]: 0000000F
[Import_By_Ordinal]: 0000000C
Теперь эта информация просматривается при разборе формата файла EXE. Очевидно, мы не сможем получить названия этих функций.
Если бы я хотел посмотреть порядковый номер 00000016, мне пришлось бы использовать dumpbin или cff explorer, а затем загрузить wsock32.dll и посмотреть его экспорт, чтобы узнать, какая функция связана с 00000016.
Я не хочу этого делать. Я хотел бы c или c ++ способ взять 00000016 и как-то открыть wsock32.dll и сравнить его таблицу экспорта с порядковым номером, который я получил от exe.
В настоящее время вот как я получаю ординалы:
// Start Iterating Tables
nFunctions = 0 ;
nOrdinalFunctions = 0 ;
while( (*thunkINT).u1.AddressOfData != 0 ) /* AddressOfData holds RVA
to INT with the imported API name */
{
/* Each IMAGE_THUNK_DATA structures are indicated by zero values when
you reach the end */
// If the high bit isn't set, the IMAGE_THUNK_ DATA value is an RVA to the IMAGE_IMPORT_BY_NAME.
if( !( thunkINT->u1.AddressOfData & IMAGE_ORDINAL_FLAG ) )
{
nameData = (PIMAGE_IMPORT_BY_NAME)( (*thunkINT).u1.AddressOfData );
nameData = (PIMAGE_IMPORT_BY_NAME)rvaToPtr( (DWORD)nameData,
peHeader,
(DWORD)baseAddress );
printf( "\t%s", (*nameData).Name );
printf( "\n" );
}
// Check OriginalFirstThunk ordinal and see if flag is set
// if flag is set, function is called by ordinal number. ( import by ordinal )
if( ( (*thunkINT).u1.Ordinal & IMAGE_ORDINAL_FLAG ) )
{
printf( " [Import_By_Ordinal]:\t" );
printf( "\taddress: %08X", thunkINT->u1.Ordinal );
printf( "\n" );
nOrdinalFunctions++ ;
}
thunkINT++;
thunkIAT++;
nFunctions++;
} // End of while loop
Итак, я хочу знать, анализируя ИМПОРТ EXE-файла … есть ли способ сопоставить ПРАВИЛЬНЫЙ ИМПОРТ, ПРАВИЛЬНОМУ ЭКСПОРТУ DLL? И НАЙДИТЕ НАЗВАНИЕ ФУНКЦИИ ДЛЯ Порядка?
Я хотел бы c или c ++ способ сделать это.
Спасибо, если есть кто-то там со знаниями, которые я ищу. Поскольку этот материал очень сложен, и то, что я пытаюсь сделать, не очень широко известно многим людям.
Я надеюсь, что кто-то может помочь…
Спасибо…
Windows API, по-видимому, не имеет функции для выполнения этого перевода. У него даже нет API для отображения списка экспорта библиотеки, хотя это должно быть возможно с относительной легкостью. Возможно, вы могли бы попытаться изменить этот код, чтобы извлечь отображение из порядкового номера в имя.
Других решений пока нет …