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出現,看來可以收工了。