2007-07-31

分析Delphi编译的程序真郁闷

分析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

0 comments: