发信人: Reinhard.bbs@bbs.sjtu.edu.cn (摘星的人), 信区: cnhacker
标 题: Soft-Ice 修改密技 -2 by 软蛀 -- Alex 整理(转寄)
发信站: 饮水思源站 (Fri Apr 25 19:07:32 1997)
转信站: Lilac!ustcnews!ustcnews!sjtunews!sjtubbs
出 处: bbs.sjtu.edu.cn
【 S-ICE 修改密技二 】 - 软蛀 -
==========================================================================
当应用程式触动 INT_1 的指令时 ,有时候 S-ICE 会发出 BEEP 声 ,并因此延迟
了一秒左右 ,这个问题将会造成使用者除错时的困扰 ,虽然可以使用 "Break ON" 的
命令来克服此问题 ,但是遇到 "DB F1" 的指令时 ,一定会哔哔叫 ,没有办法解决 ,
除非修改指令码....嘿嘿嘿...不信可写个小程式试试看 !!
本例是使用 386DEBUG 与 S-ICE v2.64 为例..
C:\>DXDEBUG S-ICE.EXE
-u DS:4377
382D:00004377 6A00 PUSH Word Ptr 0
382D:00004379 E9F4D6 JMP 1A70
382D:0000437C 6A01 PUSH Word Ptr 1
382D:0000437E E9C7D8 JMP 1C48
382D:00004381 6A02 PUSH Word Ptr 2
382D:00004383 E98ADC JMP 2010
382D:00004386 6A03 PUSH Word Ptr 3
382D:00004388 E9D6DC JMP 2061
382D:0000438B 6A04 PUSH Word Ptr 4
382D:0000438D E9E0D6 JMP 1A70
382D:00004392 E9DBD6 JMP 1A70
382D:00004395 6A06 PUSH Word Ptr 6
382D:00004397 E943DF JMP 22DD
-u DS:1c48 (观看 INT_1 的程式码)
382D:00001C48 6655 PUSH EBP
382D:00001C4A 06 PUSH ES
382D:00001C4B 06 PUSH ES
382D:00001C4C 1E PUSH DS
382D:00001C4D 1E PUSH DS
382D:00001C4E 6650 PUSH EAX
382D:00001C50 6653 PUSH EBX
382D:00001C52 6651 PUSH ECX
382D:00001C54 6652 PUSH EDX
382D:00001C56 6656 PUSH ESI
382D:00001C58 6657 PUSH EDI
382D:00001C5A 668BEC MOV EBP,ESP
382D:00001C5D B80800 MOV AX,0008
382D:00001C60 8ED8 MOV DS,AX
382D:00001C62 8B462A MOV AX,[BP+2A]
382D:00001C65 A33F02 MOV [023F],AX
382D:00001C68 8B4626 MOV AX,[BP+26]
382D:00001C6B A34102 MOV [0241],AX
382D:00001C6E 8B462E MOV AX,[BP+2E]
382D:00001C71 A34302 MOV [0243],AX
382D:00001C74 B82000 MOV AX,0020
382D:00001C77 8EC0 MOV ES,AX
382D:00001C79 F746300200 TEST Word Ptr [BP+30],0002
382D:00001C7E 0F850000 JNE 1C82
382D:00001C82 0F21F0 MOV EAX,DR6 ;
382D:00001C85 6650 PUSH EAX ;
382D:00001C87 6633C0 XOR EAX,EAX ;将DR6清0
382D:00001C8A 0F23F0 MOV DR6,EAX ;
382D:00001C8D 6658 POP EAX ;
382D:00001C8F A26401 MOV [0164],AL
382D:00001C92 A90040 TEST AX,4000 ;是否因'T'产生中断
382D:00001C95 0F859700 JNE 1D30 ;是则 JMP
382D:00001C99 A80F TEST AL,0F ;是否因DRx产生中断
382D:00001C9B 0F852B02 JNE 1ECA ;是则 JMP
382D:00001C9F 8D1EC20A LEA BX,[0AC2]
382D:00001CA3 B90400 MOV CX,0004 ;四个断点
382D:00001CA6 807F1100 CMP Byte Ptr [BX+11],00 ;比较程式
382D:00001CAA 0F840800 JE 1CB6 ;
382D:00001CAE 807F1104 CMP Byte Ptr [BX+11],04 ;
382D:00001CB2 0F851C00 JNE 1CD2 ;
382D:00001CB6 668B7F05 MOV EDI,[BX+5] ;
382D:00001CBA 660FB7462A MOVZX EAX,Word Ptr [BP+2A];
382D:00001CBF 66C1E004 SHL EAX,04 ;
382D:00001CC3 660FB77626 MOVZX ESI,Word Ptr [BP+26];
382D:00001CC8 6603C6 ADD EAX,ESI ;
382D:00001CCB 663BC7 CMP EAX,EDI ;
382D:00001CCE 0F840503 JE 1FD7 ;
382D:00001CD2 83C316 ADD BX,16 ;
382D:00001CD5 E2CF LOOP 1CA6 ;
382D:00001CD7 50 PUSH AX ;都不是上面的
382D:00001CD8 51 PUSH CX ;原因 ,就打开
382D:00001CD9 B90300 MOV CX,0003 ;喇叭叫几声
382D:00001CDC B003 MOV AL,03 ;
382D:00001CDE E661 OUT 61,AL (喇叭ON) ;
382D:00001CE0 51 PUSH CX ;
382D:00001CE1 33C9 XOR CX,CX ;
382D:00001CE3 E2FE LOOP 1CE3 (DELAY) ;
382D:00001CE5 E2FE LOOP 1CE5 ;
382D:00001CE7 E2FE LOOP 1CE7 ;
382D:00001CE9 E2FE LOOP 1CE9 ;
382D:00001CEB E2FE LOOP 1CEB ;
382D:00001CED E2FE LOOP 1CED ;
382D:00001CEF E2FE LOOP 1CEF ;
382D:00001CF1 E2FE LOOP 1CF1 ;
382D:00001CF3 E2FE LOOP 1CF3 ;
382D:00001CF5 E2FE LOOP 1CF5 ;
382D:00001CF7 E2FE LOOP 1CF7 ;
382D:00001CF9 E2FE LOOP 1CF9 ;
382D:00001CFB E2FE LOOP 1CFB ;
382D:00001CFD E2FE LOOP 1CFD ;
382D:00001CFF E2FE LOOP 1CFF ;
382D:00001D01 B000 MOV AL,00 ;
382D:00001D03 E661 OUT 61,AL (喇叭OFF) ;
382D:00001D05 E2FE LOOP 1D05 ;
382D:00001D07 E2FE LOOP 1D07 (DELAY) ;
382D:00001D09 E2FE LOOP 1D09 ;
382D:00001D0B E2FE LOOP 1D0B ;
382D:00001D0D E2FE LOOP 1D0D ;
382D:00001D0F E2FE LOOP 1D0F ;
382D:00001D11 E2FE LOOP 1D11 ;
382D:00001D13 E2FE LOOP 1D13 ;
382D:00001D15 E2FE LOOP 1D15 ;
382D:00001D17 59 POP CX ;
382D:00001D18 E2C2 LOOP 1CDC ;
382D:00001D1A B80200 MOV AX,0002 ;
382D:00001D1D E2FE LOOP 1D1D ;
382D:00001D1F 48 DEC AX ;
382D:00001D20 75FB JNE 1D1D ;
382D:00001D22 59 POP CX ;
382D:00001D23 58 POP AX ;
382D:00001D24 EB13 JMP 1D39 ;
因此你必需想办法让 S-ICE 认识发生此中断的原因 ,或是叫它闭嘴...真残忍
---------------------------------------------------------------------------
有些烂程式会故意用一些 CPU 不认识的指令来产生 INT_6 ,例如 FFFF.FEF4 之类的
指令码 ,此时 S-ICE 会秀出 Gxxxxxx Pxxxxxx Exxxxx
(R)eturn (C)ountinue
万一程式大量使用此指令 ,你岂不是要按键按到爽 ,追究原因是 S-ICE 不认识它 ,
所以才会停下来让使用者确定是否写错程式啦 ,可惜就有保护故意使用它 ,使得它
反而是除错过程的困扰 ,因此我们得想办法让 S-ICE 认识它 ,或是让它的眼睛瞎掉
(让它没看到)....毒瞎它的眼睛啦....
-U DS:23F4
382D:000023F4 80FBF0 CMP BL,F0
382D:000023F7 0F841300 JE 240E
382D:000023FB 26678B5FFE MOV BX,ES:[EDI-2] ;
382D:00002400 81FBCD06 CMP BX,06CD ;是否因为INT_6
382D:00002404 0F840600 JE 240E ;产生中断
382D:00002408 B80006 MOV AX,0600 ;
382D:0000240B E8D712 CALL 36E5 ;秀出视窗并请按
382D:0000240E B80600 MOV AX,0006 ;C.R.键
382D:00002411 E98DF6 JMP 1AA1 ;
382D:00002414 6655 PUSH EBP ;
-U DS:36E5
382D:000036E5 50 PUSH AX ;打开视窗的副程式
382D:000036E6 56 PUSH SI ;
382D:000036E7 51 PUSH CX ;※注一
382D:000036E8 33C0 XOR AX,AX ;
382D:000036EA B9AA00 MOV CX,00AA ;
382D:000036ED 8D364A01 LEA SI,[014A] ;
382D:000036F1 2E1304 ADC AX,CS:[SI] ;
382D:000036F4 46 INC SI ;
382D:000036F5 E2FA LOOP 36F1 ;
382D:000036F7 150000 ADC AX,0000 ;
382D:000036FA 2E3B06F501 CMP AX,CS:[01F5] ;
382D:000036FF 0F840200 JE 3705 ;
382D:00003703 EBFE JMP 3703 ;
382D:00003705 59 POP CX ;
注一: 打开视窗的程式开头刚好就是 S-ICE 检查序号是否被篡改的保护程式.
若序号被篡改 ,则会当在 3703 的地方.
---------------------------------------------------------------------------
追踪程式後 ,发现应用程式也会使用除错暂存器来解码....怎麽办 ?
或许各位有听过在V86下的应用程式是无权读写系统暂存器(CRx.DRx) ,所以当V86下
的程式尝试读写这些暂存器 ,会被 S-ICE 拦下 ,经由内部指令翻译的方式 ,让使用者
能够改到系统暂存器 ,不过万一 S-ICE 不做此命令翻译 ,则 V86 下的程式就取不到
控制权 ,因此首先你要知道被除错的程式用了那些除错暂存器 ,或是你打算开放那些
给使用者 ,那些不开放...甚至做出适当回应..
底下是 S-ICE 对於指令翻译的程式码..
-U DS:2D42
3994:00002D42 668B4614 MOV EAX,[BP+14]
3994:00002D46 0F23C0 MOV DR0,EAX
3994:00002D49 E9D600 JMP 2E22
3994:00002D4C 0F21C0 MOV EAX,DR0
3994:00002D4F 66894614 MOV [BP+14],EAX
3994:00002D53 E9CC00 JMP 2E22
3994:00002D56 80FC23 CMP AH,23
3994:00002D59 0F850A00 JNE 2D67
3994:00002D5D 668B4614 MOV EAX,[BP+14]
3994:00002D61 0F23C8 MOV DR1,EAX
3994:00002D64 E9BB00 JMP 2E22
3994:00002D67 0F21C8 MOV EAX,DR1
3994:00002D6A 66894614 MOV [BP+14],EAX
3994:00002D6E E9B100 JMP 2E22
3994:00002D71 80FC23 CMP AH,23
3994:00002D74 0F850A00 JNE 2D82
3994:00002D78 668B4614 MOV EAX,[BP+14]
3994:00002D7C 0F23D0 MOV DR2,EAX
3994:00002D7F E9A000 JMP 2E22
3994:00002D82 0F21D0 MOV EAX,DR2
3994:00002D85 66894614 MOV [BP+14],EAX
3994:00002D89 E99600 JMP 2E22
3994:00002D8C 80FC23 CMP AH,23
3994:00002D8F 0F850A00 JNE 2D9D
3994:00002D93 668B4614 MOV EAX,[BP+14]
3994:00002D97 0F23D8 MOV DR3,EAX
3994:00002D9A E98500 JMP 2E22
3994:00002D9D 0F21D8 MOV EAX,DR3
3994:00002DA0 66894614 MOV [BP+14],EAX
3994:00002DA4 EB7C JMP 2E22
3994:00002DA6 90 NOP
3994:00002DA7 80FC23 CMP AH,23
3994:00002DAA 0F850A00 JNE 2DB8
3994:00002DAE 668B4614 MOV EAX,[BP+14]
3994:00002DB2 0F23F0 MOV DR6,EAX
3994:00002DB5 EB6B JMP 2E22
3994:00002DB7 90 NOP
3994:00002DB8 0F21F0 MOV EAX,DR6
3994:00002DBB 66894614 MOV [BP+14],EAX
3994:00002DBF EB61 JMP 2E22
3994:00002DC1 90 NOP
3994:00002DC2 80FC23 CMP AH,23
3994:00002DC5 0F850A00 JNE 2DD3
3994:00002DC9 668B4614 MOV EAX,[BP+14]
3994:00002DCD 0F23F8 MOV DR7,EAX
3994:00002DD0 EB50 JMP 2E22
3994:00002DD2 90 NOP
3994:00002DD3 0F21F8 MOV EAX,DR7
3994:00002DD6 66894614 MOV [BP+14],EAX
3994:00002DDA EB46 JMP 2E22
3994:00002DDC 90 NOP
3994:00002DDD 80FC22 CMP AH,22
3994:00002DE0 0F850700 JNE 2DEB
3994:00002DE4 668B4614 MOV EAX,[BP+14]
3994:00002DE8 EB38 JMP 2E22
3994:00002DEA 90 NOP
3994:00002DEB 0F20C0 MOV EAX,CR0
3994:00002DEE 66894614 MOV [BP+14],EAX
3994:00002DF2 EB2E JMP 2E22
3994:00002DF4 90 NOP
3994:00002DF5 80FC22 CMP AH,22
3994:00002DF8 0F850700 JNE 2E03
3994:00002DFC 668B4614 MOV EAX,[BP+14]
3994:00002E00 EB20 JMP 2E22
3994:00002E02 90 NOP
3994:00002E03 0F20D0 MOV EAX,CR2
3994:00002E06 66894614 MOV [BP+14],EAX
3994:00002E0A EB16 JMP 2E22
3994:00002E0C 90 NOP
3994:00002E0D 80FC22 CMP AH,22
3994:00002E10 0F850700 JNE 2E1B
3994:00002E14 668B4614 MOV EAX,[BP+14]
3994:00002E18 EB08 JMP 2E22
3994:00002E1A 90 NOP
3994:00002E1B 0F20D8 MOV EAX,CR3
3994:00002E1E 66894614 MOV [BP+14],EAX
举例来说 ,如果你不想使用者的程式写入 DR2 ,但允许读取 ,那你就把写入 DR2 的
指令干掉就行了....又举例来说 ,有个GA的外壳会用 DR0 做解码 ,并涂掉其它 DRx
那麽我们就开放 DR0 ,其它的写入动作忽略 ,并於写入 DR7 时做适当回应 ,於是两
者皆可和平使用 DRx ,它用 DR0.DR7 ,S-ICE 用 DR3.DR7 ,还有一种情形是 PPIP
这套外壳只是涂掉 DRx ,因此你只要不要让 S-ICE 去翻译这些断手断脚的指令 ,追
起来形同没有防破能力哩......还有其它玩法吗 ,当然有...自己去找吧.
至於你要怎麽知道应用程式用了那些除错暂存器 ,那就得凭个人的功力了 ,笔者有自
己的「系统资源分析」程式 ,你呢....哈哈哈....自己想办法吧 ,我是不会流出来害
人的。又如果应用程式把所有的除错暂存器用完了呢 ,那麽你就只好放弃使用它 ,改
用其它类似的硬体中断能力 ,例如 BPX.BPINT.'T' 等等 ,或用P5新增加的 CR4.DR4.
DR5 暂存器啦 !!
有关於 V86 下读取系统暂存器的问题与技巧 ,请参阅笔者保护模式的电子刊物第三
集。
---------------------------------------------------------------------------
上次提到在倚天中文下叫出 S-ICE 的密技改法又有新版的改法了:
(因为我没有未改过的版本 ,所以列出改过的程式码给各为参"拷"一下吧)
-u DS:3127 (INT_10h 进入点)
3736:00003127 6655 PUSH EBP
3736:00003129 06 PUSH ES
3736:0000312A 06 PUSH ES
3736:0000312B 1E PUSH DS
3736:0000312C 1E PUSH DS
3736:0000312D 6650 PUSH EAX
3736:0000312F 6653 PUSH EBX
3736:00003131 6651 PUSH ECX
3736:00003133 6652 PUSH EDX
3736:00003135 6656 PUSH ESI
3736:00003137 6657 PUSH EDI
3736:00003139 668BEC MOV EBP,ESP
3736:0000313C B80800 MOV AX,0008
3736:0000313F 8ED8 MOV DS,AX
3736:00003141 8B462A MOV AX,[BP+2A]
3736:00003144 A33F02 MOV [023F],AX
3736:00003147 8B4626 MOV AX,[BP+26]
3736:0000314A A34102 MOV [0241],AX
3736:0000314D 8B462E MOV AX,[BP+2E]
3736:00003150 A34302 MOV [0243],AX
3736:00003153 807E1500 CMP Byte Ptr [BP+15],00
3736:00003157 0F854D00 JNE 31A8
3736:0000315B 8A4614 MOV AL,[BP+14]
3736:0000315E B012 MOV AL,12 ;改
3736:00003160 A2EE01 MOV [01EE],AL ;的
3736:00003163 8026FB03FE AND Byte Ptr [03FB],FE ;地
3736:00003168 EB3E JMP 31A8 ;方
3736:0000316A 90 NOP
3736:0000316B 90 NOP
本篇真的是便宜各位玩家啦(有得抄嘛) !!
---------------------------------------------------------------------------
--
沉默的人
Reinhard Young
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.96.210.121]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:208.096毫秒