入門級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