Connecting Tech Pros Worldwide Forums | Help | Site Map

How do i convert an integer to an address for a function pointer

rodrigo.gloria@gmail.com
Guest
 
Posts: n/a
#1: Mar 16 '06
I am trying to convert a integer to an address of a function pointer.

I want to encrypt the pointer and then do some validation, afterwards i
will decrpyt the pointer back to an address. Can this be done. Below
is some of my code.


typedef void (*funcptr)(void);
void tryme(void){};

void main()
{

char *buffer = new char[30];
// save address of tryme fuction into a string
itoa ( (unsigned int)(&tryme),buffer,16);
Encrypt(buffer);

//some code here

// retreive address tryme function
decryptbuffer = Decrypt(buffer);
unsigned int x = (unsigned int)atoi(decryptbuffer );
funcptr restoreFuncPtr = (funcptr)x; // convert int to funcptr
address

}



}


benben
Guest
 
Posts: n/a
#2: Mar 16 '06

re: How do i convert an integer to an address for a function pointer


>Can this be done.

Compile and run your code and you'd find out.

Ben
Ramki
Guest
 
Posts: n/a
#3: Mar 16 '06

re: How do i convert an integer to an address for a function pointer


Hi,
Your code should work.
But, using reinterpret_cast<> is safe

Checkout the following code snippet

typedef int (*FP)(void);
int add()
{
return 10;
}

main()
{
FP funPtr;
unsigned int num = reinterpret_cast<unsigned int>(add);
funPtr = reinterpret_cast<FP>(num);
printf("%d", funPtr());
}


Thanx,
Rama

Jacek Dziedzic
Guest
 
Posts: n/a
#4: Mar 16 '06

re: How do i convert an integer to an address for a function pointer


rodrigo.gloria@gmail.com wrote:[color=blue]
> I am trying to convert a integer to an address of a function pointer.
>
> I want to encrypt the pointer and then do some validation, afterwards i
> will decrpyt the pointer back to an address. Can this be done. Below
> is some of my code.
>
>
> typedef void (*funcptr)(void);
> void tryme(void){};
>
> void main()
> {
>
> char *buffer = new char[30];
> // save address of tryme fuction into a string
> itoa ( (unsigned int)(&tryme),buffer,16);
> Encrypt(buffer);
>
> //some code here
>
> // retreive address tryme function
> decryptbuffer = Decrypt(buffer);
> unsigned int x = (unsigned int)atoi(decryptbuffer );
> funcptr restoreFuncPtr = (funcptr)x; // convert int to funcptr
> address[/color]

What makes you think the value of a pointer will FIT
inside an unsigned integer?

You might have 64-bit pointers and 32-bit unsigned ints,
what then?

HTH,
- J.
Tomás
Guest
 
Posts: n/a
#5: Mar 16 '06

re: How do i convert an integer to an address for a function pointer


posted:
[color=blue]
> I am trying to convert a integer to an address of a function pointer.[/color]


typedef unsigned long PointerNumericValue;


void* Encrypt( void* p )
{
PointerNumericValue value = reinterpret_cast<unsigned long>(p);

//Now encrypt it:

p << 2;

p += 3;

//Now return it:

return reinterpret_cast<void*>(p);
}
Ramki
Guest
 
Posts: n/a
#6: Mar 16 '06

re: How do i convert an integer to an address for a function pointer


Then u can take ,

unsigned _int64 (or)
long long unsigned int
........ here 64-bit pointers may fit.

:-)
Thanx,
Rama

Jacek Dziedzic
Guest
 
Posts: n/a
#7: Mar 16 '06

re: How do i convert an integer to an address for a function pointer


Ramki wrote:[color=blue]
> Then u can take ,
>
> unsigned _int64 (or)
> long long unsigned int
> ........ here 64-bit pointers may fit.
>
> :-)[/color]

Yes, if you have stuff like "_int64". That, however,
raises the question of what happens if pointers are
bigger still, or ints are 16-bit?

What I meant to say was, you can't assume a 1:1
relationship between the size of a pointer and
sizeof(unsigned int).

- J.
Jacek Dziedzic
Guest
 
Posts: n/a
#8: Mar 16 '06

re: How do i convert an integer to an address for a function pointer


Tomás wrote:[color=blue]
> posted:
>
> [color=green]
>>I am trying to convert a integer to an address of a function pointer.[/color]
>
>
>
> typedef unsigned long PointerNumericValue;
>
>
> void* Encrypt( void* p )
> {
> PointerNumericValue value = reinterpret_cast<unsigned long>(p);
>
> //Now encrypt it:
>
> p << 2;
>
> p += 3;
>
> //Now return it:
>
> return reinterpret_cast<void*>(p);
> }[/color]

Still, what if it doesn't fit inside an unsigned long?,
although it's the OP's problem.

- J.
Jack Klein
Guest
 
Posts: n/a
#9: Mar 17 '06

re: How do i convert an integer to an address for a function pointer


On 16 Mar 2006 01:57:57 -0800, "Ramki" <writerama@gmail.com> wrote in
comp.lang.c++:
[color=blue]
> Hi,
> Your code should work.
> But, using reinterpret_cast<> is safe
>
> Checkout the following code snippet
>
> typedef int (*FP)(void);
> int add()
> {
> return 10;
> }
>
> main()[/color]

Your program is ill-formed, implicit int is no valid in C++, all
function definitions and declarations must specify a return type.
[color=blue]
> {
> FP funPtr;
> unsigned int num = reinterpret_cast<unsigned int>(add);
> funPtr = reinterpret_cast<FP>(num);
> printf("%d", funPtr());
> }
>
>
> Thanx,
> Rama[/color]

Your compiler is non conforming, or you are not invoking it in
conforming mode, if it accepts this program without issuing a
diagnostic for the implicit int in the definition of main().

It is also non-conforming if it accepts the application of
reinterpret_cast on a function pointer type to any scalar type. This
is just plain not valid C++.

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://c-faq.com/
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++
http://www.contrib.andrew.cmu.edu/~a...FAQ-acllc.html
Me
Guest
 
Posts: n/a
#10: Mar 17 '06

re: How do i convert an integer to an address for a function pointer


rodrigo.gloria@gmail.com wrote:[color=blue]
> I am trying to convert a integer to an address of a function pointer.
>
> I want to encrypt the pointer and then do some validation, afterwards i
> will decrpyt the pointer back to an address. Can this be done. Below
> is some of my code.[/color]

Not guaranteed to work at all (see J.5.7 in the C standard)
[color=blue]
> typedef void (*funcptr)(void);
> void tryme(void){}[/color]
<snip>

funcptr fn = tryme;
unsigned char buf[sizeof(fn)];
memcpy(buf, &fn, sizeof(fn));
encrypt_inplace(buf, sizeof(fn));

....

decrypt_inplace(buf, sizeof(fn));
memcpy(&fn, buf, sizeof(fn));
fn();

rodrigo.gloria@gmail.com
Guest
 
Posts: n/a
#11: Mar 17 '06

re: How do i convert an integer to an address for a function pointer


Thanks alot the method below worked.

Hi,
Your code should work.
But, using reinterpret_cast<> is safe

Checkout the following code snippet


typedef int (*FP)(void);
int add()
{
return 10;



}


main()
{
FP funPtr;
unsigned int num = reinterpret_cast<unsigned int>(add);
funPtr = reinterpret_cast<FP>(num);
printf("%d", funPtr());


}

Thank you,

Rodrigo

Closed Thread