Delphi控制元件EasyTable的去除NagScreen (4千字)

看雪資料發表於2001-03-16

Delphi控制元件EasyTable的去除NagScreen

[控制元件介紹]
    BDE作為資料庫引擎似乎太笨重了一些,所以現在出了很多替代它的工具,EasyTable是其中的一個。
    它有自己的特點,比如資料庫可以壓縮,可以資料加密,當然,功能還是不夠完善,但是對於小程
序來說已經足夠用了。

    下載地址:
http://www.aidaim.com/cgi-bin/download.cgi?url=http://www.aidaim.com/download/tetfred5.zip

[使用工具]
Win32Dasm
DCUExplorer
DeDe
HEdit

[過程介紹]
    首先安裝好這個控制元件,然後開啟自帶的Demo進行編譯。在Delphi執行時候啟動Demo,沒有Nagscreen。
關閉Delphi,執行Demo,NagScreen出來了。

    Win32Dasm上場,反編譯後查詢NagScreen裡面顯示的字串:This is....,沒有!Easy Table Free,
還是沒有!這下有些麻煩了。使用DeDe反編譯,發現有TAboutBox項,好吧,就從這裡入手。

    先在控制元件安裝目錄下查詢字串:"Easy Table Free"和"This is blah blah blah",在兩個DCU檔案中
找到:AboutBox.dcu、EasyTable.dcu。顯然,對於程式而言,EasyTable裡面會呼叫AboutBox,所以注意
力集中在EasyTable裡面。使用DCUExplorer對EasyTable.dcu進行反彙編,查詢第一個AboutScreen,所見
如下:

{ 19F: u?    |75 BA              | }
        JNE  @@015B; (0x15B) { OpCode : 03 }
{ 1A1: }?  |80 7D F7 00        | }
@@01A1 : CMP  BYTE PTR [EBP-9],$00 { OpCode : 38 }
{ 1A5: u~    |75 7E              | }
        JNE  @@0225; (0x225) { OpCode : 03 }
{ 1A7: ?.... |8B 0D(00 00 00 00  | }
        MOV  ECX,DWORD PTR [AboutScreen {0x4}] { OpCode : 87 }
{ 1AD: ?...  |A1(00 00 00 00      | }
        MOV  EAX,DWORD PTR [Application {0x62}] { OpCode : 87 }

有些過分亂了。雖然我看不太明白,不過可以試試看,假設AboutScreen是那個Nagscreen,那麼看看編譯後
的Demo第一次是如何呼叫AboutScreen的呢?好了,使用Hex編輯器查詢Demo主程式裡的
75 BA 80 7D F7 00 75 7E 8B 0D,只能找到一處,看來不錯。

然後記下此處的offset,到Win32Dasm反編譯出來的檔案中去找,會看見如下程式碼:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049D2C7(C)
|
:0049D2CF 46                      inc esi
:0049D2D0 FF4DF0                  dec [ebp-10]
:0049D2D3 75BA                    jne 0049D28F  <---------------

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0049D287(C), :0049D2CD(U)
|
:0049D2D5 807DF700                cmp byte ptr [ebp-09], 00  <-----------------
:0049D2D9 757E                    jne 0049D359    <---------------
:0049D2DB 8B0DC0224B00            mov ecx, dword ptr [004B22C0]
:0049D2E1 A1B0214B00              mov eax, dword ptr [004B21B0]
:0049D2E6 8B00                    mov eax, dword ptr [eax]

往上看,程式碼如下:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049D2D3(C)
|
:0049D28F 8D4DEC                  lea ecx, dword ptr [ebp-14]
:0049D292 8BD6                    mov edx, esi
:0049D294 8B45F8                  mov eax, dword ptr [ebp-08]
:0049D297 8B38                    mov edi, dword ptr [eax]
:0049D299 FF570C                  call [edi+0C]
:0049D29C 8B55EC                  mov edx, dword ptr [ebp-14]

* Possible StringData Ref from Code Obj ->"Delphi"
                                  |
:0049D29F B8ECD34900              mov eax, 0049D3EC
:0049D2A4 E8A36EF6FF              call 0040414C
:0049D2A9 48                      dec eax        <----------------  @@
:0049D2AA 741D                    je 0049D2C9    <----------------  @@
:0049D2AC 8D4DE8                  lea ecx, dword ptr [ebp-18]  <--  @@
:0049D2AF 8BD6                    mov edx, esi
:0049D2B1 8B45F8                  mov eax, dword ptr [ebp-08]
:0049D2B4 8B38                    mov edi, dword ptr [eax]
:0049D2B6 FF570C                  call [edi+0C]
:0049D2B9 8B55E8                  mov edx, dword ptr [ebp-18]

* Possible StringData Ref from Code Obj ->"C++Builder"
                                  |
:0049D2BC B8FCD34900              mov eax, 0049D3FC
:0049D2C1 E8866EF6FF              call 0040414C
:0049D2C6 48                      dec eax
:0049D2C7 7506                    jne 0049D2CF

到了這裡就有些明白了,它似乎在尋找Delphi或者C++Builder是否已經啟動,沒有的話就跳
對話方塊。在Dasm裡面load Demo程式,斷點設在0049D2AA處,發現此處不跳轉。

試著在0049D2AA處改為jmp 0049D2C9,再執行程式,沒有NagScreen了。

最後一步,將EasyTable.dcu和tet_pack.bpl(安裝控制元件的時候自己將新建包命名為tet_pack.dpk)
用Hex編輯器開啟,找@@處的機器碼,然後將741D改為EB1D。重新執行Delphi,編譯Demo程式,
關閉Delphi,執行Demo程式,沒有了NagScreen。為了保險起見,由於我的硬碟是兩個C盤,在
另外一個乾淨的Win98中試用,結果還是沒有NagScreen出現,看來可以收工了。

相關文章