首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

怎么获取一个过程的Size

2013-02-24 
如何获取一个过程的SizeProcedure MShowbeginMessageBox(0,呵呵,提示,0)end上面一个过程,返汇编后如

如何获取一个过程的Size

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过程的长度.
[解决办法]
没有API能够执行这种工作,但可以通过变通的办法
在你需要的函数中的尾部追加一个标识符,比如把 MShow 写成这样

procedure MShow;
begin
  MessageBox(0,'呵呵','提示',0);
  asm
    db $90,$90,$90,$90
  end;
end;


我这里用4个nop指令来作为标志符号,然后写一个函数来获取其Size

function GetProcSize(Proc: Pointer): Integer;
var
  X: Integer;
  P: PByte;
begin
  X := Integer(Proc);
  P := Proc;
  while PDWORD(P)^ <> $90909090 do
    Inc(P);

  while P^ <> $C3 do
    Inc(P);

  Result := Integer(P) - X + 1;
end;


最后调用即可,当然,返回值是包含标识符长度的

ShowMessage(IntToStr(GetProcSize(@MShow)));

[解决办法]
procedure MShow;
begin
  MessageBox(0,'呵呵','提示',0);
  asm
    db $90,$90,$90,$90
  end;
end;
procedure MShow1;
begin
exit;
end;

function get_size():dword;//取得函数的大小
begin
result:=dword(@MShow1)-dword(@MShow)
end;

热点排行