Сейчас на форуме: zds, UniSoft (+5 невидимых)

 eXeL@B —› Программирование —› Отладка программы при подключенной защищенной dll
Посл.ответ Сообщение


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

Создано: 13 марта 2013 15:56
· Личное сообщение · #1

Ситуация такова: имеется либа защищенная протектором и h файл к ней. При подключении её к своей проге в дебаг режиме при запуске проги возникает исключение "exception 0xC0000096: Privileged instruction" на инструкции rdtsc. В релиз режиме (или дебаг ехе запущенный из системы) всё работает без вопросов. Подскажите, что нужно сделать чтобы иметь возможность отладки своей проги в VisualStudio? Что там в либе мне по барабану...

-----
Everything is relative...





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

Создано: 13 марта 2013 16:10
· Личное сообщение · #2

попробовать ставить свой перехватчик исключений в проге?
потому что в дебаге, дебаггер свои выставляет
но не прибьет ли дебагер уже установленый..




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

Создано: 13 марта 2013 16:15
· Личное сообщение · #3

reversecode
Исключается, т.к. до исполнения моего кода дело не доходит, исключение системное при загрузке либы, как я понимаю в её функции DllMain. Либа линкуется к проге статически.

-----
Everything is relative...





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

Создано: 13 марта 2013 16:27 · Поправил: reversecode
· Личное сообщение · #4

что то мне подсказывает.., длл имеет просто защиту от отладки

что то я подзабыл, rdtsc в винде привелигированая на ring3 ?




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

Создано: 13 марта 2013 16:36
· Личное сообщение · #5

reversecode
Может быть и имеет, но дело не в ней, происходит не обнаружение дебагера, а исключение на привилегированной инструкции.

-----
Everything is relative...





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

Создано: 13 марта 2013 16:40 · Поправил: reversecode
· Личное сообщение · #6

rdtsc не привелигированая как мне помнится в винде..
и если она вдруг оказывается привелигированой, то может иметь место защита от отладчика
имхо

набросайт мини стест в студии
#include <intrin.h>
#pragma intrinsic(__rdtsc)

unsigned __int64 rdtsc() {
return __rdtsc();
}
......
итд


и узнаешь поднимает ли дебарег ексепшен на полупривелигироване инструкции или это защита меняет cr4




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 13 марта 2013 17:02
· Личное сообщение · #7

RDTSC в винде разрешена. Если реально именно она бросает исключение, то без драйвера, видимо, не обошлось.

| Сообщение посчитали полезным: Dr0p


Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 13 марта 2013 22:01
· Личное сообщение · #8

Надо смотреть второй бит регистра cr4.

-----
http://ntinfo.biz




Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 13 марта 2013 22:37 · Поправил: r_e
· Личное сообщение · #9

Вариант без драйвера.
Протекченная ДЛЛ - IPC Сервер - [IPC Client :: DLL Proxy :: Отлаживаемый код]
[] - твой проект.

Расписывать надо?

-----
старый пень


| Сообщение посчитали полезным: TLN, Vamit


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

Создано: 14 марта 2013 09:55
· Личное сообщение · #10

r_e
Похоже так оно и есть, расписывать не нужно, а вот ответ на вопрос как же организовать отладку своего кода не помешал бы.

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

-----
Everything is relative...





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

Создано: 14 марта 2013 10:17
· Личное сообщение · #11

а почему не снять защиту и отлаживать?
либо обратиться к разработчикам той защищенной либы которые явно перегнули палку




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

Создано: 14 марта 2013 10:27
· Личное сообщение · #12

reversecode
А вы может полностью снять вмпрот с либы? Лично я - нет. Можно и к разработчику, только там сумма за полный SDK с 4 нулями баксов.

-----
Everything is relative...





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

Создано: 14 марта 2013 10:32 · Поправил: reversecode
· Личное сообщение · #13

отписать разработчикам - "убейтесь ап стену, кому нужна SDK с которой нельзя отлаживать" ?
Vamit пишет:
Можно и к разработчику, только там сумма за полный SDK с 4 нулями баксов.

мб она уже и не крипченая? тогда понятно...

даже интересно, из какой области SDK, гейм дев?



Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 14 марта 2013 11:29
· Личное сообщение · #14

Vamit
А в чем проблема с отладкой в приведенной схеме? Результат для твоей проги будет идентичен оригиналу.

-----
старый пень





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

Создано: 14 марта 2013 12:14
· Личное сообщение · #15

r_e
Проблема в создании сервер/клиент, из либы экспортируется класс с виртуальными функами, следовательно обращение из проги в либу к такой функе идет не через импорт а через vftable класса, но стандартный интерфейс в базе от IUnknown не реализован.

-----
Everything is relative...




Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 14 марта 2013 19:32
· Личное сообщение · #16

Vamit
Виртуальный или не виртуальный - разницы никакой. У тебя есть публичный интерфейс класса, описанный в заголовочниках SDK и с которым ты работаешь из своего ПО. Для тебя - это и есть front end. Что там внутри тебе без разницы. Хоть IPC, хоть оригинальная DLL.

-----
старый пень





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

Создано: 15 марта 2013 16:49
· Личное сообщение · #17

Vamit пишет:
полностью снять вмпрот с либы

а патч либы?




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 15 марта 2013 20:52 · Поправил: ARCHANGEL
· Личное сообщение · #18

