DV>Если я правильно понимаю, то в ptr хранится должен быть адрес метода Proc1 ??
Далеко не обязательно.
DV>Или что то другое ????
Компилятор может хранить смещение в vtbl, адрес функции или еще что-нибудь — это его личное дело. Главное, чтобы полученный объект можно было использовать для косвенных вызовов методов класса C.
DV>Как мне выполнить приведение ptr к числу ....
Или через union, как указал Ed.ward, или через reinterpret_cast<int&>(ptr). Однако следует понимать, что полученное число далеко не обязательно содержит адрес, является уникальным или соответствует каким-либо другим подобным ожиданиям. Кроме того, если сделать с полученными числами обратную операцию, далеко не обязательно можно будет использовать полученные указатели на члены по прямому назначению.
>como test.cpp
Comeau C/C++ 4.3.0.1 (Aug 21 2002 15:45:32) for MS_WINDOWS_x86
Copyright 1988-2002 Comeau Computing. All rights reserved.
MODE:strict warnings C++
>aout
E::f, E
E::g, E
F::f, F
F::f, F
C::h, C
C::i, C
G::f, G
G::f, G
C::h, C
C::i, C
F::f, F
F::f, F
C::h, C
C::i, C
65536
131072
4294901760
4294901760
65536
131072
4294901760
4294901760
---------------------------
aout.exe - Application Error
---------------------------
The instruction at "0x00010005" referenced memory at "0x3a003a00". The memory could not be "written".
Click on OK to terminate the program
Click on CANCEL to debug the program
---------------------------
OK Cancel
---------------------------
>g++ test.cpp
>a
E::f, E
E::g, E
F::f, F
F::f, F
C::h, C
C::i, C
G::f, G
G::f, G
C::h, C
C::i, C
F::f, F
F::f, F
C::h, C
C::i, C
1
5
4222320
4222388
1
5
4222480
4222548
E::f,
---------------------------
a.exe - Application Error
---------------------------
The instruction at "0x00406e68" referenced memory at "0x00636d77". The memory could not be "read".
Click on OK to terminate the program
Click on CANCEL to debug the program
---------------------------
OK Cancel
---------------------------
>cl /GX /vmg test.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.00.9466 for 80x86
Copyright (C) Microsoft Corporation 1984-2001. All rights reserved.
test.cpp
Microsoft (R) Incremental Linker Version 7.00.9466
Copyright (C) Microsoft Corporation. All rights reserved.
/out:test.exe
test.obj
>test
E::f, E
E::g, E
F::f, F
F::f, F
C::h, C
C::i, C
G::f, G
G::f, G
C::h, C
C::i, C
F::f, F
F::f, F
C::h, C
C::i, C
4203920
4203936
4198400
4198528
4203920
4203936
4198592
4198656
---------------------------
test.exe - Application Error
---------------------------
The instruction at "0x004010cf" referenced memory at "0x0053245f". The memory could not be "read".
Click on OK to terminate the program
Click on CANCEL to debug the program
---------------------------
OK Cancel
---------------------------
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
class C
{
private:
void Proc1(char *c);
void Proc2(void);
}
void C::Proc1(char *c)
{
}
void C::Proc2(void)
{
int addr;
unsigned char *buffer;
void (C::*ptr)(char *) = &C::Proc1;
addr = (int)ptr; // ошибка type cast
buffer = (unsigned char*)ptr; // ошибка type cast
}
Если я правильно понимаю, то в ptr хранится должен быть адрес метода Proc1 ??
Или что то другое ????
Как мне выполнить приведение ptr к числу .... (int)ptr непрокатывает, ошибка "type cast" ?
И как мне выполнить приведение памяти по адресу ptr к массиву символов ....
(unsigned char*)ptr .... таже ошибка....
Заранее спасибо за ответ.... Вот такая мне кривость понадобилась ....
P.S.В предыдущих топиках ... Address Methods ... и Адрес Метода ответа не нашел
DV>Если я правильно понимаю, то в ptr хранится должен быть адрес метода Proc1 ?? DV>Или что то другое ????
DV>Как мне выполнить приведение ptr к числу .... (int)ptr непрокатывает, ошибка "type cast" ? DV>И как мне выполнить приведение памяти по адресу ptr к массиву символов .... DV>(unsigned char*)ptr .... таже ошибка....
DV>Заранее спасибо за ответ.... Вот такая мне кривость понадобилась .... DV>P.S.В предыдущих топиках ... Address Methods ... и Адрес Метода ответа не нашел
union Test
{
int addr;
void (C::*ptr)(char *);
};
Test func;
func.ptr = &C::Proc1;
int iVal = func.addr;
DV>Если я правильно понимаю, то в ptr хранится должен быть адрес метода Proc1 ??
Да DV>Или что то другое ????
DV>Как мне выполнить приведение ptr к числу .... (int)ptr непрокатывает, ошибка "type cast" ?
Никак, а зечем ?
DV>И как мне выполнить приведение памяти по адресу ptr к массиву символов .... DV>(unsigned char*)ptr .... таже ошибка....
Боюсь, что то же никак.
DV>Заранее спасибо за ответ.... Вот такая мне кривость понадобилась .... DV>P.S.В предыдущих топиках ... Address Methods ... и Адрес Метода ответа не нашел
DV>>Если я правильно понимаю, то в ptr хранится должен быть адрес метода Proc1 ?? DV>>Или что то другое ????
DV>>Как мне выполнить приведение ptr к числу .... (int)ptr непрокатывает, ошибка "type cast" ? DV>>И как мне выполнить приведение памяти по адресу ptr к массиву символов .... DV>>(unsigned char*)ptr .... таже ошибка....
DV>>Заранее спасибо за ответ.... Вот такая мне кривость понадобилась .... DV>>P.S.В предыдущих топиках ... Address Methods ... и Адрес Метода ответа не нашел
EW> EW>
Здравствуйте, Сергей Зизев, Вы писали:
СЗ>Здравствуйте, 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
СЗ> // У тебя ж метод C::Proc1 ничего не возвращает, что ты хочешь получить в addr ?
СЗ> (this->*ptr)("string");
Мне не нужно вызыват метод .... мне надо было адрес метода привести к числу .
DV>> buffer = (unsigned char*)ptr; // ошибка type cast
DV>>}
DV>>
Я смотрел ее....
DV>>Если я правильно понимаю, то в ptr хранится должен быть адрес метода Proc1 ?? СЗ>Да DV>>Или что то другое ????
DV>>Как мне выполнить приведение ptr к числу .... (int)ptr непрокатывает, ошибка "type cast" ? СЗ>Никак, а зечем ?
Предыдущий пример работает ....http://www.rsdn.ru/Forum/Message.aspx?mid=178987&only=1
А нужно мне это.... для того что бы вычислить адрес, размер функции в памяти и закриптовать....
Занимаюсь я проблемой защиты своих программ... Помню тема здесь эта неоднократно поднималась.
DV>>И как мне выполнить приведение памяти по адресу ptr к массиву символов .... DV>>(unsigned char*)ptr .... таже ошибка.... СЗ>Боюсь, что то же никак.
По предыдущему примеру http://www.rsdn.ru/Forum/Message.aspx?mid=178987&only=1
преобразование выполняется как (unsigned char*)func.addr
DV>>Заранее спасибо за ответ.... Вот такая мне кривость понадобилась .... DV>>P.S.В предыдущих топиках ... Address Methods ... и Адрес Метода ответа не нашел
Или я ошибаюсь ?
P.S. Я просто сидел всю свою програмискую жизнь в Delphi а на Сях писал маленькие
процедурки на чистом "С"
B>... А в один прекрасный день все рухнет B>Использование вещей, не разрешенных стандартом может привети к печальным последствиям.
А как же мне быть в моей проблеме ..... ?
Мне нужно вычислить адрес метода размер в байтах и дещифровать его ....
Что же мне делать ?
Здравствуйте, dar veter, Вы писали:
DV>Здравствуйте, Сергей Зизев, Вы писали:
СЗ>>Здравствуйте, dar veter, Вы писали:
<...>
DV> А нужно мне это.... для того что бы вычислить адрес, размер функции в памяти и закриптовать.... DV> Занимаюсь я проблемой защиты своих программ... Помню тема здесь эта неоднократно поднималась.
union AddressConvertor
{
struct addr
{
unsigned long address;
}a;
struct member
{
void (C::*ptr)(char*);
}m;
};
//<...>void (C::*ptr)(char*) = &C::Proc1;
AddressConvertor convertor;
convertor.m.ptr = ptr;
unsigned long addr = convertor.a.address;
Комментарий автора:
Сорри, так то же нельзя. Т.к. согласно 9.2/14 мои две структуры не являются layout-compatible
// Нет никой гарантии, что адрес метода будет меньше либо равен sizeof(unsigned long)
Здравствуйте, Сергей Зизев, Вы писали:
СЗ>Здравствуйте, dar veter, Вы писали:
DV>>Здравствуйте, Сергей Зизев, Вы писали:
СЗ>>>Здравствуйте, dar veter, Вы писали: СЗ><...>
DV>> А нужно мне это.... для того что бы вычислить адрес, размер функции в памяти и закриптовать.... DV>> Занимаюсь я проблемой защиты своих программ... Помню тема здесь эта неоднократно поднималась. СЗ>
СЗ>union AddressConvertor
СЗ>{
СЗ> struct addr
СЗ> {
СЗ> unsigned long address;
СЗ> }a;
СЗ> struct member
СЗ> {
СЗ> void (C::*ptr)(char*);
СЗ> }m;
СЗ>};
СЗ>//<...>
СЗ> void (C::*ptr)(char*) = &C::Proc1;
СЗ> AddressConvertor convertor;
СЗ> convertor.m.ptr = ptr;
СЗ> unsigned long addr = convertor.a.address;
СЗ> // Нет никой гарантии, что адрес метода будет меньше либо равен sizeof(unsigned long)
СЗ>
Это может произойти, если у меня программ грузится не по Image Base 400000 так ?
То есть мне необходимо контролировать, что бы адрес функции не вышел за пределы unsigned long ?
А как быть в этом случае ??
СЗ> СЗ><...>
ПК>Компилятор может хранить смещение в vtbl, адрес функции или еще что-нибудь — это его личное дело. Главное, чтобы полученный объект можно было использовать для косвенных вызовов методов класса C.
И всего прочитаного я понял так, что на уровне разработки программы я не могу встроить код дешифровки, так
как я не могу с точночтью определить область памяти, где находится процедура для терзания ?
Если так, то получается что в коде необходимо предусматривать место для встраивания кода дешифровки.....
А внешней патчилкой выполнять данную ставку и криптовать функцию ???
Здравствуйте, dar veter, Вы писали:
ПК>>Компилятор может хранить смещение в vtbl, адрес функции или еще что-нибудь — это его личное дело. Главное, чтобы полученный объект можно было использовать для косвенных вызовов методов класса C.
DV> И всего прочитаного я понял так, что на уровне разработки программы я не могу встроить код дешифровки, так DV> как я не могу с точночтью определить область памяти, где находится процедура для терзания ?
Более того, даже если ты сможешь определить адрес (а платформенно-зависимые методы, естественно, имеются), далеко не на всех системах ты сможешь модифицировать само тело функции по указанному адресу.
DV> Если так, то получается что в коде необходимо предусматривать место для встраивания кода дешифровки.....
Похоже, ты выбрал неверный инструмент для своей задачи.
DV> А внешней патчилкой выполнять данную ставку и криптовать функцию ???
Лучше подними новый топик в соответствующем форуме ("Win API" или "Низкоуровневое программирование").
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Здравствуйте, dar veter, Вы писали:
ПК>>>Компилятор может хранить смещение в vtbl, адрес функции или еще что-нибудь — это его личное дело. Главное, чтобы полученный объект можно было использовать для косвенных вызовов методов класса C.
DV>> И всего прочитаного я понял так, что на уровне разработки программы я не могу встроить код дешифровки, так DV>> как я не могу с точночтью определить область памяти, где находится процедура для терзания ?
ПК>Более того, даже если ты сможешь определить адрес (а платформенно-зависимые методы, естественно, имеются), далеко не на всех системах ты сможешь модифицировать само тело функции по указанному адресу.
Рассматривается только система Windows, а она позволяет модифицировать тело функции по указаному адресу.
И потом AsProtect работает и модифицирует код, но там другая система
DV>> Если так, то получается что в коде необходимо предусматривать место для встраивания кода дешифровки.....
ПК>Похоже, ты выбрал неверный инструмент для своей задачи.
Возможно .....
DV>> А внешней патчилкой выполнять данную ставку и криптовать функцию ???
ПК>Лучше подними новый топик в соответствующем форуме ("Win API" или "Низкоуровневое программирование").
Окей.... но пожалуй я останавлюсь и не буду разводить еще один флейм.....
to All: Всем спасибо, кто откликнулся ... Я очень Вам всем благодарен, за то что поучили чайника
Здравствуйте, Dima2, Вы писали:
D>Здравствуйте, dar veter, Вы писали:
D>прочитай внимательно топик, который я дал, там есть ответы на твои вопросы, и несколько вариантов защиты криптованием кода программы.
Спасибо за урл.... я как раз этим занимаюсь
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>>Ed.ward
DV>Работает однако .... видно мне С еще учить и учить
К С (илди С++) это никакого отношения не имеет. Рассматриваемое привдение типа в С++ невозможно в принципе. О чем тебе и сообщает компилятор. Зачем ты пытаешься его произвести — я не знаю.
[skipped]
АТ>К С (илди С++) это никакого отношения не имеет. Рассматриваемое привдение типа в С++ невозможно в принципе. О чем тебе и сообщает компилятор. Зачем ты пытаешься его произвести — я не знаю.
Я уже это понял... а всякие другие извраты могут привести к краху.... мне это объяснил Павел Кузнецов.
Нужно мне было это для получения адреса памяти функции для ее декриптовки.... занимаюсь проблемой защиты своих
программ. Вообщем нашел я другое решение ... немного кривое ... но вроде работает на 100% .... пользуюсь тем, что
компилятор делает флат-модель кода
Здравствуйте, dar veter, Вы писали:
DV> программ. Вообщем нашел я другое решение ... немного кривое ... но вроде работает на 100% .... пользуюсь тем, что DV> компилятор делает флат-модель кода
Здравствуйте, Dima2, Вы писали:
D>Здравствуйте, dar veter, Вы писали:
DV>> программ. Вообщем нашел я другое решение ... немного кривое ... но вроде работает на 100% .... пользуюсь тем, что DV>> компилятор делает флат-модель кода
D>Ну уж раскажи тогда, а то прям заинтриговал.
Ну не знаю на сколько действительно для других компиляторов, но для MSVC 6.0 действительно ....
что я делаю ... перед искомой процедурой пишу абстрактную процедуру типа :
В итоге получаю, что взятие адреса &StartSecretFunc равно адресу области памяти
метода класса &C::SecretFunc. Я думаю это связано с создание компилятора флат-модели кода.
Ну а дальше выполняю дикриптовку секретной функции, выполняю ее и криптую заново...
Пока работает, проверил на 8 компах и разных операционках ... от Win95 OSR2 до Win2000 Prof....
XP только не тестил ... нету у меня ее....
P.S. Возможно профи мне возразят ... и я не претендую на свой профионализм.... Так как хорошо знаю
только язык Паскаль в Борландской интерпритации (9 лет). "С" всегда знал по скольку по стольку, на
базовом уровне.
Здравствуйте, dar veter, Вы писали:
DV>В итоге получаю, что взятие адреса &StartSecretFunc равно адресу области памяти DV>метода класса &C::SecretFunc.
Ух... круто. Сомневаюсь что на это можно положится. Тестить на разных ОС наверное не надо, надо тестить с разными установками компилятора, линкера.
Здравствуйте, Dima2, Вы писали:
D>Здравствуйте, dar veter, Вы писали:
DV>>В итоге получаю, что взятие адреса &StartSecretFunc равно адресу области памяти DV>>метода класса &C::SecretFunc.
D>Ух... круто. Сомневаюсь что на это можно положится. Тестить на разных ОС наверное не надо, надо тестить с разными установками компилятора, линкера.
Эх .... проверял ... вроде работает(постучу по деревяжке), в программе уже таким способом закриптовано 4
процедуры из разных классов .... и потом более лучщего решения я не нашел ... да и времени на поиск его нет.
Может всетаки куплю AsProtect в будующем ... а пока оставлю так как есть
P.S. Правда проверил на Borland C++ 5.5 free compiler ... такая фигня не прокатила,пока не разбирался в
чем собака порыта. Некогда,кушать охота ... Будет время, деассемблирую его код и гляну, в чем дело.