Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2013, 13:56   #1
Max1548
Пользователь
 
Регистрация: 28.05.2011
Сообщений: 99
По умолчанию Пример использования ДЛЛ без исходников

Всем доброго времени суток!
Есть exe-файл, если смотреть его через DependencyWalker, видно несколько дллок с экспортируемыми функциями(скрин ниже).
Так вот... Пишу свою программу, которая будет использовать функции из этой дллки. Надо грамотно составить header и код.. Пожалуйста, сделайте это на примере одной функции. Перечитал в инете не мало статей, но не понял, как надо экспортировать функции. Из того, что попытался навалять сам.
+ вылетает ошибка GetTextWrapper:could... из-за того, что PDD.dll начинает выполнятся, можно ли как-то загрузить библиотеку так, чтобы она не выполнялась?
Код:
#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

//  File: dll.h

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

class DLL_EXPORT CarManager
{
    public:
        CarManager();

};

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__
Код:
// File: main.cpp
#include <iostream>
#include <stdlib.h>
#include "dll.h"
#include <windows.h>

using namespace std;

int main()
{
    HMODULE hLib;
    hLib = LoadLibrary("PDD.dll");
    void (CarManager::*pConstructor)();
    (FARPROC &)pConstructor = GetProcAddress(hLib, "??0CarManager@PDD@@QAE@XZ");
    char _c[sizeof(CarManager)];
    CarManager &c = *(CarManager *)_c;
    (c.*pConstructor)();
    return 0;
}
Изображения
Тип файла: jpg 1.jpg (74.2 Кб, 120 просмотров)
Тип файла: png 2.png (32.7 Кб, 88 просмотров)
OS - [||-----------------------------------------------] забил, дойдя до драйвера памяти
Max1548 вне форума Ответить с цитированием
Старый 07.08.2013, 15:54   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Это смахивает на Depends.exe - если так, то попробуйте View / Undecorate C++ functions.

Если не поможет тофда надо будет рыться и понять а) какой компилятор был использован и б) как работает mangling у этого компилятора.

В итоге вы получите список функций с их аргументами. Беда в том, что НЕ получите размер классов (если там есть классы).
waleri вне форума Ответить с цитированием
Старый 07.08.2013, 16:33   #3
Max1548
Пользователь
 
Регистрация: 28.05.2011
Сообщений: 99
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Это смахивает на Depends.exe - если так, то попробуйте View / Undecorate C++ functions.

Если не поможет тофда надо будет рыться и понять а) какой компилятор был использован и б) как работает mangling у этого компилятора.

В итоге вы получите список функций с их аргументами. Беда в том, что НЕ получите размер классов (если там есть классы).
вы меня не совсем поняли или я неправильно изъяснился.
Я попросил пример кода, использования тех функций, которые на скрине. Это одни и те же просто со включенной/выключенной опцией View/Undecorate C++ Functions.
OS - [||-----------------------------------------------] забил, дойдя до драйвера памяти
Max1548 вне форума Ответить с цитированием
Старый 07.08.2013, 17:10   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Значит надо искать компилятор, чтоб потом смотреть mangling имен. Тогда можно будет восстановить аргументы, иначе никак...
waleri вне форума Ответить с цитированием
Старый 08.08.2013, 02:16   #5
Max1548
Пользователь
 
Регистрация: 28.05.2011
Сообщений: 99
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Значит надо искать компилятор, чтоб потом смотреть mangling имен. Тогда можно будет восстановить аргументы, иначе никак...
Если посмотреть на скрины(верхние), то можно увидеть, что аргументы, нужные для вызова тоже видны. Черт возьми, просто пример вызова можно показать? Аргументы и т.д. сам подставить, наверное, смогу. И! Второй вопрос в этой теме: "Можно ли как-то загрузить библиотеку, чтобы её код не выполнялся?" То есть, там есть некая точка входа, с которой выполняется код, а его выполнение не нужно.
OS - [||-----------------------------------------------] забил, дойдя до драйвера памяти
Max1548 вне форума Ответить с цитированием
Старый 08.08.2013, 02:30   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Значит надо искать компилятор, чтоб потом смотреть mangling имен. Тогда можно будет восстановить аргументы, иначе никак...
декорирование имен уже отменено.

