Delphi 能不能从Ring 3进入Ring 0
Delphi 能不能從Ring 3進入Ring 0?
樓主skyworld_xm(skyworld)2004-11-19 09:58:55 在 Delphi / Windows SDK/API 提問Delphi ? 能不能從Ring ? 3進入Ring ? 0? ? 
? 有例子嗎? ? 
? 多謝. 問題點數:100、回復次數:20Top 
1 樓jinjazz(近身剪)回復于 2004-11-19 10:13:27 得分 10
我發現了一篇發表在1999.11.29 ? b13版的 ? 
? 《令win32應用程序跳入系統層》東南大學 ? 盧威 ? luwei@126.com ? 
? 是用vc++嵌匯編做的, ? 
? 很接近了,可試試 ? 
? ? 
? BCB或DELPHI進入Ring0 ? 
? 東南大學盧威1999.12發表在<<計算機世界>>報上的一篇 ? 
? <<WIN32跳入系統0層>>,原采用VC++編程,現改成C++Builder ? 
? 供諸位參考,DELPHI類似; ? ? 
? ? 
? ? 
? void ? Ring0Proc() ? ? // ? 在Ring0中執行你自已的代碼 ? 
? { ? 
? ? ? ? ? // ? ....... ? 
? ? ? ? ? asm ? mov ? eax,CR0; ? ? // ? 試驗一下Ring3不能執行的特權指令 ? 
? ? ? ? ? // ? ....... ? 
? } ? 
? // ? ===================================================== ? 
? void ? ? __declspec(naked) ? NewInt() ? //新中斷 ? 
? { ? 
? ? ? ? ? ? ? Ring0Proc(); ? 
? ? ? ? ? ? ? asm ? ? iretd; ? 
? } ? 
? #define ? ? IntNo ? ? 9 ? 
? DWORDLONG ? ? IDTR,SavedGate; ? 
? WORD ? OurGate[4]={0,0x0028,0xee00,0x0000}; ? 
? void ? ? GotoRing0() ? 
? { ? 
? ? ? ? ? ? ? asm ? 
? ? ? ? ? ? ? ? ? { ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? eax,offset ? NewInt; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? [OurGate],ax; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? shr ? ? eax,16; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? [OurGate+6],ax; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? sidt ? fword ? ptr ? IDTR; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? ebx,dword ? ptr ? [IDTR+2]; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? add ? ? ebx,IntNo*8; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? edi,offset ? SavedGate; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? esi,ebx; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? edi,ebx; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? esi,offset ? OurGate; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? int ? ? IntNo; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? edi,ebx; ? ? // ? 開始恢復原中斷門 ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? esi,offset ? SavedGate; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? } ? 
? } ? 
? // ? =================================================== ? 
? ? 
? void ? __fastcall ? TForm1::Button1Click(TObject ? *Sender) ? 
? { ? 
? ? ? ? ? GotoRing0(); ? 
? } ? 
? *********************************************** ? 
? ? 
? 編譯是通過了,你自己調試一下吧。 ? 
? 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: ? 
? sti ? 
? ? 
? end; ? 
? ---------------------------------- ? 
? const ? IntNo=9; ? 
? ? 
? var ? 
? IDTR,SavedGate:int64; ? 
? OurGate:array[0..3] ? of ? word=(0,$0028,$ee00,$0000); ? 
? ? 
? procedure ? Ring0Proc; ? ? // ? 在Ring0中執行你自已的代碼 ? 
? begin ? 
? ? ? ? ? // ? ....... ? 
? ? ? ? ? asm ? 
? ? ? ? ? mov ? eax,CR0; ? ? // ? 試驗一下Ring3不能執行的特權指令 ? 
? ? ? ? ? end; ? 
? end; ? 
? // ? ===================================================== ? 
? procedure ? ? ? NewInt(); ? //新中斷 ? 
? begin ? 
? ? ? ? ? ? ? Ring0Proc(); ? 
? ? ? ? ? ? ? asm ? 
? ? ? ? ? ? ? iretd; ? 
? ? ? ? ? ? ? end; ? 
? end; ? 
? ? 
? procedure ? ? GotoRing0; ? 
? begin ? 
? ? ? ? ? ? ? asm ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? eax,offset ? NewInt; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? word ? ptr[OurGate],ax; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? shr ? ? eax,16; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? word ? ptr[OurGate+6],ax; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? sidt ? fword ? ptr ? IDTR;//在Delphi中應該改成:lea ? ebx, ? idtr; ? ? ? ? ? sidt ? [ebx] ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? ebx,dword ? ptr ? [IDTR+2]; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? add ? ? ebx,IntNo*8; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? edi,offset ? SavedGate; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? esi,ebx; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? edi,ebx; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? esi,offset ? OurGate; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? int ? ? IntNo; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? edi,ebx; ? ? // ? 開始恢復原中斷門 ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? esi,offset ? SavedGate; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? end; ? 
? end; ? 
? // ? =================================================== ? 
? ? 
? procedure ? TForm1.Button1Click(Sender: ? TObject); ? 
? begin ? 
? ? gotoring0; ? 
? end; ? 
? ******************************** ? 
? const ? IntNo=3; ? 
? ? 
? //var ? 
? //IDTR,SavedGate:int64; ? 
? ? 
? procedure ? Ring0Proc; ? ? // ? 在Ring0中執行你自已的代碼 ? 
? begin ? 
? ? ? ? ? // ? ....... ? 
? // ? ? ? ? showmessage('kfsdj;fk'); ? 
? ? ? ? ? asm ? 
? ? ? ? ? mov ? eax,CR0; ? ? // ? 試驗一下Ring3不能執行的特權指令 ? 
? ? ? ? ? end; ? 
? end; ? 
? // ? ===================================================== ? 
? procedure ? ? ? NewInt(); ? //新中斷 ? 
? begin ? 
? ? ? ? ? ? ? Ring0Proc(); ? 
? ? ? ? ? ? ? asm ? 
? ? ? ? ? ? ? iretd; ? 
? ? ? ? ? ? ? end; ? 
? end; ? 
? ? 
? procedure ? ? GotoRing0; ? 
? begin ? 
? ? ? ? ? ? ? asm ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ? edi,offset ? buf; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? sidt ? [edi]; ? ? ? ? //Get ? IDT-->buf; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ebx,[edi+2] ? ? ? //求中斷門基址 ? 
? ? ? ? ? ? ? ? ? ? ? ? ? add ? ebx,IntNo*8; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? esi,ebx; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? push ? edi; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? push ? esi; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? cli; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? eax,offset ? newint; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? [ebx],ax; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? shr ? eax,16; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? [ebx+6],ax; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? ax,0ee00h; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? mov ? [ebx+4],ax; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? int ? intno; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? pop ? edi ? 
? ? ? ? ? ? ? ? ? ? ? ? ? pop ? esi; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? movsd; ? 
? ? ? ? ? ? ? ? ? ? ? ? ? sti; ? 
? ? ? ? ? ? ? ? ? end; ? 
? end; ? 
總結
以上是生活随笔為你收集整理的Delphi 能不能从Ring 3进入Ring 0的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 《大数据》第2期“专题”——数据开放与政
 - 下一篇: 【计算机组成原理】Cache