2010-10-25 2 views
3

Есть ли приложение, которое позволяет мне видеть, что отправляется в DLL из процесса?Мониторинг DLL

У меня есть процесс, и у меня есть DLL, и я хотел бы отслеживать параметры, которые отправляются в функции, чтобы я мог сам использовать DLL.

ЭКСПОРТ DLL есть.

?? 0CCPCompressor @@ AAE @ XZ
?? 0CCPExpandor @@ AAE @ XZ
?? 1CCPCompressor @@ AAE @ XZ
?? 1CCPExpandor @@ AAE @ XZ
? Clear @ CCPCompressor @@ QAEHXZ
? Ясно @ CCPExpandor @@ QAEHXZ
..Compress @ CCPCompressor ..
..Delete @ CCPCompressor ..
..Delete @ CCPExpandor ..
..Expand @ CCPExpandor ..
.. Free @ CCPCompress или ..
..Free @ CCPExpandor ..
..Init @ CCPCompressor ..
..Init @ CCPExpandor ..
..New @ CCPCompressor ..
..New @ CCPExpandor ..

+3

Возможный дубликат [Как перехватить вызовы методов DLL?] (Http: // stackoverflow.com/questions/220515/how-to-intercept-dll-method-calls) –

+0

Глядя на ваш DLL-экспорт, вы подняли серьезный красный флаг - вы экспортируете C++-украшенное имя из своей DLL. Это означает, что ваша DLL не будет взаимодействовать между различными компиляторами C++ (все они имеют свои собственные алгоритмы декодирования имен) и даже между различными версиями компилятора C++ (алгоритмы декодирования имен изменяются с версии на версию). –

+0

Я считаю, что эта техника используется одним из инструментов Sysinternal, либо это, либо я видел статью об этом типе инъекции одним из людей Sysinternal. Не помню. Во всяком случае, счастливая кодировка. – 2010-10-26 01:45:27

ответ

0

В общем, это плохая идея. Даже если у вас есть набор зафиксированных параметров, без глубокого анализа кода DLL, вы не знаете, что делать с этими параметрами и какие диапазоны параметров принимаются определенными методами. Пример: если я вызываю метод DoMathOperation (Add, 1, 2), вы можете имитировать этот вызов, но вы не сможете делать DoMathOperation (Multiply, 2, 2), поскольку вы не знаете, что это возможно.

0

Самый простой подход - просто перенести исходную dll и создать новую dll, которую вы делаете сами, с тем же экспортом. Эта dll будет LoadLibrary старой dll из альтернативного местоположения.

Это не совсем применимо здесь - dll экспортирует члены класса C++, который имеет два следствия: классы C++ должны быть статически загружены, так как нет механизма C++ для «склеивания» указателей функций C++ (полученных через GetProcAddress) в экземпляр класса.

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

Единственный способ обойти это написать DLL прокладку из двух частей:

Shim1:

Одна часть будет получить имя исходного DLL, и будет экспортировать тот же класс Defintion оригинальный DLL экспортироваться:

class __decldpec(dllexport) CCPCompressor { 
    ... 

Depends может треснуть украшение имя или Undname.exe распространяется с Visual Studio.

Эта часть будет LoadLibrary(), используя явный путь к shimdll2.dll, расположенный в другой папке, вместе с исходной dll. GetProcAddress() потребуется для импорта функций, экспортируемых shimdll2.Dll

Shim2:

Другой длл прокладка будет находиться в папке с DLL, которую вы пытаетесь перехватить. Эта библиотека придется импортировать класс из исходного DLL компрессора:

class __declspec(dllimport) CCPCompressor { 
    ... 

Вы можете использовать библиотеку DLL импорта сделанные первой DLL на самом деле связать символы. Тогда его случай экспорта функций из shim2.dll, который shim1.dll будет вызывать всякий раз, когда вызывается метод CCPCompressor.

NB. Другие вещи: ваша версия класса CCPCompressor должна иметь, по крайней мере, большой массив фиктивных элементов, поскольку вы не можете знать, из DLL-экспорта, насколько большой ожидает приложение класс (если у вас нет фактического файла заголовка описывающий класс).


Для разложения экспортируемые имена, чтобы построить определение класса: Откройте строку Visual Студия 20XX команду из меню Пуск> Программы> Visual Studio 20xx - меню> Инструменты.

c:\...\VC>undname [email protected]@@QAEHXZ 
Microsoft (R) C++ Name Undecorator 

Undecoration of :- "[email protected]@@QAEHXZ" 
is :- "public: int __thiscall CCPCompressor:Clear(void)" 

c:\...\VC>_ 

ли, что для каждой функции, экспортируемой из исходной библиотеки DLL (undname принимает какое-то текстовый файл, чтобы ускорить этот процесс), чтобы узнать, как объявить соответствующий класс размораживание.

+0

Как найти то же определение класса, которое экспортировала исходная dll? –

+0

Если у вас его нет, вам нужно его придумать: используйте файл depend.exe для отображения каждого прототипа функции и добавьте все их в свою собственную декларацию класса. –

+0

Я собрал следующее, но :: New, о котором я не уверен. класс __decldpec (dllexport) CCPCompressor
{
закрытый:
CCPCompressor (void);
~ CCPCompressor (void);
public:
int Clear (void);
unsigned short Сжатие (unsigned char * const, unsigned short, unsigned char * const, unsigned short, int);
void Удалить (void);
void Free (void);
int Init (void);
}
статический класс CCPCompressor * __cdecl CCPCompressor :: New (void);

У вас есть действительно хорошие URL-адреса, которые стоит прочитать по этому поводу? –

0

Использует detours, соответствующий вашим требованиям?

С сайта:

Обзор

Инновационные исследования систем зависит от способности легко инструмента и расширить существующую операционную систему и функциональность приложения. При доступе к соответствующему исходному коду часто тривиально вставлять новые инструменты или расширения, перестраивая ОС или приложение. Однако в сегодняшних мировых системах исследователи редко имеют доступ ко всему соответствующему исходному коду.

Detours - это библиотека для управления произвольными функциями Win32 на машинах x86, x64 и IA64. Detours перехватывает функции Win32, переписывая код внутренней памяти для целевых функций. Пакет Detours также содержит утилиты для подключения произвольных DLL и сегментов данных (называемых полезными нагрузками) к любому двоичному файлу Win32.

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

Мы использовали Detours для создания автоматической распределенной системы разбиения, для анализа и анализа стека протоколов DCOM, а также для создания слоя thunking для COM-интерфейса OS API. Объемы широко используются в Microsoft и внутри отрасли.

+0

Я мог бы попробовать, но из другого сообщения мне показалось, что я не мог использовать его для мониторинга DLL с классами. Если вы можете сказать мне, я могу попробовать. Благодарю. –

+0

Бинарный интерфейс приложения не определен для указателей метода класса C++. В результате указатели на методы не могут быть маршалированы через void *, поскольку они могут сильно различаться по размеру. Объяснениям нужен адрес функции с соответствующим соглашением о вызове для функции, которая подключается, и я просто не могу понять, как это обеспечить. –

+0

Ну, классы - это всего лишь совокупность методов, с вашей точки зрения - если вы захватываете методы и регистрируете их вызовы с параметрами, вы получите что-то. –

0

Единственный надежный способ - отладить вашу программу (используя любой отладчик, такой как OllyDBG), и установить точку останова на требуемой функции экспорта. Затем вы можете просто отслеживать параметры стека, отправленные вызывающей функции. Это только начало, вам нужно полностью проанализировать функциональные команды в отладчике или дизассемблере, чтобы узнать, что делает каждый параметр, и его тип.

Смежные вопросы