今天突然想到一个问题,想得到eip,于是有了下面的函数
//程序原理参见任何一本汇编教程里关于ret和call的解释,本人表达能力有限,恕不献丑
function GetEIP: Integer;
asm
pop eax
push eax
sub eax, 5//call GetEIP占用5字节
end;
不过在调试中发现某些场合如果不修正这5个字节,效果反而更好
function GetEIP: Integer;
asm
pop eax
push eax
end;
比如这样的调用
i := GetEIP;//这里先调用call,然后才是mov,显然不修正,取mov时的eip更符合人的思维
ShowMessage(Format('%.8x',[i]));
但其他场合就不好说了,比如
ShowMessage(IntToStr(GetEIP));//这里无论修正还是不修正,都不合适,这是个没有办法的事
以上纯属扯淡,仅供无聊人事调侃