Эммм, аж неудобно как-то. А распишите для меня, дурака, что тут пытаются сделать. Как я понимаю, есть некое приложение (ехе), которое имеет в таблице импорта (статическая линковка) функции из некоей либы, защищённой вмпротом. Чтоб такое эффективно отлаживать без отладки кода самой библиотеки, делается примерно следующее. Создаётся библиотека с таким же именем, как и у протекченной. У неё создаются такие же экспорты с такими же сигнатурами вызовов. Сам код по-прежнему хранится и вызывается из протекченной либы. Т.е. на данном этапе имеем 3 файла:

1. Ехе, который хотим отладить.
2. VmprotDll - упакованная либа.
3. ProxyDll - промежуточная либа.

Как я понял, это всё как-то увязывается в кучу через COM. Т.е. где-то есть COM-сервер, COM-клиент обращается к нему, COM-клиент - это ProxyDll, сервер вызывает функции из VmprotDll и возвращает результат клиенту. А вот непонятно, как этот сервер реализовать, т.е. как сделать так, что он вызывал функции из VmprotDll и передавал результат в ProxyDll, и чтоб это всё работало.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 15 марта 2013 22:30 · Поправил: r_e
· Личное сообщение · #19

Ухх.. судя по всему многим непонятно как сделать так чтоб защищенная длл выполнялась в независимом "домене".
Итак, исходная конфигурация:
А. Протекченная ДЛЛ (sdk.dll)
Б. Отлаживаемый проект. Способ линковки роли не играет.

Задача, вывести протекченную длл мз контекста выполняемого приложения.

Из условий задачи у нас есть хедер sdk.h с публичным API, через который мы работаем с sdk.dll.
Берем sdk.h и реализуем публичный интерфейс как показано ниже. Будет ли это static lib, dynamic lib или вообще прямо в проекте пара доп файлов - разницы никакой.
Реализация не выполняет ничего, кроме переброски вызовов через IPC в другой контекст (на сервер). IPC - это любая из технологий межпроцессного взаимодействия: pipes, sockets, shared memory, com, windows messages, mailboxes, etc.
Соответственно, прийдется реализовать и сервер. Который принимает запросы от клиента и преобразует их в вызовы протекченной dll.

Code:
  1. Псевдокодом.
  2. SDK public interface
  3. sdk.h
  4. DLL_API class A {
  5. public:
  6.    int Run(int Value);
  7. };
  8.  
  9. Наша подмена
  10. sdk.cpp
  11. class IpcNode {
  12. public:
  13.   virtual void Call(IoBuffer&) = 0;
  14. };
  15.  
  16. class SocketClientNode : public IpcNode {
  17. ...
  18. };
  19.  
  20. int A::Run(int Value)
  21. {
  22.    IoBuffer lIoBuffer;
  23.    lIoBuffer.AddParameter(name => "$$Command$$", value => "Run");
  24.    lIoBuffer.AddParameter(name => "Value", value => Value);
  25.    IpcNode_->Send(lIoBuffer);
  26.    return lIoBuffer.GetParameter(name => "$$Result$$").AsInt();
  27. }
  28.  
  29. Наш сервер:
  30. server.cpp
  31. class ServerIpcNode {
  32. public:
  33.    virtual void DispatchLoop() = 0;
  34. };
  35.  
  36. class ServerCommandCenter : public class ServerIpcNode {
  37. public:
  38.    virtual void DispatchLoop()
  39.    {
  40.        IoBuffer lIoBuffer;
  41.        while (Ipc_->WaitForNewCommand(lIoBuffer))
  42.        {
  43.               switch (lIoBuffer.GetParameter(name => "$$Command$$"))
  44.               {
  45.               ...........
  46.               }
  47.               Ipc_->SendReply(lIoBuffer);
  48.         }
  49.    }
  50.  
  51.    void ServerCommandRun(IoBuffer& params)
  52.    {
  53.       int lValue = params.GetParameter(name => "Value").AsInt();
  54.       params.SetParameter(name => "$$Result$$", value => A.Run(lValue)); /// Вызов DLL выполняется в контексте сервера
  55.    }
  56. };


Возможно, проще запрятать отладчик =)

-----
старый пень


| Сообщение посчитали полезным: ARCHANGEL


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 15 марта 2013 22:53
· Личное сообщение · #20

А, вот как. Т.е. есть левый ехе, который мы именуем сервером. Он вызыает функции из протекченной библиотеки. А результат по запросу предоставляет другому приложению (тоже ехе). А это приложение (второй ехе) мы как раз и хотим отладить. Ясно, концепция понятна, но не всегда применима. Вот вернёт мне эта протекченная библиотека указатель, а он валидный только в контексте сервера. А этот указатель, возможно, указывает на структуру, в которой половина полей - тоже указатели, и т.д. Тоска, возможно, действительно проще прятать отладчик (юзать олли для дебага).

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 15 марта 2013 23:16 · Поправил: r_e
· Личное сообщение · #21

ARCHANGEL
Проблема указателей существовала всегда. Частично она решается следующим образом.
Если СДК возвращает указатель на что-то чья структура известна. Это что-то сериализуется и передается клиенту. На клиенте оно тем же образом воспроизводится в структуру и возвращается валидный указатель уже приложению.
Если что-то неизвестно, то неважно что вернула либа. Для приложения оно никакого смысла не несет.

Почитай boost::serialization и рядом.

-----
старый пень



 eXeL@B —› Программирование —› Отладка программы при подключенной защищенной dll
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати