发信人: Reinhard.bbs@bbs.sjtu.edu.cn (摘星的人), 信区: cnhacker
标  题: Soft-Ice 修改密技 -3 by 软蛀 -- Alex 整理(转寄)
发信站: 饮水思源站 (Fri Apr 25 19:09:04 1997)
转信站: Lilac!ustcnews!ustcnews!sjtunews!sjtubbs
出  处: bbs.sjtu.edu.cn


                                                             ┌┐┌┐∞
【 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
390A:00001A9C 660FB74624               MOVZX    EAX,Word Ptr [BP+24]
390A:00001AA1 C606FC0300               MOV      Byte Ptr [03FC],00
390A:00001AA6 B400                     MOV      AH,00
390A:00001AA8 660FB7C0                 MOVZX    EAX,AX
390A:00001AAC C606D10C00               MOV      Byte Ptr [0CD1],00
390A:00001AB1 BB2000                   MOV      BX,0020
390A:00001AB4 8EC3                     MOV      ES,BX
390A:00001AB6 660FB75E36               MOVZX    EBX,Word Ptr [BP+36]
390A:00001ABB 66C1E304                 SHL      EBX,04
390A:00001ABF 836E3206                 SUB      Word Ptr [BP+32],6
390A:00001AC3 660FB77E32               MOVZX    EDI,Word Ptr [BP+32]
390A:00001AC8 2667668B148500000000     MOV      EDX,ES:[EAX*4]
390A:00001AD2 875626                   XCHG     DX,[BP+26]
390A:00001AD5 89169101                 MOV      [0191],DX
390A:00001AD9 266789143B               MOV      ES:[EBX+EDI],DX
390A:00001ADE 66C1EA10                 SHR      EDX,10
390A:00001AE2 83C702                   ADD      DI,2
390A:00001AE5 87562A                   XCHG     DX,[BP+2A]
390A:00001AE8 89168F01                 MOV      [018F],DX
390A:00001AEC 266789143B               MOV      ES:[EBX+EDI],DX
390A:00001AF1 83C702                   ADD      DI,2
390A:00001AF4 8B562E                   MOV      DX,[BP+2E]
390A:00001AF7 6681662EFFFCFEFF         AND      Dword Ptr [BP+2E],FFFEFCFF
390A:00001AFF 803E570100               CMP      Byte Ptr [0157],00  ┐
390A:00001B04 0F841100                 JE       1B19                │
390A:00001B08 F7C20001                 TEST     DX,0100             │
390A:00001B0C 0F840900                 JE       1B19                │就
390A:00001B10 800EFA0310               OR       Byte Ptr [03FA],10  │这
390A:00001B15 81E2FFFE                 AND      DX,FEFF             │一
390A:00001B19 266789143B               MOV      ES:[EBX+EDI],DX     │段
390A:00001B1E A38D01                   MOV      [018D],AX           │
390A:00001B21 F606FA033F               TEST     Byte Ptr [03FA],3F  │
390A:00001B26 0F851700                 JNE      1B41                ┘
390A:00001B2A 665F                     POP      EDI
390A:00001B2C 665E                     POP      ESI
390A:00001B2E 665A                     POP      EDX
390A:00001B30 6659                     POP      ECX
390A:00001B32 665B                     POP      EBX
390A:00001B34 6658                     POP      EAX
390A:00001B36 1F                       POP      DS
390A:00001B37 5D                       POP      BP
390A:00001B38 07                       POP      ES
390A:00001B39 5D                       POP      BP
390A:00001B3A 665D                     POP      EBP
390A:00001B3C 83C402                   ADD      SP,2
390A:00001B3F 66CF                     IRETD

    诈看之下好像没有位置可以塞进我们的程式码 ,其实你可以看到 1B04.1B0C.1B26
是用 80386 指令码去编的 ,换句话说你如果把它改成 74xx (JE xxx) 岂不是行行可
省 2 Bytes ,共可省 6 Bytes ,够不够你塞解锁的程式码呢 ?  最後建议各位两种改
法都改会比较稳当。

    将来如果还有其它当萤幕、当键盘的方法 ,你是不是会闪了呢 ,若有机会的话 ,
咱们下次再见。

--


                                                    沉默的人
                                                 Reinhard Young

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.96.210.121]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:207.306毫秒