Re: приведение адреса метода
От: Павел Кузнецов  
Дата: 22.01.03 09:35
Оценка: 2 (1)
Здравствуйте, dar veter, Вы писали:

DV>
DV>class C
DV>{
DV>   private:
DV>     void Proc1(char *c);
DV>     void Proc2(void);
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>Или что то другое ????


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

DV>Как мне выполнить приведение ptr к числу ....


Или через union, как указал Ed.ward, или через reinterpret_cast<int&>(ptr). Однако следует понимать, что полученное число далеко не обязательно содержит адрес, является уникальным или соответствует каким-либо другим подобным ожиданиям. Кроме того, если сделать с полученными числами обратную операцию, далеко не обязательно можно будет использовать полученные указатели на члены по прямому назначению.

#include <iostream>

class C
{
public:
  C() : c('C') { }

  virtual void f() = 0;
  virtual void g() = 0;

  void h() { std::cout << "C::h, " << c << std::endl; }
  void i() { std::cout << "C::i, " << c << std::endl; }

private:
  char c;
};

class D
{
public:
  virtual void f() = 0;
  virtual void g() = 0;
};

class E
{
public:
  E() : c('E') { }

  void f() { std::cout << "E::f, " << c << std::endl; }
  void g() { std::cout << "E::g, " << c << std::endl; }

private:
  char c;
};

class F : public E, public C
{
public:
  F() : c('F') { }

  virtual void f() { std::cout << "F::f, " << c << std::endl; }
  virtual void g() { std::cout << "F::f, " << c << std::endl; }

private:
  char c;
};

class G : public E, virtual public C
{
public:
  G() : c('G') { }

  virtual void f() { std::cout << "G::f, " << c << std::endl; }
  virtual void g() { std::cout << "G::f, " << c << std::endl; }

private:
  char c;
};

void(C::*cf)() = &C::f;
void(C::*cg)() = &C::g;
void(C::*ch)() = &C::h;
void(C::*ci)() = &C::i;
void(D::*df)() = &D::f;
void(D::*dg)() = &D::g;
void(E::*ef)() = &E::f;
void(E::*eg)() = &E::g;

extern void h(E&, F&, G&);

int main()
{
  E e;
  F f;
  G g;

  h(e, f, g);

  return 0;
}

extern void test(E&, C&, C&);

void h(E& e, F& f, G& g)
{
  test(e, f, g);

  unsigned ucf = reinterpret_cast<unsigned&>(cf);
  unsigned ucg = reinterpret_cast<unsigned&>(cg);
  unsigned uch = reinterpret_cast<unsigned&>(ch);
  unsigned uci = reinterpret_cast<unsigned&>(ci);
  unsigned udf = reinterpret_cast<unsigned&>(df);
  unsigned udg = reinterpret_cast<unsigned&>(dg);
  unsigned uef = reinterpret_cast<unsigned&>(ef);
  unsigned ueg = reinterpret_cast<unsigned&>(eg);

  std::cout << std::endl;

  std::cout << ucf << std::endl;
  std::cout << ucg << std::endl;
  std::cout << uch << std::endl;
  std::cout << uci << std::endl;
  std::cout << udf << std::endl;
  std::cout << udg << std::endl;
  std::cout << uef << std::endl;
  std::cout << ueg << std::endl;

  std::cout << std::endl;

  typedef void(C::*Cf)();
  typedef void(D::*Df)();
  typedef void(E::*Ef)();

  cf = reinterpret_cast<Cf&>(ucf);
  cg = reinterpret_cast<Cf&>(ucg);
  ch = reinterpret_cast<Cf&>(uch);
  ci = reinterpret_cast<Cf&>(uci);
  df = reinterpret_cast<Df&>(udf);
  dg = reinterpret_cast<Df&>(udg);
  ef = reinterpret_cast<Ef&>(uef);
  eg = reinterpret_cast<Ef&>(ueg);

  test(e, f, g);
}

void test(E& e, C& f, C& g)
{
  (e.*ef)();
  (e.*eg)();

  (f.*cf)();
  (f.*cg)();
  (f.*ch)();
  (f.*ci)();

  (g.*cf)();
  (g.*cg)();
  (g.*ch)();
  (g.*ci)();

  typedef void(F::*Ff)();
  typedef void(G::*Gf)();

  Ff ff = static_cast<Ff>(cf);
  Ff fg = static_cast<Ff>(cg);
  Ff fh = static_cast<Ff>(ch);
  Ff fi = static_cast<Ff>(ci);

  (static_cast<F&>(f).*ff)();
  (static_cast<F&>(f).*fg)();
  (static_cast<F&>(f).*fh)();
  (static_cast<F&>(f).*fi)();
}


>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   
---------------------------
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
приведение адреса метода
От: dar veter Россия  
Дата: 22.01.03 08:20
Оценка:
Помогите чайнику в моей проблеме....

Есть класс
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 ... и Адрес Метода ответа не нашел
Re: приведение адреса метода
От: Ed.ward Россия  
Дата: 22.01.03 08:24
Оценка:
Здравствуйте, 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 ... и Адрес Метода ответа не нашел


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

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


Ed.ward
Re: приведение адреса метода
От: Сергей Зизев Украина  
Дата: 22.01.03 08:39
Оценка:
Здравствуйте, 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>


Посмотри вот эту ветку: http://www.rsdn.ru/forum/Message.aspx?mid=178042
Автор: romamoramento
Дата: 21.01.03


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

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

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

Никак, а зечем ?

DV>И как мне выполнить приведение памяти по адресу ptr к массиву символов ....

DV>(unsigned char*)ptr .... таже ошибка....
Боюсь, что то же никак.

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

DV>P.S.В предыдущих топиках ... Address Methods ... и Адрес Метода ответа не нашел
Re: приведение адреса метода
От: Bell Россия  
Дата: 22.01.03 08:42
Оценка:
Здравствуйте, dar veter, Вы писали:

Такое преобразрвание невозможно. reinterpret_cast поддерживает только преобразования pointer-to-member1->pointer-to-member2

Подробнее — 5.2.10 Reinterpret cast
Любите книгу — источник знаний (с) М.Горький
Re[2]: приведение адреса метода
От: dar veter Россия  
Дата: 22.01.03 08:47
Оценка:
Здравствуйте, Ed.ward, Вы писали:

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
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


Работает однако .... видно мне С еще учить и учить
Re: приведение адреса метода
От: m.a.g. Мальта http://dottedmag.net/
Дата: 22.01.03 08:52
Оценка:
Здравствуйте, dar veter, Вы писали:

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


Хинт: int и указатель на метод могут быть разного размера.
... << RammStein [Sehnsucht] Du Hast(German) >> ...
Re[2]: приведение адреса метода
От: dar veter Россия  
Дата: 22.01.03 08:57
Оценка:
Здравствуйте, Сергей Зизев, Вы писали:

СЗ>Здравствуйте, 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>>


СЗ>Посмотри вот эту ветку: http://www.rsdn.ru/forum/Message.aspx?mid=178042
Автор: romamoramento
Дата: 21.01.03

Я смотрел ее....

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

СЗ>Да
DV>>Или что то другое ????

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

СЗ>Никак, а зечем ?
Предыдущий пример работает ....http://www.rsdn.ru/Forum/Message.aspx?mid=178987&amp;only=1
Автор: Ed.ward
Дата: 22.01.03

А нужно мне это.... для того что бы вычислить адрес, размер функции в памяти и закриптовать....
Занимаюсь я проблемой защиты своих программ... Помню тема здесь эта неоднократно поднималась.

DV>>И как мне выполнить приведение памяти по адресу ptr к массиву символов ....

DV>>(unsigned char*)ptr .... таже ошибка....
СЗ>Боюсь, что то же никак.
По предыдущему примеру http://www.rsdn.ru/Forum/Message.aspx?mid=178987&amp;only=1
Автор: Ed.ward
Дата: 22.01.03

преобразование выполняется как (unsigned char*)func.addr

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

DV>>P.S.В предыдущих топиках ... Address Methods ... и Адрес Метода ответа не нашел
Или я ошибаюсь ?
P.S. Я просто сидел всю свою програмискую жизнь в Delphi а на Сях писал маленькие
процедурки на чистом "С"
Re[3]: приведение адреса метода
От: Bell Россия  
Дата: 22.01.03 09:03
Оценка:
Здравствуйте, dar veter, Вы писали:

DV> Предыдущий пример работает ....http://www.rsdn.ru/Forum/Message.aspx?mid=178987&amp;only=1
Автор: Ed.ward
Дата: 22.01.03


... А в один прекрасный день все рухнет
Использование вещей, не разрешенных стандартом может привети к печальным последствиям.
Любите книгу — источник знаний (с) М.Горький
Re[4]: приведение адреса метода
От: dar veter Россия  
Дата: 22.01.03 09:07
Оценка:
Здравствуйте, Bell, Вы писали:

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


DV>> Предыдущий пример работает ....http://www.rsdn.ru/Forum/Message.aspx?mid=178987&amp;only=1
Автор: Ed.ward
Дата: 22.01.03


B>... А в один прекрасный день все рухнет

B>Использование вещей, не разрешенных стандартом может привети к печальным последствиям.
А как же мне быть в моей проблеме ..... ?
Мне нужно вычислить адрес метода размер в байтах и дещифровать его ....
Что же мне делать ?
Re[3]: приведение адреса метода
От: Сергей Зизев Украина  
Дата: 22.01.03 09:08
Оценка:
Здравствуйте, dar veter, Вы писали:

DV>Здравствуйте, Ed.ward, Вы писали:


[skipped...]

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; // Undefined behavior cогласно 9.5/1 
EW>>


EW>>Ed.ward
Re: приведение адреса метода
От: Dima2  
Дата: 22.01.03 09:11
Оценка:
Здравствуйте, dar veter, Вы писали:

См. здесь
http://www.rsdn.ru/forum/?mid=40552
Автор: Karpov
Дата: 31.03.02
Re[3]: приведение адреса метода
От: Сергей Зизев Украина  
Дата: 22.01.03 09:19
Оценка:
Здравствуйте, 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)



