乙個簡單的程序 跳到ring3

2021-06-18 16:14:40 字數 1673 閱讀 4351

typedef	unsigned int		u32;

typedef unsigned short u16;

typedef unsigned char u8;

typedef struct descriptor /* ???8 ??a?-?è??*/

descriptor;

void _set_gdt_desc(struct desc_struct *descriptor_addr,u32 base,u32 limit,u16 attr)

#define da_c     0x98        //存在的只執行**段屬性值

#define da_32    0x4000  //32 位段

#define da_dpl3  0x60   //dpl = 3

#define da_dpl0  0x00   //dpl = 0

#define da_drwa  0x93 //存在的已訪問可讀寫資料段型別

#define da_drw   0x92  //存在的可讀寫資料段屬性值

#define sa_rpl3   3        //rpl(requested privilege level)=3: 請求特權級,用於特權檢查。

_set_gdt_desc(&gdt[2],0xb8000,0x0ffff,da_drw+ da_dpl3);

//堆疊段,選擇子為0x28

_set_gdt_desc(&gdt[5],0,0xffffffff,da_drwa + da_32 + da_dpl3);

//**段,選擇子為0x30

_set_gdt_desc(&gdt[6],0,0xffffffff,da_c+da_32+da_dpl3);

寫乙個簡單的程序,不停的列印a

void delay(int time)

} }}void testa(void)

}

下面我們該實現跳轉了

#define move_to_user_mode() \

__asm__ ("movl %%esp,%%eax\n\t" \

"pushl $0x2b\n\t" \

"pushl %%eax\n\t" \

"pushfl\n\t"\

"pushl $0x33\n\t" \

"pushl $testa\n\t" \

"iret\n" \

:::"ax")

第2行將暫存器esp的值放到eax中

第3行設定ss,即堆疊段選擇子0x28+3,3是sa_rpl3

第3行設定esp

第4行設定

第5行設定cs,即**段選擇子0x30+3,3是sa_rpl3

第5行設定eip

第6行iret實現跳轉

#define move_to_user_mode() \

__asm__ ("movl %%esp,%%eax\n\t" \   

"pushl $0x2b\n\t" \

"pushl %%eax\n\t" \

"pushfl\n\t"\

"pushl $0x33\n\t" \

"pushl $testa\n\t" \

"iret\n" \

:::"ax")

乙個禁止任何ring3除錯的驅動

include define makelong low,high ulong ushort ulong low 0xffff ulong ushort ulong high 0xffff 16 define get low16 of 32 data ushort ulong data 0xffff ...

3乙個簡單的Shader

乙個簡單的unityshader看起來是這樣 cg 段 由cgprogram與endcg包圍起來 編譯指令這裡的用來告訴unity,什麼是頂點著色器,什麼是片元著色器 pragma vertex 頂點著色器函式名 pragma fragment 片元著色器的函式名 在呼叫drawcall的時候,me...

乙個簡單的指令碼守護程序

專案過程中,經常會有很多的指令碼,shell指令碼 php指令碼 python指令碼等,更有一些指令碼是需要常駐記憶體執行的,簡而言之就是需要while true 的模式執行。但是有的時候,乙個常駐記憶體的程序會因為某些耗時操作而夯住,不再往下繼續執行,成為了乙個殭屍程序 或者因為某個操作偶然出錯,...