入門級smc(self modifying code)例子一個。 (4千字)

看雪資料發表於2001-02-04

入門級smc(self modifying code)例子一個。

臺灣磐英主機板附帶光碟上的監控軟體===>epoxUSDM.cpl version 2.48
1. Easy to use, and convenient ControlPanel Applet
2. Can graphically show the status of the Power Supply and System-internal Temperature
3. Can show an Alarm Notification Window and Audible Alerts to potentially serious system
  problems before they threaten system stability

此程式必須用控制皮膚COMCTL32.DLL開啟。
當然你只要雙擊epoxUSDM.cpl即可,就像其他可執行檔案一樣。

smc原因:軟體安裝在開始/程式/啟動中,每次開機自動執行後,在桌面顯示一視窗
        並在工作列右下角形成一小圖示。
我願望:開機時僅要工作列右下角小圖示不要在桌面出現視窗,這樣較美觀。
        但是雙擊工作列右下角小圖示時還能在桌面出現視窗。

難點:cpl檔案需用ControlPanel開啟,不像exe、com等好跟蹤。

首先:PROCDUMP用PE EDITOR挑epoxUSDM.cpl選SECTIONS把.text的CHARACTERICTICS
      由60000020改為E0000020,此步驟非常非常重要!!!!

原因:60000020表示.text部分readable executable
      E0000020表示.text部分readable executable writeable
      必須要writeable!!!!!!!!你可試試不改的下場。Ken的smc教程
      就少了此步!當然要視軟體性質而定。你若無法確定改何處,可將整個
      section header的CHARACTERICTICS值全改E0000020。

TRW2K122跟蹤發現:
在0167:10004E15處往下跳就出現桌面視窗,不往下跳就僅在工作列出現小圖示。
程式執行到10004E15時卻總往下跳。你可能想,EASY,NOP掉10004E15不就行了?
的確,第一次執行是行了,但當你雙擊小圖示時卻無法出現桌面視窗,因為程式
還要經過10004E15,看來只好用smc法了。謝謝Ken。

看看下面的程式(在epoxUSDM.cpl中),你會驚喜發現JZ附近很多NOP,GOOOOOD!
就改此處!因程式執行時沒經過此NOP,你可下中斷試試,修改後不會影響原程式RUN,
不用TOPO找NOP了。

改前:
0167:10004DF4 90                NOP   
0167:10004DF5 90                NOP   
0167:10004DF6 90                NOP   
0167:10004DF7 90                NOP   
0167:10004DF8 90                NOP   
0167:10004DF9 90                NOP   
0167:10004DFA 90                NOP   
0167:10004DFB 90                NOP   
0167:10004DFC 90                NOP   
0167:10004DFD 90                NOP   
0167:10004DFE 90                NOP   
0167:10004DFF 90                NOP   
0167:10004E00 56                PUSH    ESI
0167:10004E01 6880C30010        PUSH    DWORD 1000C380
0167:10004E06 68F0A90010        PUSH    DWORD 1000A9F0
0167:10004E0B FF1518910010      CALL    `USER32!FindWindowA`
0167:10004E11 8BF0              MOV      ESI,EAX
0167:10004E13 85F6              TEST    ESI,ESI
0167:10004E15 7421              JZ      10004E38              ==>here!! 總是jmp
0167:10004E17 56                PUSH    ESI

改為:
0167:10004DF4 66C705154E00107421 MOV      WORD [10004E15],2174  ==>change [10004E15]
0167:10004DFD EB18              JMP      SHORT 10004E17        ==>change 跳到10004E17
0167:10004DFF 90                NOP   
0167:10004E00 56                PUSH    ESI
0167:10004E01 6880C30010        PUSH    DWORD 1000C380
0167:10004E06 68F0A90010        PUSH    DWORD 1000A9F0
0167:10004E0B FF1518910010      CALL    `USER32!FindWindowA`
0167:10004E11 8BF0              MOV      ESI,EAX
0167:10004E13 85F6              TEST    ESI,ESI
0167:10004E15 EBDD              JMP      SHORT 10004DF4        ==>change 跳到10004DF4
0167:10004E17 56                PUSH    ESI

執行完一次後,10004E15變成原樣:
0167:10004DF4 66C705154E00107421 MOV      WORD [10004E15],2174  ==>不會到此了
0167:10004DFD EB18              JMP      SHORT 10004E17        ==>不會到此了
0167:10004DFF 90                NOP   
0167:10004E00 56                PUSH    ESI
0167:10004E01 6880C30010        PUSH    DWORD 1000C380
0167:10004E06 68F0A90010        PUSH    DWORD 1000A9F0
0167:10004E0B FF1518910010      CALL    `USER32!FindWindowA`
0167:10004E11 8BF0              MOV      ESI,EAX
0167:10004E13 85F6              TEST    ESI,ESI
0167:10004E15 7421              JZ      10004E38              ==>change 總是jmp
0167:10004E17 56                PUSH    ESI

怎麼樣,改得簡單吧,真心希望大家能看懂!
試了試,一點問題都沒有!COOOOOOOOL!!

                     
                                                  /\zest/\
                                                    2001.2

相關文章