入门级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
- 标 题:入门级smc(self modifying code)例子一个。 (4千字)
- 作 者:zest
- 时 间:2001-2-4 4:40:58
- 链 接:http://bbs.pediy.com