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ć?
- Rejestracja:około 14 lat
- Ostatnio:około 12 lat
Ż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
- Rejestracja:prawie 13 lat
- Ostatnio:prawie 13 lat
- Postów:3
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;

- Rejestracja:prawie 20 lat
- Ostatnio:20 dni
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?
- Rejestracja:prawie 13 lat
- Ostatnio:prawie 13 lat
- Postów:3
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ł.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.