<...>
Re[4]: приведение адреса метода
От: dar veter Россия  
Дата: 22.01.03 09:20
Оценка:
Здравствуйте, Сергей Зизев, Вы писали:

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


СЗ>[skipped...]


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; // Undefined behavior cогласно 9.5/1 
EW>>>


Чем грозить это неопределенное поведение (Undefined behavior) ?

EW>>>Ed.ward
Re[4]: приведение адреса метода
От: dar veter Россия  
Дата: 22.01.03 09:24
Оценка:
Здравствуйте, Сергей Зизев, Вы писали:

СЗ>Здравствуйте, 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 ?
А как быть в этом случае ??

СЗ>

СЗ><...>
Re[5]: приведение адреса метода
От: Сергей Зизев Украина  
Дата: 22.01.03 09:38
Оценка:
Здравствуйте, dar veter, Вы писали:

DV>Здравствуйте, Сергей Зизев, Вы писали:


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


СЗ>>[skipped...]


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; // Undefined behavior cогласно 9.5/1 
EW>>>>


DV> Чем грозить это неопределенное поведение (Undefined behavior) ?

Всего лишь тем, что в этом месте поведение программы не определено.
EW>>>>Ed.ward
Re[5]: приведение адреса метода
От: Bell Россия  
Дата: 22.01.03 09:40
Оценка:
Здравствуйте, dar veter, Вы писали:


DV> Чем грозить это неопределенное поведение (Undefined behavior) ?


Посмотри пост Павла Кузнецова
Любите книгу — источник знаний (с) М.Горький
Re[2]: приведение адреса метода
От: dar veter Россия  
Дата: 22.01.03 09:55
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:


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

И всего прочитаного я понял так, что на уровне разработки программы я не могу встроить код дешифровки, так
как я не могу с точночтью определить область памяти, где находится процедура для терзания ?
Если так, то получается что в коде необходимо предусматривать место для встраивания кода дешифровки.....
А внешней патчилкой выполнять данную ставку и криптовать функцию ???
Re[3]: приведение адреса метода
От: Павел Кузнецов  
Дата: 22.01.03 10:06
Оценка:
Здравствуйте, dar veter, Вы писали:

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


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

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

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

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


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

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


Лучше подними новый топик в соответствующем форуме ("Win API" или "Низкоуровневое программирование").
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: приведение адреса метода
От: Dima2  
Дата: 22.01.03 10:15
Оценка:
Здравствуйте, dar veter, Вы писали:

прочитай внимательно топик, который я дал, там есть ответы на твои вопросы, и несколько вариантов защиты криптованием кода программы.
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...
Пока на собственное сообщение не было ответов, его можно удалить.