Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Имена функции в dll 
:(
    Опции темы
Nastya
Дата 29.3.2005, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



Как имея имя dll модуля или загруженный модуль олучить имена всех его функций, что это возможно свидетельствует существовании программы DumpBin.
Срочно, важно



--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
NiJazz
Дата 29.3.2005, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Nastya
Воспользуйся утилитой. TDump, например (идёт с Delphi и bcb).
PM MAIL   Вверх
Nastya
Дата 29.3.2005, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



В том то и дело, мне надо сделать это программно, т.е. в программе я загружаю dll и получаю список имен функций в ней. Предположим все функции имеют одинаковый прототип.


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Sun
Дата 29.3.2005, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: нет
Всего: 48



По идее можно через функцию
Код

PVOID ImageDirectoryEntryToData(
  PVOID Base,
  BOOLEAN MappedAsImage,
  USHORT DirectoryEntry,
  PULONG Size
);

Если передать ей DirectoryEntry == IMAGE_DIRECTORY_ENTRY_IMPORT, она вернет указатель на структуру PIMAGE_IMPORT_DESCRIPTOR через который можно будет получить список импортируемых функций.


--------------------
Account removed
PM MAIL   Вверх
De Gray
Дата 29.3.2005, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 18.2.2005
Где: Регистрация?

Репутация: нет
Всего: 4



Можно через заголовок. Они хранятся в секции .idata
--------------------
Извяните, шо мы к вас за поможите обращаимси.
PM MAIL   Вверх
Nastya
Дата 29.3.2005, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



Цитата
Можно через заголовок. Они хранятся в секции .idata

А как в принципе работать с секциями и заголовками ???


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
De Gray
Дата 29.3.2005, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 18.2.2005
Где: Регистрация?

Репутация: нет
Всего: 4



Описание заголовка PEЕсли что будет плохо получаться -- спрашивай.
--------------------
Извяните, шо мы к вас за поможите обращаимси.
PM MAIL   Вверх
Nastya
Дата 29.3.2005, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



Спасибо, постораюсь разобраться


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Nastya
Дата 29.3.2005, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



Вот нашла в MSDN ms-help://MS.MSDNQTR.2003APR.1033/dndebug/html/msdn_peeringpe.htm
и еще вот хорошаяссылочка http://education.kulichki.net/comp/hack/27.htm и еще...
вобщем литературу накачала в хорошем объеме smile
Надеюсь смогу разобраться smile

слава Богу, в случае чего тут молодые люди предлогали обращатся smile


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Nastya
Дата 30.3.2005, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



Ребята, пользуюсь примером, закачанным из MSDN по указанной мной выше ссылки, весь его я не откомпилировала, но вот в чем проблема, у меня в PE заголовке файла не находит секцию .edata, в которой по идеи должно быть описание всех экспортируемых функций, причем не находит ее даже в Kernel32.dll, т.е. упорно говорит, что Kernel32.dll не экспортиирует ниодной функции smile


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Nastya
Дата 30.3.2005, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



Вот у меня рабоатет smile
Код

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <string.h>
using namespace std;
#pragma comment(lib,"Dbghelp.lib")


#define MakePtr(cast, ptr, addValue) \
            (cast)((DWORD_PTR)(ptr) + (DWORD_PTR)(addValue))


//Ищет секцию с имененм поереданным в первом парметре

PIMAGE_SECTION_HEADER GetSectionHeader(PSTR name, PIMAGE_NT_HEADERS pNTHeader)
{
    PIMAGE_SECTION_HEADER section;
    unsigned i;
    
    section = (PIMAGE_SECTION_HEADER)(pNTHeader+1);
    
    for ( i=0; i < pNTHeader->FileHeader.NumberOfSections; i++, section++ )
    {
        if ( strnicmp(((char*)section->Name), name, IMAGE_SIZEOF_SHORT_NAME) == 0 )
            return section;
    }
    
    return 0;
}

/*! \fn int GetFunctionNameFromModule(const char * filename, char ** FunctionNameArray)
*    \brief Находит именая всех функций, которые могут быть экспортированы из файла
*   \param filename                - имя dll или exe файла
*   \param FunctionNameArray    - указетель на массив строк, в котором будет вестиьс поиск
*   \param maxLen                - Максимальная длинна строки в массиве
*   \param maxKol                - Максимальное количество строк в массиве
*   \param Kol                    - [out] Количество считанных функций
*   \return  Возвращаем как прошла операция
*    0  - успешно
*    -1 - данные не найдены или не открылcя файла
*    -2 - не хватило размерности массива для записи данных
*/
int GetFunctionNameFromModule(const char * filename, char ** FunctionNameArray, int maxLen, int MaxKol, int* Kol)
{
    //Описываем пере переменные 
    HANDLE                    hFile;
    HANDLE                    hFileMapping;
    LPVOID                    lpFileBase;
    PIMAGE_DOS_HEADER        dosHeader    = NULL;
    PIMAGE_NT_HEADERS        pNTHeader    = NULL;
    DWORD                    base; 
    PIMAGE_EXPORT_DIRECTORY exportDir    = NULL;
    PIMAGE_SECTION_HEADER    header        = NULL;
    INT                        delta; 
    DWORD                    i;
    PSTR                    *name        = NULL;
    DWORD                    offsraw;
    DWORD                    virtRVA;


    //Открываем файл
    hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
                        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
                    
    if ( hFile == INVALID_HANDLE_VALUE )
        return -1;
    hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
    if ( hFileMapping == 0 )
    {
        CloseHandle(hFile);
        return -1;
    }
    lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
    if ( lpFileBase == 0 )
    {
        CloseHandle(hFileMapping);
        CloseHandle(hFile);
        return -1;
    }

    dosHeader = (PIMAGE_DOS_HEADER)lpFileBase;
    if ( dosHeader->e_magic != IMAGE_DOS_SIGNATURE ) // если правильный формат файла
            return -1;
    
    
    //Получаем и проверяем базовый адресс
    base = (DWORD)dosHeader;
    pNTHeader = MakePtr( PIMAGE_NT_HEADERS, dosHeader,
                                dosHeader->e_lfanew );

    if ( IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) ||
         pNTHeader->Signature != IMAGE_NT_SIGNATURE )
          return -1;
        


    header = GetSectionHeader(".text", pNTHeader);
    if ( !header )
        return -1;


    virtRVA    =(DWORD)pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT ].VirtualAddress;
    offsraw = virtRVA - header->VirtualAddress;
    exportDir=(PIMAGE_EXPORT_DIRECTORY)(base + header->PointerToRawData + offsraw);
    delta = (INT)(header->VirtualAddress - header->PointerToRawData);
    name = (PSTR *)((DWORD)exportDir->AddressOfNames - delta + base);
    if( exportDir->NumberOfNames > MaxKol)
        return -2;
    for ( i=0; i < exportDir->NumberOfNames; i++ )
    {
    //    printf("%s\n", (*name -delta+ base));
        if(strlen((*name -delta+ base))>= maxLen )
            return -2;
        strcpy(FunctionNameArray[i],(*name -delta+ base));
        name++;    
    }
    *Kol = exportDir->NumberOfNames;

    //Закрываем открытые HANDL`ы
    UnmapViewOfFile(lpFileBase);
    CloseHandle(hFileMapping);
    CloseHandle(hFile);
    return 0;
}

void main(void)
{
    char filename [] ="C:\\WINDOWS\\system32kernel32.dll";
    char** arr =  new char* [255];
    for(int j=0;j<255;++j)
        arr[j] = new char [255];
    
    int kol=0;
    GetFunctionNameFromModule(filename,arr,255,255,&kol);
    for(int i=0;i<kol;i++)
        printf("%s\n",arr[i]);


    for(int j=0;j<255;++j)
        delete []arr[j];
    delete [] arr;
    getch();


}



--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.