📄 siceg.txt
字号:
---------------------------------------------------------------------------
追踪程式後 ,发现应用程式也会使用除错暂存器来解码....怎麽办 ?
或许各位有听过在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
---------------------------------------------------------------------------
┌┐┌┐∞
【 S-ICE 修改密技第三集 】 ┘└┘└┘
==========================================================================
在拨陈明志写的 Decoder.COM 壳 ,萤幕常常会被保护给关掉 ,造成 S-ICE 看不
到画面 ,无法继续追纵....怎麽办呢 ?
很简单 ,因为它使用 "IN 3DA" 、"OUT 3C0,0" 的方式当掉萤幕 ,所以就可以用
"IN 3DA" 、"OUT 3C0,23" 还原画面 ,但是它不停的重复执行关掉萤幕的动作 ,如果
它一直关萤幕 ,而你一直开萤幕 ,拼命键入此命令岂不麻烦 ,所以笔者修改了 S-ICE
的部份程式码 ,让它在每次打开除错视窗时 ,自动执行上面两行指令 ,以後就不怕别
人当掉萤幕了。
很幸运的 S-ICE 每次在打开视窗的时候 ,会去检查序号的检查码 ,如果不正确
便会当机 ,既然已知每次打开视窗前就一定会检查序号保护 ,那麽你就可以修改此段
程式码 ,让它不但可以不检查序号的检查码 ,又可以帮你键入上面还原萤幕的按键动
作 ,岂不一举数得。
C:\>DXDEBUG S-ICE.EXE (以网路上的 2.64 为例)
-u ds:36e5
390A:000036E5 50 PUSH AX
390A:000036E6 56 PUSH SI
390A:000036E7 51 PUSH CX ┐
390A:000036EA B9AA00 MOV CX,00AA │ 检
390A:000036ED 8D364A01 LEA SI,[014A] │ 查
390A:000036F1 2E1304 ADC AX,CS:[SI] │ 序
390A:000036F4 46 INC SI ├ 号
390A:000036F5 E2FA LOOP 36F1 │ 的
390A:000036F7 150000 ADC AX,0000 │ 程
390A:000036FA 2E3B06F501 CMP AX,CS:[01F5] │ 式
390A:000036FF 0F840200 JE 3705 │
390A:00003703 EBFE JMP 3703 │
390A:00003705 59 POP CX ┘
390A:00003706 5E POP SI
390A:00003707 E81B00 CALL 3725
390A:0000370A 58 POP AX
390A:0000370B E85045 CALL 7C5E
390A:0000370E 33C9 XOR CX,CX
390A:00003710 BB0300 MOV BX,0003
(上面这段程式码如何找到 ,已在第二集叙述过 ,不再重复)
--------------------------------------------------------------------------
某些保护程式会使用失去相容性的方法去锁死键盘 ,其方法为 "OUT 60,F5"
解锁键盘的方法为 "OUT 60,F4" ,不过这种方法对於非 AMI KeyBoard BIOS 会产生
键盘锁死 ,也就是上锁有效、解锁无效 ,不过已有部份 PD/SW 外壳采用此法去防破
解 ,所以笔者也提出来讨论一下好了。
既然知道解锁法则 ,那麽你也可以用上面提到的方法去闪地雷 ,不过这种改法并
不是最好的选择 ,因为只要你没有下断点 ,就无法在在程式未执行完叫出 S-ICE ,这
是因为此时键盘还是被锁死 ,任何按键皆无效。所以还有其它更贱的改法 ,就是在每
次产生中断时执行本程式。
理论上如果保护程式锁死键盘後没有再使用任何中断 ,则键盘一样被锁死 ,其实
只要下 "BREAK ON" 则可以保证热键有效 ,因为程式只要执行 CLI.STI.CALL.....等
等命令就会触发保护模式下的中断 ,这个原因很难解释 ,只能说这是保护模式等级游
戏的规则 ,各位可以不去管它。
我想後者的程式码改法各位可能不知道要夹在那儿 ,我就随便列一段好了
C:\>DXDEBUG S-ICE.EXE
-u ds:1a70 (笔者随便举例列出 INT_90h 的中断处理程式)
(其实所有中断皆呼叫此段程式码)
390A:00001A70 6655 PUSH EBP
390A:00001A72 06 PUSH ES
390A:00001A73 06 PUSH ES
390A:00001A74 1E PUSH DS
390A:00001A75 1E PUSH DS
390A:00001A76 6650 PUSH EAX
390A:00001A78 6653 PUSH EBX
390A:00001A7A 6651 PUSH ECX
390A:00001A7C 6652 PUSH EDX
390A:00001A7E 6656 PUSH ESI
390A:00001A80 6657 PUSH EDI
390A:00001A82 668BEC MOV EBP,ESP
390A:00001A85 B80800 MOV AX,0008
390A:00001A88 8ED8 MOV DS,AX
390A:00001A8A 8B462A MOV AX,[BP+2A]
390A:00001A8D A33F02 MOV [023F],AX
390A:00001A90 8B4626 MOV AX,[BP+26]
390A:00001A93 A34102 MOV [0241],AX
390A:00001A96 8B462E MOV AX,[BP+2E]
390A:00001A99 A34302 MOV [0243],AX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -