понедельник, 26 июля 2010 г.

Подмена dll зная CLSID КоСервера

Исследуя недавно Windows Messenger, задался вопросом: "а как внедрить в его адресное пространство процесса свою dll ?". Именно об этом эта заметка:



1)
Благодаря WinAPIOverride32 получаем лог вызовов функций из ole32.dll, мы
видим создание КоОбъектов на основании GUID-ов, вот они:

CoCreateInstance(rclsid: 0x7770D17C: 00000323-0000-0000-C000-000000000046
CoCreateInstance(rclsid: 0x0006FAA8: 0C7EFBDE-0303-4C6F-A4F7-31FA2BE5E397
CoCreateInstance(rclsid: 0x6C3513C8: 0E890F83-5F79-11D1-9043-00C04FD9189D
CoCreateInstance(rclsid: 0x6C3512A0: 385A91BC-1E8A-4E4A-A7A6-F4FC1E6CA1BD
CoCreateInstance(rclsid: 0x6C3AA978: 4CB26C03-FF93-11D0-817E-0000F87557DB

2)
Используя GUID-ы и запустив regedit.exe, начал искать нужную dll-ку, с наименьшим количеством функций в таблице экспорта, но чтобы содержала "DllRegisterServer". Меньшее количество экспортируемых функций, нужно для того что бы не создавать много фэйковых функций:

0C7EFBDE-0303-4C6F-A4F7-31FA2BE5E397: C:\WINDOWS\system32\dxtmsft.dll

Теперь заглянем в Hiew и посмотрим на экспортируемые функции:

1 .6C39552E DllCanUnloadNow
2 .6C3955B1 DllEnumClassObjects
3 .6C39553F DllGetClassObject
4 .6C395561 DllRegisterServer
5 .6C395576 DllUnregisterServer

Найдем еще одну, вдруг еще меньше экспортов будет:

0E890F83-5F79-11D1-9043-00C04FD9189D,
4CB26C03-FF93-11D0-817E-0000F87557DB,
385A91BC-1E8A-4E4A-A7A6-F4FC1E6CA1BD: C:\WINDOWS\system32\dxtrans.dll

1 .6C359312 ?DXConstOverArray@@YGXPAVDXPMSAMPLE@@ABV1@K@Z
2 .6C3593D1 ?DXConstUnderArray@@YGXPAVDXPMSAMPLE@@ABV1@K@Z
3 .6C35946E ?DXDitherArray@@YGXPBUDXDITHERDESC@@@Z
4 .6C35923F ?DXLinearInterpolateArray@@YGXPBVDXBASESAMPLE@>
5 .6C358FF0 ?DXOverArray@@YGXPAVDXPMSAMPLE@@PBV1@K@Z
6 .6C359097 ?DXOverArrayMMX@@YGXPAVDXPMSAMPLE@@PBV1@K@Z
7 .6C3529D0 DllCanUnloadNow
8 .6C352A03 DllEnumClassObjects
9 .6C3529E1 DllGetClassObject
10 .6C353869 DllRegisterServer
11 .6C353889 DllUnregisterServer

Делаем заключение, что длл-ка с именем "dxtmsft.dll" нам больше подходит. Теперь нужно создать с точно с таким же экспортом нашу длл-ку и прописать в значении InprocServer32 свой путь. После того, как будет работать DllMain нужно определить что мы находимся именно в пространстве Windows Messenger'a и подгрузить оригинальную "dxtmsft.dll". Все, с этого момента можно начинать нашу основную работу, менять логику приложения.

Комментариев нет: