首页
社区
课程
招聘
[求助]向大家问一下,VC6.0中,如何计算一个函数的实际大小?
发表于: 2010-4-25 19:31 7039

[求助]向大家问一下,VC6.0中,如何计算一个函数的实际大小?

2010-4-25 19:31
7039
我是这样写算的:
假如有函数A,我又紧跟着A后面定义了另一函数B用来计算A的大小:
static __declspec(naked) void A
{
}

static __declspec(naked) void B
{
}

那么,A的大小=B的偏移-A的偏移

现在问题来了,用VC6.0编译,我看了一下,结果在A函数的最后一条指令和B函数第一条指令之间还有一些垃圾数据,导致计算A函数大小不正确,有没有办法能准确的得到函数A的大小呢?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
2
使用长度反汇编引擎啊,一个函数就搞定……
2010-4-25 20:08
0
雪    币: 107
活跃值: (172)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
3
用字符特征法。
2010-4-25 20:25
0
雪    币: 225
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看来没什么好方法了,哎!我还是直接看反汇编后的代码有多大好了.......
2010-4-25 20:55
0
雪    币: 452
活跃值: (72)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
5
用static不好使
vc的编译器跟asm不一样,函数的顺序跟源代码的顺序不一定是一样的

以下是我摸索出来的方法

void func()
{
// some code
}

void end()
{
// do something else
}

int length = (int)end-(int)func;
然后 最关键的是:
编译器选项,要设置/Gy
链接器选项,要设置/Order:@order.txt
然后把函数顺序放到order.txt里面:

如果是C函数,就类似于:

func
end
如果是C++,就类似于:

?func@@YGKPAX@Z
?end@@YGKPAX@Z
还有就是,end函数最好不要为空,否则编译器优化之后,可能把这个函数移到别的地方去
也可以用#pragma optimize把end函数的优化禁用

具体用法参见MSDN

对了,我用的VS2008,不知道6.0有没有这些编译选项
2010-4-26 12:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
最近我也遇到这个问题了,我在VC下看了下反汇编的代码。在我的测试中是这样的:
比如C ++代码
void func()
{
// some code
}

void end()
{
// do something else
}
我程序中func值不是真正的函数地址,它所指向的指令是jmp XXXX; XXXX就是真实的地址。
楼上的方法应该可以试试。
2010-4-26 23:27
0
雪    币: 452
活跃值: (72)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
7
楼上的是用debug版的吧,换release就好了
2010-4-27 00:19
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
在函数A的结尾等义一个标签, 然后用标签的地址减去函数开始地址(函数名) 可以得到函数大小
2010-4-27 12:21
0
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
9
都定义成naked函数了,还有必要那样去计算么
2010-4-27 12:23
0
雪    币: 47
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
能不能 发出来 ,,让我等小菜 见识见识
2010-4-27 13:43
0
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
11
看雪那个新年大礼包里面就有啊:比如使用里面的ade32那个引擎吧,才20多kb,放进去又不会对程序有多大影响
int GetFunctionLength(BYTE* Address,int Max_len)
{
        BYTE * Pointer=Address;//尽量不修改用户传来的指针
        int leng=0;
        int length=0;
        struct disasm_struct out={0};

        while((leng=disasm(Pointer,&out))>0)
        {
                length+=leng;
                Pointer+=leng;
                //找到返回指令了
                if(length>Max_len)
                        return  length;
                if(out.disasm_opcode==0xc2)
                        break;
                if(out.disasm_opcode==0xc3)
                        break;
                RtlZeroMemory(&out,sizeof(struct disasm_struct));
        }
        return length;
}
2010-4-27 15:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我用的确实是debug。
http://bbs.pediy.com/showthread.php?t=63212&highlight=
在海风月影帖子【原创】Hook Api lib 0.5 - 2008.04.16更新 有个代码你可以看看,就是搞长度的,代码很短小,我暂时没测试那个
2010-4-27 23:24
0
游客
登录 | 注册 方可回帖
返回
//