Pobieranie adresu funkcji

Odpowiedz Nowy wątek
2012-05-27 14:27

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Sytuacja jest bardzo prosta. Mamy sobie jakąś funkcje np. void foo(void) i chciałbym pobrać adres wyżej wymienionej funkcji aby potem skopiować go przy pomocy dajmy to memcpy_s(). Moje pytanie brzmi jak osiągnąć ten cel, bo na chwile obecną nie znalazłem interesującego mnie materiału, który mógłby mnie nakierować?

Pozostało 580 znaków

2012-05-27 14:50

Rejestracja: 8 lat temu

Ostatnio: 6 lat temu

0

Żeby móc skopiować przez memcpy adres funkcji to musisz na początku go gdzieś zapisać, podobnie jak z adresem tablicy, ponieważ memcpy kopiuje z jakiegoś miejsca w pamięci do drugiego X bajtów, a adres funkcji nie jest nigdzie przechowywany (tzn. kompilator może go jakoś wyznaczyć jak z niego korzystasz, ale nie jest on zapisany w jakimś miejscu w pamięci). Przykład: http://ideone.com/ehpmP

Pozostało 580 znaków

2012-05-27 14:58

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

To bardzo ciekawe co mówisz zważywszy na to, że w C++ o ile mnie pamięć nie myli robi się to tak:

DWORD addr = (DWORD)foo;
memcpy(bez_znaczenia, &addr, 8);

Z tego co na chwile obecną się doszukałem to tylko coś takiego:

void* addr = (void*&)foo;
DWORD addr = (DWORD)foo; memcpy(bez_znaczenia, &addr, 8); Wiesz, że tak robiąc tracisz 4 najwyższe bajty (DWORD jest 32 bitowym unsigned intem), dodatkowo w C++ wskaźniki do funkcji mogą być większe niż wskaźniki do danych (nawet praktycznie), w C teoretycznie chyba też. - Zjarek 2012-05-27 15:13

Pozostało 580 znaków

2012-05-27 15:07

Rejestracja: 14 lat temu

Ostatnio: 2 dni temu

0

Odpal ten przykładzik i przeanalizuj.

#include<iostream>
using namespace std;

int add(int a,int b) { return a+b; }
int sub(int a,int b) { return a-b; }
int mul(int a,int b) { return a*b; }
typedef int FUN(int a,int b);

void go(FUN *fun,int a,int b)
  {
   cout<<fun(a,b)<<endl;
  }

int main()
  {
   go(add,50,20);
   go(sub,50,20);
   go(mul,50,20);
   cout<<endl;

   FUN *Tb[]={add,sub,mul};
   for(int i=0;i<3;++i) cout<<Tb[i](5,2)<<endl;
   cout<<endl;

   int (*ptr)(int a,int b)=add;
   //Fun *ptr=add; // to samo co wyżej
   cout<<ptr(50,20)<<endl;
   ptr=sub;
   cout<<ptr(50,20)<<endl;
   ptr=mul;
   cout<<ptr(50,20)<<endl;

   cin.get();
   return 0;
  }

Czy na pewno chcesz gdzieś kopiować adres tej memcpy?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon, 2012-05-27 15:10

Pozostało 580 znaków

2012-05-27 15:29

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Dziękuje za przykład, przeanalizowałem pod dbg i zrozumiałem. Odpowiadając na pytanie: tak, potrzebuję ten adres ponieważ jest on mi potrzebny do wstawki asm aby coś zpatchować/zrobić obejście - jak zwał tak zwał.

nie potrzebujesz, zrób wstawkę asm, na wzór funkcji go() - _13th_Dragon 2012-05-27 15:32

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0