如何获取一个过程的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;