[求助]如何获取一个过程的Size
我写的一个基于 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;
}