Crack之親歷手跡3--Delphi程式中是如何獲得一個Edit的Text內容的 (1千字)

看雪資料發表於2002-03-09

Crack之親歷手跡3--Delphi程式中是如何獲得一個Edit的Text內容的
                ----------Crack之親歷手跡2--我的第一個序號產生器----之續集
//--------------------------------------------------------------
實驗工具:IDA Pro、Delphi 6、SoftICE4.05
實驗目的:發現Delphi編的程式如何獲得文字框(Edit)的資料(Text)而不用API函式
//--------------------------------------------------------------
1.用Delphi編個簡單的試驗程式
  一個Form包含一個Edit、一個Button、程式碼如下
  procedure TForm1.Button1Click(Sender: TObject);
  begin
  ShowMessage(Edit1.Text);
  end;
  -------^~
  而Edit.text好像是呼叫下面的類似函式(從IDA的反彙編可以看出,不過那叫TControl::GetText)
  //摘錄自Delphi6的source\vcl\controls.pas目錄
  function TControl.GetTextBuf(Buffer: PChar; BufSize: Integer): Integer;
  begin
  Result := Perform(WM_GETTEXT, BufSize, Longint(Buffer));
  //Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
  //Responds as if the control received a specified Windows message.
  end;
  從中我們可以看出Delphi時透過Perform函式直接模擬向Edit傳送WM_GETTEXT訊息來獲得Text的內容的!
  注意這個WM_GETTEXT訊息傳送是模擬的,你用BPX MSGFUN時欄不到的,其實是透過Call WndProc的方式!
2。用IDA反彙編1中的exe同樣可見到
call    @TControl@GetText ;
//--------------------------
@TControl@GetText proc near
  ...
call    unknown_libname_169
...
//--------------------------
unknown_libname_169 proc near
  ...
  call    @Controls@TControl@Perform$qqruiii ; Controls::TControl::Perform(uint,int,int)
  ...
3.結論:Delphi透過向Edit傳送WM_GETTEXT(直接呼叫WNDProc,而沒有使用訊息函式)訊息來獲得Text的內容的!
GetText(){
  Call WndProc(WM_GETTEXT);
}
      |
WndProc(Msg){
  DefWndProc(Msg);
}
Text的自值由DefWndProc系統函式給出!
附:看來Borload的那些傢伙寫出的東西的確與眾不同

Email:y97523@hotmail.com

相關文章