Re[4]: приведение адреса метода
От: dar veter Россия  
Дата: 22.01.03 10:17
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, dar veter, Вы писали:


ПК>>>Компилятор может хранить смещение в vtbl, адрес функции или еще что-нибудь — это его личное дело. Главное, чтобы полученный объект можно было использовать для косвенных вызовов методов класса C.


DV>> И всего прочитаного я понял так, что на уровне разработки программы я не могу встроить код дешифровки, так

DV>> как я не могу с точночтью определить область памяти, где находится процедура для терзания ?

ПК>Более того, даже если ты сможешь определить адрес (а платформенно-зависимые методы, естественно, имеются), далеко не на всех системах ты сможешь модифицировать само тело функции по указанному адресу.

Рассматривается только система Windows, а она позволяет модифицировать тело функции по указаному адресу.
И потом AsProtect работает и модифицирует код, но там другая система

DV>> Если так, то получается что в коде необходимо предусматривать место для встраивания кода дешифровки.....


ПК>Похоже, ты выбрал неверный инструмент для своей задачи.

Возможно .....

DV>> А внешней патчилкой выполнять данную ставку и криптовать функцию ???


ПК>Лучше подними новый топик в соответствующем форуме ("Win API" или "Низкоуровневое программирование").

Окей.... но пожалуй я останавлюсь и не буду разводить еще один флейм.....


to All: Всем спасибо, кто откликнулся ... Я очень Вам всем благодарен, за то что поучили чайника
Re[4]: приведение адреса метода
От: dar veter Россия  
Дата: 22.01.03 10:19
Оценка:
Здравствуйте, Dima2, Вы писали:

D>Здравствуйте, dar veter, Вы писали:


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

Спасибо за урл.... я как раз этим занимаюсь
Re[3]: приведение адреса метода
От: Андрей Тарасевич Беларусь  
Дата: 22.01.03 18:38
Оценка:
Здравствуйте, dar veter, Вы писали:

DV>>>Помогите чайнику в моей проблеме....


DV>>>Есть класс

DV>>>
DV>>>class C
DV>>>{
DV>>>   private:
DV>>>     void Proc1(char *c);
DV>>>     void Proc2(void);
DV>>>}

DV>>>void C::Proc1(char *c)
DV>>>{
DV>>>}

DV>>>void C::Proc2(void)
DV>>>{
DV>>>  int addr;
DV>>>  unsigned char *buffer;
DV>>>  void (C::*ptr)(char *) = &C::Proc1;
DV>>>  addr = (int)ptr; // ошибка type cast
DV>>>  buffer = (unsigned char*)ptr; // ошибка type cast
DV>>>}
DV>>>


DV>>>Если я правильно понимаю, то в ptr хранится должен быть адрес метода Proc1 ??

DV>>>Или что то другое ????

DV>>>Как мне выполнить приведение ptr к числу .... (int)ptr непрокатывает, ошибка "type cast" ?

DV>>>И как мне выполнить приведение памяти по адресу ptr к массиву символов ....
DV>>>(unsigned char*)ptr .... таже ошибка....

DV>>>Заранее спасибо за ответ.... Вот такая мне кривость понадобилась ....

DV>>>P.S.В предыдущих топиках ... Address Methods ... и Адрес Метода ответа не нашел

EW>>

EW>>
EW>>union Test
EW>>{
EW>>  int addr;
EW>>  void (C::*ptr)(char *);
EW>>};

EW>>Test func;
EW>>func.ptr = &C::Proc1;
EW>>int iVal = func.addr;
EW>>


EW>>Ed.ward


DV>Работает однако .... видно мне С еще учить и учить


К С (илди С++) это никакого отношения не имеет. Рассматриваемое привдение типа в С++ невозможно в принципе. О чем тебе и сообщает компилятор. Зачем ты пытаешься его произвести — я не знаю.
Best regards,
Андрей Тарасевич
Re[4]: приведение адреса метода
От: dar veter Россия  
Дата: 23.01.03 11:22
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

[skipped]

АТ>К С (илди С++) это никакого отношения не имеет. Рассматриваемое привдение типа в С++ невозможно в принципе. О чем тебе и сообщает компилятор. Зачем ты пытаешься его произвести — я не знаю.

Я уже это понял... а всякие другие извраты могут привести к краху.... мне это объяснил Павел Кузнецов.
Нужно мне было это для получения адреса памяти функции для ее декриптовки.... занимаюсь проблемой защиты своих
программ. Вообщем нашел я другое решение ... немного кривое ... но вроде работает на 100% .... пользуюсь тем, что
компилятор делает флат-модель кода
Re[5]: приведение адреса метода
От: Dima2  
Дата: 23.01.03 14:47
Оценка:
Здравствуйте, dar veter, Вы писали:

DV> программ. Вообщем нашел я другое решение ... немного кривое ... но вроде работает на 100% .... пользуюсь тем, что

DV> компилятор делает флат-модель кода

Ну уж раскажи тогда, а то прям заинтриговал.
Re[6]: приведение адреса метода
От: dar veter Россия  
Дата: 27.01.03 07:19
Оценка:
Здравствуйте, Dima2, Вы писали:

D>Здравствуйте, dar veter, Вы писали:


DV>> программ. Вообщем нашел я другое решение ... немного кривое ... но вроде работает на 100% .... пользуюсь тем, что

DV>> компилятор делает флат-модель кода

D>Ну уж раскажи тогда, а то прям заинтриговал.

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

extern "C" __declspec( naked ) void StartSecretFunc(void)
{
}

void C::SecretFunc(...)
{
   здесь что-то ....
}

extern "C" __declspec( naked ) void EndSecretFunc(void)
{
}


В итоге получаю, что взятие адреса &StartSecretFunc равно адресу области памяти
метода класса &C::SecretFunc. Я думаю это связано с создание компилятора флат-модели кода.
Ну а дальше выполняю дикриптовку секретной функции, выполняю ее и криптую заново...
Пока работает, проверил на 8 компах и разных операционках ... от Win95 OSR2 до Win2000 Prof....
XP только не тестил ... нету у меня ее....
P.S. Возможно профи мне возразят ... и я не претендую на свой профионализм.... Так как хорошо знаю
только язык Паскаль в Борландской интерпритации (9 лет). "С" всегда знал по скольку по стольку, на
базовом уровне.
Re[7]: приведение адреса метода
От: Dima2  
Дата: 27.01.03 09:18
Оценка:
Здравствуйте, dar veter, Вы писали:

DV>В итоге получаю, что взятие адреса &StartSecretFunc равно адресу области памяти

DV>метода класса &C::SecretFunc.

Ух... круто. Сомневаюсь что на это можно положится. Тестить на разных ОС наверное не надо, надо тестить с разными установками компилятора, линкера.
Re[8]: приведение адреса метода
От: dar veter Россия  
Дата: 27.01.03 10:15
Оценка:
Здравствуйте, Dima2, Вы писали:

D>Здравствуйте, dar veter, Вы писали:


DV>>В итоге получаю, что взятие адреса &StartSecretFunc равно адресу области памяти

DV>>метода класса &C::SecretFunc.

D>Ух... круто. Сомневаюсь что на это можно положится. Тестить на разных ОС наверное не надо, надо тестить с разными установками компилятора, линкера.


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

P.S. Правда проверил на Borland C++ 5.5 free compiler ... такая фигня не прокатила,пока не разбирался в
чем собака порыта. Некогда,кушать охота ... Будет время, деассемблирую его код и гляну, в чем дело.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.