首页
社区
课程
招聘
[求助]如何获取一个过程的Size
发表于: 2013-1-20 15:54 6066

[求助]如何获取一个过程的Size

2013-1-20 15:54
6066
Procedure MShow;
begin
  MessageBox(0,'呵呵','提示',0)
end;

上面一个过程,返汇编后如下

0044DAF0  /$  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
0044DAF2  |.  68 04DB4400   PUSH 44DB04                              ; |Title = "提示"
0044DAF7  |.  68 0CDB4400   PUSH 44DB0C                              ; |Text = "呵呵"
0044DAFC  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
0044DAFE  |.  E8 E989FBFF   CALL 004064EC                            ; \MessageBoxA
0044DB03  \.  C3            RET

6A 00 68 04 DB 44 00 68 0C DB 44 00 6A 00 E8 E9 89 FB FF C3

一共是20个字节的汇编码,请教,如何获取这个长度呢?

有没有什么API可以获取这个MShow过程的长度.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
2
一直往下面搜索  系统标准时 ret + int 3结束 ,可以作为一方面的判断 ..
2013-1-20 16:12
0
雪    币: 217
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
要计算的两头加些自定位,相减。。。这样可行吗?

二次编辑:
原来不是计算自己的过程啊。。。。没想到呢
2013-1-20 16:46
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
反汇编引擎。然后完整计算最后返回。再计算长度
2013-1-22 08:55
0
雪    币: 652
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
计算调用前后指令地址差。
2013-1-22 16:03
0
雪    币: 107
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看来很麻烦,谢谢各位了
2013-1-31 21:47
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不麻烦。。。。。。。。。
2013-2-1 09:26
0
雪    币: 2155
活跃值: (29)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
可以和2楼说的一样搜索ret+int3(0xC3,0xCC),但是貌似并不是所有的编译器在函数后面都加上int3来填充。。。
你肯定可以取到MShow函数的地址吧,然后从这个地址开始向后搜索ret指令(0xC3),就可以得到长度了。

但是这样有个问题,如果你的call指令后面的地址里包含了0xC3或者0xCC,那就不准确了,所以想要百发百中就要有个反汇编引擎帮助你分析一下。。。
2013-2-1 10:07
0
雪    币: 107
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
恩谢谢楼上几位朋友,十分感谢.

我找找反汇编引擎
2013-2-1 22:41
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
自己实现的话要考虑很多东西,仅仅判断ret是不准确的,建议找个轻量级的反汇编引擎分析下。
2013-2-8 09:51
0
雪    币: 223
活跃值: (516)
能力值: ( LV13,RANK:520 )
在线值:
发帖
回帖
粉丝
11
这个,没人能写的出来正确的.
2013-2-8 10:16
0
雪    币: 61
活跃值: (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;
}
2013-3-16 00:06
0
雪    币: 126
活跃值: (189)
能力值: ( 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;
2013-3-18 12:29
0
雪    币: 107
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢几位朋友,看雪人才太多了,各种方法,不过还是觉得wr960204方法不错,这样就绝对不会取错
2013-3-19 21:50
0
游客
登录 | 注册 方可回帖
返回
//