Сейчас на форуме: Rio, johnniewalker, vsv1 (+6 невидимых)

 eXeL@B —› Крэки, обсуждения —› Как сопоставить IDL-описание с реальным кодом?
Посл.ответ Сообщение

Ранг: 18.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 14 июня 2011 00:10
· Личное сообщение · #1

Есть библиотека (COM), в описании TYPELIB четко видно необходимую функцию - SetLicenseKey:
Code:
  1. //method SetLicenseKey
  2. function SetLicenseKey(key: BSTR); stdcall;

как найти ее адрес?

Сама библиотечка (x86).

P.S. Слышал, есть плагин для IDA, который реализует эту функциональность, но разобраться не смог (под 5.5 не заводится).




Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 14 июня 2011 00:25
· Личное сообщение · #2

Методы COM-интерфейсов располагаются в таблице в том же порядке, в каком объявлены. Берём vptr интерфейса и отсчитываем n-ю функцию (не забываем считать все m функций всех интерфейсов-предков)... Смотреть сам не буду - там ничего сложного Есть вероятность ошибки, поэтому лучше проверить в отладчике.

-----
IZ.RU





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 июня 2011 00:35
· Личное сообщение · #3

uinor в теме использование IDA
вроде уже было это
там утилита ms-овская есть
которая показывает idl или генерирует.. как то так
http://exelab.ru/f/action=vthread&forum=1&topic=12507
посмотрите 16-17 страницу кажись
о typelib



Ранг: 18.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 14 июня 2011 00:53
· Личное сообщение · #4

MS утилиту первым делом посмотрел, есть проблема:
ComTypeLibDump - дампит без проблем саму TLB, но не показывает оффсетов
CoClassSyms - которая должна генерить DBG/MAP молчит, ничего не выдает

Пробовал еще утилитку с wasm'a:
com_va - выдает лишь кусок дампа (часть пропертей), функции с оффсетами не показывает

@DenCoder, крайне нежелательно через отладчик идти, либа буйная, у меня столько опыта не будет. В любом случае, спасибо.



Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 14 июня 2011 01:19
· Личное сообщение · #5

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



Ранг: 18.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 14 июня 2011 01:23 · Поправил: uinor
· Личное сообщение · #6

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


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

@DenCoder, получил оффсет (0xD4) этого метода, но есть проблема с vptr, ибо CoCreateInstance проваливается.

Использую com_va утилиту:
Code:
  1. unsigned fCount = lpIntAttr->cFuncs;
  2. for(unsigned k = 0; k < fCount; k++)
  3. {
  4.          FUNCDESC* fdesc = 0;
  5.          $$$pInfo->GetFuncDesc(k, &fdesc);
  6.  
  7.          pInfo->GetDocumentation(fdesc->memid, &bstrName, 0, 0, 0);
  8.  
  9.          LPVOID iUnk = 0;
  10.          if (!LOWORD($$$CoCreateInstance(clsid, 0, CLSCTX_ALL, iid, &iUnk)))
  11.          {
  12.                 BYTE* pVTable = (BYTE*)*(DWORD*)(iUnk);
  13.                  DWORD pFunction = *(DWORD*)(pVTable + fdesc->oVft);
  14.                                             
  15.                  wcout.unsetf( ios_base::dec );
  16.                  wcout.setf( ios_base::hex );
  17.                  wcout.width(8);
  18.                  wcout << "\t\t" << lpFuncType[fdesc->funckind] << " " << bstrName << " VA: 0x" << pFunction << " Offset: 0x" << fdesc->oVft << endl;
  19.          }
  20.  
  21.          SysFreeString(bstrName);
  22.          pInfo->ReleaseFuncDesc(fdesc);
  23. }

Получил описание функции (первый $$$), поле oVft на руках, но CoCreateInstance (второй $$$) эпично проваливается. Аналогично пробовал породить ICMap (задолго до) еще в своем проекте - бесполезно, падает. Вываливается с REGDB_E_CLASSNOTREG.



Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 14 июня 2011 02:29
· Личное сообщение · #7

мож разберёшся - нашел из старого

ComHooks 1.0 - COM hooking, COM hooks, DLL loading
- before asking questions and reporting problems
have a look at this Update list, re-download ComHooks and read documentation and all examples carefully.
http://web.archive.org/web/20030419031831/http://www.anticracking.sk/elicz/export/CHUpdate.txt
http://web.archive.org/web/20030419031831/http://www.anticracking.sk/elicz/export/CH10.ZIP



Ранг: 18.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 14 июня 2011 03:09 · Поправил: uinor
· Личное сообщение · #8

Ratinsh пишет:
мож разберёшся - нашел из старого


Хуки, к сожалению, ничем не помогут. Ровно, как и мониторинг в целом. У меня нет приложения-инициатора.

Буквально пару минут назад попробовал его создать. Копнул чуть поглубже, увидел в AspMapUtil.dll экспортированную функцию CreateUtil. Посмотрел нутро - там одним из параметров передается GUID, он сравнивается со списком и в зависимости от GUID'a порождается класс + возвращается интерфейс. Первое же условие - проверка на {5C2EA2B2-4F5D-11D4-A1CF-C1BD8A54860E} (это GUID ICMap'a, чей метод SetLicenseKey я анализирую).

Набросал небольшую утильку:
Code:
  1. type
  2.   TCreateFunc = function (guid: PGUID; var value: IInterface): Integer; cdecl;
  3.  
  4. var
  5.   hLib: THandle;
  6.   hProc: Pointer;
  7.   RetValue: IInterface;
  8.   MyMap: ICMap;
  9.  
  10. begin
  11.   if FileExists('AspMapUtil.dll') then
  12.   begin
  13.     hLib := LoadLibrary('AspMapUtil.dll');
  14.     if (hLib <> 0) then
  15.     begin
  16.       hProc := GetProcAddress(hLib, 'CreateUtil');
  17.       if (hProc <> nil) then
  18.       begin
  19.         RetValue := nil;
  20.         if (TCreateFunc(hProc)(@CLASS_Map, RetValue) = 1) then
  21.         begin
  22.           Writeln('Good news everyone!');
  23.  
  24.           // Пробуем поиграться
  25.           MyMap := RetValue as ICMap;
  26.           MyMap.SetLicenseKey('abba');
  27.         end;
  28.       end;
  29.     end;
  30.   end;
  31. end.


Теперь загнал в ольгу, сделал Step Into на переходе (с учетом оффсета 0xD4, который) в тело AspMapUtil.dll, но меня ждало разочарование - влетаю 100% не туда, куда нужно (100146D0). В чем может быть трабла?

Upd1: Проверил работоспособность методов ICMap'a - все работают. К примеру,
Code:
  1. MyMap.SaveImage('Temp.bmp');
сохраняет картинку как и должен Следовательно свой собственный пусковой механизм сделан, осталось понять в чем соль - либо меня кидает не туда (ну бредовый код по адресу), либо что-то другое. Прошу помощи.



Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 14 июня 2011 04:28
· Личное сообщение · #9

вот ещё попробуй
http://www.techvanguards.com/products/typeexport/
http://www.techvanguards.com/files/TypeExport.zip



Ранг: 18.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 14 июня 2011 05:07
· Личное сообщение · #10

Ratinsh пишет:
вот ещё попробуй


Спасибо, но не в тему.




Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 14 июня 2011 14:14
· Личное сообщение · #11

uinor пишет:
ну бредовый код по адресу

От MyMap.SetLicenseKey('abba') дойди до rpcrt4 и посмотри стек вызовов. Дай его нам заодно

-----
IZ.RU



 eXeL@B —› Крэки, обсуждения —› Как сопоставить IDL-описание с реальным кодом?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати