解读cih进入ring0的秘密
看了大家对前面几篇的评论,觉得有点怪异,看来大家对技术的追求还不是那么强烈,声明以下,我写的这些东西或许永远也不会对你的实际应用有帮助,这只是黑客们对技术的研究,如果你的愿望只是一般的编程,这篇文章不适合你。
这几天开始编一个游戏,以前没有接触过游戏编程,觉得很有意思,还有directX的编程,真得很爽,我估计也就几天的热情吧,呵呵。
还有,我知道我的老婆每天都来看我的文章,这里问个好:亲爱的tina,你好啊!
正题。
我们今天研究的代码主要是进入ring0的实现。首先我们要有几个问题,不知道你们有没有这样的问题,反正我在研究cih的时候是有。
1、什么是ring0?
2、为什么要进入ring0?
3、怎么样才算进入ring0
现在解答一下。
什么是ring0呢?windows分4层保护结构,最核心的ring0,最外面的是ring3,ring0层的应用程序可以直接和硬件打交道,其他层的就必须通过hal.dll来调用相应的api来和硬件打交道,所以如果想突破限制,搞些破坏就要进入ring0.
怎么才算进入ring0? 当cs=28,ds=30时就可以认为进入了ring0.
进入的方法还有很多种,比如什么中断门,陷阱门,调用门,具体请察看微机原理相应的知识。
怎么通过seh进入呢?记得上一章我们说的lpcontext么?就是靠它了!
现在说一下流程:
1、设置seh链表
2、触发断点异常int3
3、清除自己触发的异常
4、通过lpcontext修改cs=28,ds=30
这就是主要的了,是不是很简单亚。其实到昨天我还是想不通为什么要通过seh才能修改,今天终于灵光一现,想通了,其实就是看我自己写的第3篇的那段关于lpcontext的话才想到的,呵呵。
下面是我学习cih的代码,我也加入了一些注释,你们看吧:
;;;;;;;;;;;;;;;;;;;;;;;;;;我估计这段代码使tasm编译的,和masm有些不一样
include "../inc/win32n.inc"
extern _ExitProcess@4
extern _GetTickCount@0
extern _GetStdHandle@4
extern _MessageBeep@4
extern _WriteConsoleA@20
global _mainCRTStartup
SEGMENT .text USE32 class=code
_mainCRTStartup
push dword STD_OUTPUT_HANDLE ;
call _GetStdHandle@4 ;获取输出控制屏的句柄
mov [stdout],eax ;保存句柄
;******************************************
;* 以下这一段是按照SEH必要的方式形成链表
;******************************************
xor ebx,ebx ;先清0
push dword eh ;压入自己ExceptHandle指针,即 eh 处
push dword [fs:ebx] ;压入当前[FS:0] ,想想为什么不直接fs:0?
mov [fs:ebx],esp ;形成链表形式