но там ООП, это еще хуже.
ТС вам нужна та же версия компилятора для применения.
так же вам нужно восстановить описание класса, для его корректного применения(хотя и можно извратится через указатели, но это маразм наверно)

если нет такой важности, я бы забил, не столь там все просто
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.08.2013, 03:50   #7
Max1548
Пользователь
 
Регистрация: 28.05.2011
Сообщений: 99
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
декорирование имен уже отменено.

но там ООП, это еще хуже.
ТС вам нужна та же версия компилятора для применения.
так же вам нужно восстановить описание класса, для его корректного применения(хотя и можно извратится через указатели, но это маразм наверно)

если нет такой важности, я бы забил, не столь там все просто
Да.. только из-за классов я сюда и пришел, наконец-то поняли, что я хотел. К сожалению, то, что я задумал, не позволяет обойти использование этой dll.
Так? а использовать методы из класса надо допустим:
CarManager или ?%25q5233r2CarManager53@$24
?
OS - [||-----------------------------------------------] забил, дойдя до драйвера памяти
Max1548 вне форума Ответить с цитированием
Старый 08.08.2013, 03:58   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

суть в том что если вы хотите применить классы как они есть у себя, без костылей.
вам нужен тот же компилятор что был применен для длл(причем еще и версия лучше чтоб похожа была).
и потом полностью воссоздать описание класса.

костыли заключаются в том что вам придется забив на ООП работать с функциями по прямым указателям, вручную имитируя нужное окружения вызова(thiscall)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.08.2013, 04:03   #9
Max1548
Пользователь
 
Регистрация: 28.05.2011
Сообщений: 99
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
суть в том что если вы хотите применить классы как они есть у себя, без костылей.
вам нужен тот же компилятор что был применен для длл(причем еще и версия лучше чтоб похожа была).
и потом полностью воссоздать описание класса.

костыли заключаются в том что вам придется забив на ООП работать с функциями по прямым указателям, вручную имитируя нужное окружения вызова(thiscall)
Мда.. ситуация малость хреновая.. Дело в том, что на каком компиляторе делали - неизвестно. Хорошо.. А если в уже запущенное приложение, управляющее этой дллкой загрузить свою, которая. так сказать, перебьет поток и заберет процесс себе(не могу объяснить это нормальными словами) и будет вызывать только нужные методы?
OS - [||-----------------------------------------------] забил, дойдя до драйвера памяти
Max1548 вне форума Ответить с цитированием
Старый 08.08.2013, 09:31   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Max1548 Посмотреть сообщение
Если посмотреть на скрины(верхние), то можно увидеть, что аргументы, нужные для вызова тоже видны.
Ну если вы считаете QAE@ABV01 понятными аргументами, тогда конечно, все видно...

А так - легче сего воспользоваться GetProcessAddress() и заполнить таблицу адресов.
Кроме того, можете создать *свой* DLL, с нужными именами методов а в DEF файле указать forwarding - имя функции и имя функции в *другом* DLL модуле. Можете почитать об этом здесь: http://blogs.msdn.com/b/oldnewthing/...19/671238.aspx

Последний раз редактировалось waleri; 08.08.2013 в 09:36.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пример использования многомерного массива Ципихович Эндрю JavaScript, Ajax 3 15.10.2011 15:31
Компонент без исходников lisiserg Общие вопросы Delphi 7 09.09.2010 09:20
Простой пример использования TDrawGrid bookkc Помощь студентам 1 17.03.2010 15:51
Нужнен пример использования dll bookkc Общие вопросы Delphi 0 13.02.2010 13:37
Доработка программы без исходников. indigov Фриланс 4 18.11.2009 16:08