void A()
{
//省略
}
void B()
{
//省略
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
DWORD dwSize = (DWORD)B - (DWORD)A;
}
我用调试程序观察
函数B的地址 = 0x00411f30 ;
函数A的地址 = 0x00411e40 ;
dwSize应该等于240(F0)才对,可为什么却等于4294965846(FFFFFA56),应该没有溢出啊,
为什么会是这个结果呢?
{
//省略
}
void B()
{
//省略
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
DWORD dwSize = (DWORD)B - (DWORD)A;
}
我用调试程序观察
函数B的地址 = 0x00411f30 ;
函数A的地址 = 0x00411e40 ;
dwSize应该等于240(F0)才对,可为什么却等于4294965846(FFFFFA56),应该没有溢出啊,
为什么会是这个结果呢?
A=atoi(A);
dwszie=B-A;
DWORD Bs = (DWORD)B; 竟然As和Bs的值就不是A和B的地址LJC,你那个atoi无话好说了
晕!!
A=atoi(A);
B和A都是函数地址,又不是变量,能赋值吗??
它们的值改变了能行么,后面我还要使用这两个函数呢!
LZ同时输出
DWORD dwSizeBA = (DWORD)B - (DWORD)A;
DWORD dwSizeAB = (DWORD)A - (DWORD)B;
试试
B=atoi(BB);
A=atoi(AA);
dwszie=BB-AA;
dwszie的地址就是了
我注意到这样一个现象,如果在代码中把A和B函数的位置互换,那么B和A的地址会互换,可以猜测,A和B指的是两个函数在代码段中的地址;如果在A和B函数互换位置的时候,
DWORD As = (DWORD)A;和DWORD Bs = (DWORD)B的位置不变动,那么As和Bs的值跟原来没有区别,我想这也许跟执行有关
进一步的讨论,我再试试
可LJC2000a的atoi我实在不明白,
B=atoi(B); 参数B难到不用类型转换吗?
atoi的原型:
int WINAPI atoi( const TCHAR *sz);
B是应该是个PROC类型。
晕ing!!!
不管DWORD As = (DWORD)A;和DWORD Bs = (DWORD)B的位置再做什么变动,值都不会改变,我想可能系统执行的步骤会是这样的:如上解释,A和B两个函数的地址应该是它们在代码段的地址;在执行时,函数的地址会重新定向,其实在我的机器上,As和A并没有太大的差距,差距在128之内,也就是说,编译器重定向的原则本着不跟原来的函数地址有较大的差距,(在MSIL语言中,如果函数的跳转在128单位之内的话,指令只占一个字节);我觉得我可以理解了,也许没有说清楚
如果要使用函数的地址的话,还是使用&吧,大家都懂,也比较标准
祝好
我的程序现在直接使用dwSize = 240;来代替DWORD dwSize = (DWORD)B - (DWORD)A;
难到真没有其他办法了吗?
{
//省略
}
static void B()
{
//省略
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
DWORD dwSize;
dwSize = (BYTE*)B - (BYTE*)A;
return 0;
}
----------------------
同意此楼的,把函数声明为static,很多代码注入都是这样做的.
使用此法虽然可行,但dwSize将变成400,有没有更好的办法呢?
他们获得都是代码段中一个跳转表中的表项的地址, 比如你有两个函数A和B,在跳转表里面有两个选项:
jmp Addr1;
...
jmp Addr2;
而Addr1 和Addr2是在程序被载入的时候填入的, 而这两个地址才指向真正代码存放的地址.
所以你用A-B的值只是等于两个表项的差距和两个表项出现的顺序, 和函数大小无关.
使用static的时候这个表就不见了
所以楼主用这种方法算函数大小其实不可行.