|
Well i'll make myself clearer
#include <iostream>
using namespace std;
class pvt
{
private:
int shouvik,raj;
void sum();
public:
float sdprivate;
pvt(){}
};
void pvt::sum()
{
cout<<endl<<"pvt sum";
}
typedef void(*funcs)();
int main()
{
pvt p;
funcs i;
i = (funcs)0x00401190;
_asm
{
call i
}
i();
return 0;
}
the 0x00401190 what you see is the addres of the private method sum(). I need to access private methods directly and hence I need to know the address of the project its loading.
I'm having a set of classes which I cannot alter(no friend/virtual) as its a critical software and it might contain a private method. I'm to access and know the characteristics of the method to use it in my project. Hence as per my first post i need to know the load address so that I can call the method even if it's not loaded in 0x00400000. hope I clarify your doubt..
Sorry for a km long post;)
There are only two kinds of people who are really fascinating-people who know absolutely everything, and people who know absolutely nothing.
Oscar Wilde (1854-1900)
Regards...
Shouvik
|
|
|
|
|
Why do you want this? This is a wierd way to go about doing things.
Steve
|
|
|
|
|
That's because no other way can i bypass the private method access in C++(perfectly non malicious intention). Read my previous posts in this forum titled private access and as well the links in the first post. I think you will get a better idea
There are only two kinds of people who are really fascinating-people who know absolutely everything, and people who know absolutely nothing.
Oscar Wilde (1854-1900)
Regards...
Shouvik
|
|
|
|
|
Firstly, .EXEs are not relocated as they are the first module loaded and thus always get loaded at their preferred base address. Even if this wasn’t true, or you were working with a DLL, the code I gave earlier can help you. Translate your address into an offset by subtracting the preferred base address from it then add this to the actual base address.
Finally a disclaimer: what you are doing is perverse and I don’t approve of it.
Steve
|
|
|
|
|
Stephen Hewitt wrote: Finally a disclaimer: what you are doing is perverse and I don’t approve of it
well thhis has been a blow in all forums i went.
Ok fine, you mean to say that even if the preferred load adddres is not empty i'm deemed to get my .EXE running there. This might lift a lot of load
There are only two kinds of people who are really fascinating-people who know absolutely everything, and people who know absolutely nothing.
Oscar Wilde (1854-1900)
Regards...
Shouvik
|
|
|
|
|
shouvik.d wrote: i();
if ur going to call a member function of a class like this.. u need to pass the "this" parameter also. Isn't it?
nave
|
|
|
|
|
Exactly...u're correct. I's actually experimenting for past many days and yesterday night ended up like this. Slowly i'll escalate it to OO paradigm. currently my problem is regarding my post only
There are only two kinds of people who are really fascinating-people who know absolutely everything, and people who know absolutely nothing.
Oscar Wilde (1854-1900)
Regards...
Shouvik
|
|
|
|
|
1 simple doubt.. why cant u change the private to public?
nave
|
|
|
|
|
Naveen R wrote: why cant u change the private to public
Read my first post. I said I can't change 1 byte in the source classes
There are only two kinds of people who are really fascinating-people who know absolutely everything, and people who know absolutely nothing.
Oscar Wilde (1854-1900)
Regards...
Shouvik
|
|
|
|
|
Sorry naveen
Read this
Proj details[^]
There are only two kinds of people who are really fascinating-people who know absolutely everything, and people who know absolutely nothing.
Oscar Wilde (1854-1900)
Regards...
Shouvik
|
|
|
|
|
i am not sure
Suppose ur class have a public function. U can get the address of that function at the runtime. The private function will be also at some address near to it. By adding some value to the address of the public function u can get the address of private function.
nave
|
|
|
|
|
please let me know the above metioned way will work or not in ur case...
nave
|
|
|
|
|
yes but the addres is always a Rva so u cant just add subtract like tht. Its better to leave it to the compiler to do it. even though u will use sizeof() opeartor knowing the load address is imp isn't it
There are only two kinds of people who are really fascinating-people who know absolutely everything, and people who know absolutely nothing.
Oscar Wilde (1854-1900)
Regards...
Shouvik
|
|
|
|
|
shouvik.d wrote: the addres is always a Rva
Rva means?
so then how u gonne do it?
nave
|
|
|
|
|
Rva means relative virtual address. have you taken a look at the map file i mean are you aware of the map file structure.
There are only two kinds of people who are really fascinating-people who know absolutely everything, and people who know absolutely nothing.
Oscar Wilde (1854-1900)
Regards...
Shouvik
|
|
|
|
|
i always enjoy reading your posts here in technical forums, you should start writing articles as well
If you think you can than you can, if you think you can't you are right.
|
|
|
|
|
Thankyou. I have considered it but never seem to find the time.
Steve
|
|
|
|
|
The HINSTANCE of a module is its load address. The address you get from GetProcAddress() points directly at the code, which is in the part of the address space that the module is mapped to.
|
|
|
|
|
To use GetProcAddress() the source classes should be a DLL project.
unfortunately they are not. hence its only during build time i can resolve the address.
Wat do you suggest. Make sure one thing that I can't change one byte in the source classes provided to me. I've to apply means to access the methods in them be it private or public. Name mangling resolvng is one of the issues that can suffice to my needs
There are only two kinds of people who are really fascinating-people who know absolutely everything, and people who know absolutely nothing.
Oscar Wilde (1854-1900)
Regards...
Shouvik
|
|
|
|
|
GetProcAddress will only work for exported functions.
Steve
|
|
|
|
|
by exported u mean i need to create a .def and dll isn't it
There are only two kinds of people who are really fascinating-people who know absolutely everything, and people who know absolutely nothing.
Oscar Wilde (1854-1900)
Regards...
Shouvik
|
|
|
|
|
Yeah. I see no technical reason why an .EXE can't have exports (the PE file format would allow it) but when I've tried (in the past) it hasn't worked.
Steve
|
|
|
|
|
really stephen u seem to read my mind.;)
Yes I tried to learn about Portable Executables but dont know how to implement them in VC++6.0. CAn you help me out please. i mean i really am a mediocre with C++
There are only two kinds of people who are really fascinating-people who know absolutely everything, and people who know absolutely nothing.
Oscar Wilde (1854-1900)
Regards...
Shouvik
|
|
|
|
|
All EXEs and DLLs produced by VC++6.0 are PE files. Even dotNET assemblies are PE files.
Steve
|
|
|
|
|
ok then here is wat you will feel is useful
1)I've set of few classes
2)I'm not allowed to change anything in "1"
3)I'll create my own class(es) and rebuild it along with the above set.
now tell me when there is no scope of creating an EXE only using '1)' how do i access the private methods residing in '1)'. To do that i thought of using the base address to offset and locate the desired method or else use the name mangles and resolve.
now in this scenario how eil PE help me out. Just let me know how does my flow of work should be and where sould PE fit in
There are only two kinds of people who are really fascinating-people who know absolutely everything, and people who know absolutely nothing.
Oscar Wilde (1854-1900)
Regards...
Shouvik
|
|
|
|