能力值:
( LV9,RANK:160 )
|
-
-
2 楼
使用长度反汇编引擎啊,一个函数就搞定……
|
能力值:
( LV2,RANK:15 )
|
-
-
3 楼
用字符特征法。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
看来没什么好方法了,哎!我还是直接看反汇编后的代码有多大好了.......
|
能力值:
( 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有没有这些编译选项
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
最近我也遇到这个问题了,我在VC下看了下反汇编的代码。在我的测试中是这样的:
比如C ++代码
void func()
{
// some code
}
void end()
{
// do something else
}
我程序中func值不是真正的函数地址,它所指向的指令是jmp XXXX; XXXX就是真实的地址。
楼上的方法应该可以试试。
|
能力值:
( LV9,RANK:330 )
|
-
-
7 楼
楼上的是用debug版的吧,换release就好了
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
在函数A的结尾等义一个标签, 然后用标签的地址减去函数开始地址(函数名) 可以得到函数大小
|
能力值:
( LV9,RANK:200 )
|
-
-
9 楼
都定义成naked函数了,还有必要那样去计算么
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
能不能 发出来 , ,让我等小菜 见识见识
|
能力值:
( 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;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
我用的确实是debug。
http://bbs.pediy.com/showthread.php?t=63212&highlight=
在海风月影帖子【原创】Hook Api lib 0.5 - 2008.04.16更新 有个代码你可以看看,就是搞长度的,代码很短小,我暂时没测试那个
|
|
|