能力值:
( LV13,RANK:260 )
|
-
-
2 楼
一直往下面搜索 系统标准时 ret + int 3结束 ,可以作为一方面的判断 ..
|
能力值:
( LV3,RANK:30 )
|
-
-
3 楼
要计算的两头加些自定位,相减。。。这样可行吗?
二次编辑:
原来不是计算自己的过程啊。。。。没想到呢
|
能力值:
( LV5,RANK:70 )
|
-
-
4 楼
反汇编引擎。然后完整计算最后返回。再计算长度
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
计算调用前后指令地址差。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
看来很麻烦,谢谢各位了
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
不麻烦。。。。。。。。。
|
能力值:
( LV3,RANK:20 )
|
-
-
8 楼
可以和2楼说的一样搜索ret+int3(0xC3,0xCC),但是貌似并不是所有的编译器在函数后面都加上int3来填充。。。
你肯定可以取到MShow函数的地址吧,然后从这个地址开始向后搜索ret指令(0xC3),就可以得到长度了。
但是这样有个问题,如果你的call指令后面的地址里包含了0xC3或者0xCC,那就不准确了,所以想要百发百中就要有个反汇编引擎帮助你分析一下。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
恩谢谢楼上几位朋友,十分感谢.
我找找反汇编引擎
|
能力值:
( LV7,RANK:100 )
|
-
-
10 楼
自己实现的话要考虑很多东西,仅仅判断ret是不准确的,建议找个轻量级的反汇编引擎分析下。
|
能力值:
( LV13,RANK:520 )
|
-
-
11 楼
这个,没人能写的出来正确的.
|
能力值:
( LV4,RANK:50 )
|
-
-
12 楼
我写的一个基于 ade32反汇编引擎的一个计算函数长度的一个函数
//计算函数大小,自己写的,绝对可靠,可识别VC编译出来的死循环,没有RET的函数
ULONG SizeOfFunction(PVOID lpFun)
{
ULONG Length;
ULONG Result = 0;
PBYTE pCode=(PBYTE)lpFun;
disasm_struct diza;
UINT max_len=0; //通过跳转指令偏移已知的最后指令位置
do
{
Length = ade32_disasm(pCode,diza);
if ( Length==5 && diza.disasm_opcode == 0xE9 )
{
long offset=*(LONG *)&pCode[1];
//TRACE("max_len:%d Result:%d Length:%d opcode %08X offset:%d\n",max_len, Result, Length, diza.disasm_opcode, offset);
//死循环函数处理,如果向后跳,正常方法
if (offset>0)
{
if (max_len<Result+Length+offset)
{
max_len=Result+Length+offset+1;
}
}else{
//如果向后跳,且现当前指令执行完后的代码长度大于max_len,则认为后面没有其他代码了
if (Result+Length+1>max_len)
{
//print_opcode(pCode,Length);
Result += Length;
break;
}
if (max_len<Result+Length+offset)
{
max_len=Result+Length+offset+1;
}
}
}
if ( Length==2 && diza.disasm_opcode == 0xEB )
{
char offset=(char)pCode[1];
//TRACE("max_len:%d Result:%d Length:%d opcode %08X offset:%d\n",max_len, Result, Length, diza.disasm_opcode, offset);
//死循环函数处理,如果向后跳,正常方法
if (offset>0)
{
if (max_len<Result+Length+offset)
{
max_len=Result+Length+offset+1;
}
}else{
//如果向后跳,且现当前指令执行完后的代码长度大于max_len,则认为后面没有其他代码了
if (Result+Length+1>max_len)
{
//print_opcode(pCode,Length);
Result += Length;
break;
}
if (max_len<Result+Length+offset)
{
max_len=Result+Length+offset+1;
}
}
}
if ((Length == 2) && (diza.disasm_opcode >= 0x70 && diza.disasm_opcode <= 0x7F))
{
if (max_len<Result+Length+(char)pCode[1])
{
max_len=Result+Length+(char)pCode[1]+1;
}
//TRACE("offset:%d max_len:%d \n", (char)pCode[1], max_len);
}
//print_opcode(pCode,Length);
Result += Length;
if ((Length == 1) && (diza.disasm_opcode == 0xC3) && Result>=max_len)
{
//TRACE("0xC3 %d %d %d\n", max_len, Result, Result>=max_len);
break;
}
if ((Length == 3) && (diza.disasm_opcode == 0xC2) && Result>=max_len)
{
//TRACE("0xC2 %d %d %d\n", max_len, Result, Result>=max_len);
break;
}
pCode +=Length;
//TRACE("Result-Len:%d", Result);
} while (Length);
//TRACE("Result-Len:%d", Result);
return Result;
}
|
能力值:
( LV3,RANK:20 )
|
-
-
13 楼
Procedure MShow;
begin
MessageBox(0,'呵呵','提示',0)
end;
procedure EndFlag(); //紧跟在上一个函数的后面
begin
end;
procedure TForm10.Button1Click(Sender: TObject);
begin
ShowMessage(Format('Procedure size = %d',[Integer(@endFlag) - Integer(@MShow)]));
end;
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
谢谢几位朋友,看雪人才太多了,各种方法,不过还是觉得wr960204方法不错,这样就绝对不会取错
|