分析Delphi编译的程序真的很郁闷~~
特别是字符串部分……
Pascal字符串结构是:[字串长]字串字符部分....
Delphi程序的 函数/过程 传值方式大多是以寄存器为主。
其中也有特殊的,比如_LStrCatN:
procedure _LStrCatN (var dest:AnsiString; argCnt: Integer; ...) // AnsiString 的连接
EAX :目标字符串
EDX :源字符串的个数 +2
[ESP+4*i] :第 i 个源字符串的指针
这里的入口参数比较特别
之上有:
push xxx
push xxx
...(EDX个push不一定要在一起)
如:
_LStrCatN (str, 3, LStrFromString(b), LStrFromString(a), IntToStr(n))
这样的就有可能是:
lea edx, [ebp+tmp1]
mov eax, [ebp+n]
call IntToStr
push [ebp+tmp1] ; <<== 01
lea eax, [ebp+tmp2]
mov edx, ds:off_a
call LStrFromString
push [ebp+tmp2] ; <<== 02
lea eax, [ebp+tmp3]
lea edx, [ebp+b]
call LStrFromString
push [ebp+tmp3] ; <<== 03
lea edx, [ebp+str]
mov edx, 3
call LStrCatN
; 这些push分散到了 01,02,03 所指处(一开始我还以为前两个push是LStrFromString的- -)
返回值也不一定在 EAX 中——尽管大多数是在EAX中没错,不过也有放[ESP+4]的。
//EOF Read More...