Avatar billede krismort Nybegynder
17. januar 2006 - 18:50 Der er 4 kommentarer

manipulering af vtable?

Hej,
Jeg tænkte på om der er nogen der kan give mig svar på nogen af flg. spørgsmål. Er det muligt at manipulerer vtable runtime sådan at kalder man en method_1 klasse en C så bliver metode_2 kaldt istedet for.

class C {
public:
  void method_1( void ) {
  }
  void method_2( void ) {
  }
};
Avatar billede bertelbrander Novice
17. januar 2006 - 19:47 #1
Om det er muligt: Ja, hvis du ved hvilken kompiler koden skal køre på, er det forholdsvist nemt at gøre.

Men om det er en god idé eller om der findes en bedre metode er en anden sag.

Bemærk at hvis du piller i vtable for en class piller du i vtable'n for alle instanser af den class.
Avatar billede krismort Nybegynder
17. januar 2006 - 22:15 #2
har du et fif til til hvordan man gør ?
Avatar billede bertelbrander Novice
17. januar 2006 - 22:28 #3
Man kunne starte med følgende:

#include <iostream>

class X
{
public:
  virtual void Foo() = 0;
  virtual void Bar() = 0;
};

class D1 : public X
{
public:
  void Foo()
  {
      std::cout << "D1::Foo" << std::endl;
  }
  void Bar()
  {
      std::cout << "D1::Bar" << std::endl;
  }
};

class D2 : public X
{
public:
  void Foo()
  {
      std::cout << "D2::Foo" << std::endl;
  }
  void Bar()
  {
      std::cout << "D2::Bar" << std::endl;
  }
  typedef void (D1::*fptr)();
  void Exchange(fptr f)
  {
      int *p = (int *)this;
      *p = *(int *)&f;
  }
};

int main()
{
  D1 d1;
  D2 d2;
  d2.Exchange(&D1::Foo);
  d2.Foo();
}

Det compilerer men virker ikke, men kunne give en idé.
Hviken kompiler bruger du?
Avatar billede bertelbrander Novice
17. januar 2006 - 23:04 #4
Jeg lavede dette:
#include <iostream>

class X
{
public:
  virtual void Foo() = 0;

  typedef void (X::*fptr)();
  void Exchange(fptr f)
  {
      int **P = (int **)this;
      **P = *(int *)&f;
  }

};

class D1 : public X
{
public:
  void Foo()
  {
      std::cout << "D1::Foo" << std::endl;
  }
};

class D2 : public X
{
public:
  void Foo()
  {
      std::cout << "D2::Foo" << std::endl;
  }
};

int main()
{
  X *obj = new D2;
  obj->Foo();
  obj->Exchange((void (X::*)())&D1::Foo);
  obj->Foo();
}

Jeg tror at det er rigtigt, men så er problemet at vtable så vidt jeg kan se er read-only :-(
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester