当前位置: 首页 > news >正文

自己建网站做微商微信公共平台开发

自己建网站做微商,微信公共平台开发,百度网站开发业务,wordpress主题查询【0】写在前面 0.1#xff09;本代码旨在演示 从 ring0 转移到 ring3#xff08;即#xff0c;从高特权级 转移到 低特权级#xff09;0.2#xff09;本文 只对 与 门相关的 代码进行简要注释#xff0c;言简意赅#xff1b;0.3#xff09;文末的个人总结是干货#…【0】写在前面 0.1本代码旨在演示 从 ring0 转移到 ring3即从高特权级 转移到 低特权级0.2本文 只对 与 门相关的 代码进行简要注释言简意赅0.3文末的个人总结是干货前面代码仅供参考的且source code from orange’s implemention of a os. ; ; pmtest5a.asm ; 编译方法nasm pmtest5a.asm -o pmtest5a.com ; %include pm.inc ; 常量, 宏, 以及一些说明org 0100hjmp LABEL_BEGIN;[SECTION .gdt] ; GDT ; 段基址, 段界限 , 属性 LABEL_GDT: Descriptor 0, 0, 0 ; 空描述符 LABEL_DESC_NORMAL: Descriptor 0, 0ffffh, DA_DRW ; Normal 描述符 LABEL_DESC_CODE32: Descriptor 0, SegCode32Len-1, DA_CDA_32; 非一致代码段,32 LABEL_DESC_CODE16: Descriptor 0, 0ffffh, DA_C ; 非一致代码段,16 LABEL_DESC_CODE_DEST: Descriptor 0, SegCodeDestLen-1, DA_CDA_32; 非一致代码段,32; ring3的代码段描述符的定义 [add] LABEL_DESC_CODE_RING3: Descriptor 0,SegCodeRing3Len-1, DA_CDA_32DA_DPL3 LABEL_DESC_DATA: Descriptor 0, DataLen-1, DA_DRW ; Data LABEL_DESC_STACK: Descriptor 0, TopOfStack, DA_DRWADA_32;Stack, 32 位; ring3的堆栈段描述符的定义 [add] LABEL_DESC_STACK3: Descriptor 0, TopOfStack3, DA_DRWADA_32DA_DPL3 LABEL_DESC_LDT: Descriptor 0, LDTLen-1, DA_LDT ; LDT; ring3的视频段描述符的DPL属性设置为 3 [add] LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRWDA_DPL3; 门 目标选择子,偏移,DCount, 属性 LABEL_CALL_GATE_TEST: Gate SelectorCodeDest, 0, 0, DA_386CGateDA_DPL0 ; GDT 结束GdtLen equ $ - LABEL_GDT ; GDT长度 GdtPtr dw GdtLen - 1 ; GDT界限dd 0 ; GDT基地址; GDT 选择子 SelectorNormal equ LABEL_DESC_NORMAL - LABEL_GDT SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT SelectorCode16 equ LABEL_DESC_CODE16 - LABEL_GDT SelectorCodeDest equ LABEL_DESC_CODE_DEST - LABEL_GDT; ring3的代码段描述符的选择子定义 [add] SelectorCodeRing3 equ LABEL_DESC_CODE_RING3 - LABEL_GDT SA_RPL3SelectorData equ LABEL_DESC_DATA - LABEL_GDT SelectorStack equ LABEL_DESC_STACK - LABEL_GDT; ring3的堆栈段描述符的选择子定义 [add] SelectorStack3 equ LABEL_DESC_STACK3 - LABEL_GDT SA_RPL3SelectorLDT equ LABEL_DESC_LDT - LABEL_GDT;ring3的视频段描述符DPL3的选择子定义 [add] SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDTSelectorCallGateTest equ LABEL_CALL_GATE_TEST - LABEL_GDT ; END of [SECTION .gdt][SECTION .data1] ; 数据段 ALIGN 32 [BITS 32] LABEL_DATA: SPValueInRealMode dw 0 ; 字符串 PMMessage: db In Protect Mode now. ^-^, 0 ; 进入保护模式后显示此字符串 OffsetPMMessage equ PMMessage - $$StrTest: db ABCDEFGHIJKLMNOPQRSTUVWXYZ, 0OffsetStrTest equ StrTest - $$ DataLen equ $ - LABEL_DATA ; END of [SECTION .data1]; 全局堆栈段 [SECTION .gs] ALIGN 32 [BITS 32] LABEL_STACK:times 512 db 0TopOfStack equ $ - LABEL_STACK - 1; END of [SECTION .gs]; 堆栈段ring3的定义 [SECTION .s3] ALIGN 32 [BITS 32] LABEL_STACK3:times 512 db 0 TopOfStack3 equ $ - LABEL_STACK3 - 1 ; END of [SECTION .s3][SECTION .s16] [BITS 16] LABEL_BEGIN:mov ax, csmov ds, axmov es, axmov ss, axmov sp, 0100hmov [LABEL_GO_BACK_TO_REAL3], axmov [SPValueInRealMode], sp; 初始化 16 位代码段描述符mov ax, csmovzx eax, axshl eax, 4add eax, LABEL_SEG_CODE16mov word [LABEL_DESC_CODE16 2], axshr eax, 16mov byte [LABEL_DESC_CODE16 4], almov byte [LABEL_DESC_CODE16 7], ah; 初始化 32 位代码段描述符xor eax, eaxmov ax, csshl eax, 4add eax, LABEL_SEG_CODE32mov word [LABEL_DESC_CODE32 2], axshr eax, 16mov byte [LABEL_DESC_CODE32 4], almov byte [LABEL_DESC_CODE32 7], ah; 初始化测试调用门的代码段描述符xor eax, eaxmov ax, csshl eax, 4add eax, LABEL_SEG_CODE_DESTmov word [LABEL_DESC_CODE_DEST 2], axshr eax, 16mov byte [LABEL_DESC_CODE_DEST 4], almov byte [LABEL_DESC_CODE_DEST 7], ah; 初始化数据段描述符xor eax, eaxmov ax, dsshl eax, 4add eax, LABEL_DATAmov word [LABEL_DESC_DATA 2], axshr eax, 16mov byte [LABEL_DESC_DATA 4], almov byte [LABEL_DESC_DATA 7], ah; 初始化堆栈段描述符xor eax, eaxmov ax, dsshl eax, 4add eax, LABEL_STACKmov word [LABEL_DESC_STACK 2], axshr eax, 16mov byte [LABEL_DESC_STACK 4], almov byte [LABEL_DESC_STACK 7], ah; 初始化堆栈段描述符(Ring3) [add] xor eax, eaxmov ax, dsshl eax, 4add eax, LABEL_STACK3mov word [LABEL_DESC_STACK3 2], axshr eax, 16mov byte [LABEL_DESC_STACK3 4], almov byte [LABEL_DESC_STACK3 7], ah; 初始化 LDT 在 GDT 中的描述符xor eax, eaxmov ax, dsshl eax, 4add eax, LABEL_LDTmov word [LABEL_DESC_LDT 2], axshr eax, 16mov byte [LABEL_DESC_LDT 4], almov byte [LABEL_DESC_LDT 7], ah; 初始化 LDT 中的描述符xor eax, eaxmov ax, dsshl eax, 4add eax, LABEL_CODE_Amov word [LABEL_LDT_DESC_CODEA 2], axshr eax, 16mov byte [LABEL_LDT_DESC_CODEA 4], almov byte [LABEL_LDT_DESC_CODEA 7], ah; 初始化Ring3描述符 [add] xor eax, eaxmov ax, dsshl eax, 4add eax, LABEL_CODE_RING3mov word [LABEL_DESC_CODE_RING3 2], axshr eax, 16mov byte [LABEL_DESC_CODE_RING3 4], almov byte [LABEL_DESC_CODE_RING3 7], ah; 为加载 GDTR 作准备xor eax, eaxmov ax, dsshl eax, 4add eax, LABEL_GDT ; eax - gdt 基地址mov dword [GdtPtr 2], eax ; [GdtPtr 2] - gdt 基地址; 加载 GDTRlgdt [GdtPtr]; 关中断cli; 打开地址线A20in al, 92hor al, 00000010bout 92h, al; 准备切换到保护模式mov eax, cr0or eax, 1mov cr0, eax; 真正进入保护模式jmp dword SelectorCode32:0 ; 执行这一句会把 SelectorCode32 装入 cs, 并跳转到 Code32Selector:0 处;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LABEL_REAL_ENTRY: ; 从保护模式跳回到实模式就到了这里mov ax, csmov ds, axmov es, axmov ss, axmov sp, [SPValueInRealMode]in al, 92h ; ┓and al, 11111101b ; ┣ 关闭 A20 地址线out 92h, al ; ┛sti ; 开中断mov ax, 4c00h ; ┓int 21h ; ┛回到 DOS ; END of [SECTION .s16][SECTION .s32]; 32 位代码段. 由实模式跳入. [BITS 32]LABEL_SEG_CODE32:mov ax, SelectorDatamov ds, ax ; 数据段选择子mov ax, SelectorVideomov gs, ax ; 视频段选择子mov ax, SelectorStackmov ss, ax ; 堆栈段选择子mov esp, TopOfStack; 下面显示一个字符串mov ah, 0Ch ; 0000: 黑底 1100: 红字xor esi, esixor edi, edimov esi, OffsetPMMessage ; 源数据偏移mov edi, (80 * 10 0) * 2 ; 目的数据偏移。屏幕第 10 行, 第 0 列。cld .1:lodsbtest al, aljz .2mov [gs:edi], axadd edi, 2jmp .1 .2: ; 显示完毕call DispReturn; ; 以下代码分步骤演示了如何将A的堆栈拷贝到B的堆栈A调用者B被调用者 ; 1.将ring3的堆栈段描述符的选择子压栈 [add] push SelectorStack3; 2.将ring3的堆栈压栈 [add] push TopOfStack3 ; 3.将ring3的堆栈值 压栈 [add] push SelectorCodeRing3push 0 ; 4.retf 弹出ip 弹出cs此时ip0 csSelectorCodeRing3然后CPU自动解析出SelectorCodeRing3 索引定位的段描述符 该描述符存储有 ; 4.ring3下代码段LABEL_CODE_RING3 的基地址 让我们转向 代码末尾的 LABEL_CODE_RING3 代码段吧 retf; 测试调用门无特权级变换将打印字母 Ccall SelectorCallGateTest:0;call SelectorCodeDest:0; Load LDTmov ax, SelectorLDTlldt axjmp SelectorLDTCodeA:0 ; 跳入局部任务将打印字母 L。; ------------------------------------------------------------------------ DispReturn:push eaxpush ebxmov eax, edimov bl, 160div bland eax, 0FFhinc eaxmov bl, 160mul blmov edi, eaxpop ebxpop eaxret ; DispReturn 结束---------------------------------------------------------SegCode32Len equ $ - LABEL_SEG_CODE32 ; END of [SECTION .s32][SECTION .sdest]; 调用门目标段 [BITS 32]LABEL_SEG_CODE_DEST:mov ax, SelectorVideomov gs, ax ; 视频段选择子(目的)mov edi, (80 * 12 0) * 2 ; 屏幕第 12 行, 第 0 列。mov ah, 0Ch ; 0000: 黑底 1100: 红字mov al, Cmov [gs:edi], axretfSegCodeDestLen equ $ - LABEL_SEG_CODE_DEST ; END of [SECTION .sdest]; 16 位代码段. 由 32 位代码段跳入, 跳出后到实模式 [SECTION .s16code] ALIGN 32 [BITS 16] LABEL_SEG_CODE16:; 跳回实模式:mov ax, SelectorNormalmov ds, axmov es, axmov fs, axmov gs, axmov ss, axmov eax, cr0and al, 11111110bmov cr0, eaxLABEL_GO_BACK_TO_REAL:jmp 0:LABEL_REAL_ENTRY ; 段地址会在程序开始处被设置成正确的值Code16Len equ $ - LABEL_SEG_CODE16; END of [SECTION .s16code]; LDT [SECTION .ldt] ALIGN 32 LABEL_LDT: ; 段基址 段界限 , 属性 LABEL_LDT_DESC_CODEA: Descriptor 0, CodeALen - 1, DA_C DA_32 ; Code, 32 位LDTLen equ $ - LABEL_LDT; LDT 选择子 SelectorLDTCodeA equ LABEL_LDT_DESC_CODEA - LABEL_LDT SA_TIL ; END of [SECTION .ldt]; CodeA (LDT, 32 位代码段) [SECTION .la] ALIGN 32 [BITS 32] LABEL_CODE_A:mov ax, SelectorVideomov gs, ax ; 视频段选择子(目的)mov edi, (80 * 13 0) * 2 ; 屏幕第 13 行, 第 0 列。mov ah, 0Ch ; 0000: 黑底 1100: 红字mov al, Lmov [gs:edi], ax; 准备经由16位代码段跳回实模式jmp SelectorCode16:0 CodeALen equ $ - LABEL_CODE_A ; END of [SECTION .la]; CodeRing3的定义ring3下的代码段 ; 显然 ring3 中的任务执行完后 jmp $ 这句代码使得程序 就会 永久停留在该处 [SECTION .ring3] ALIGN 32 [BITS 32] LABEL_CODE_RING3:mov ax, SelectorVideomov gs, axmov edi, (80 * 14 0) * 2mov ah, 0Chmov al, 3mov [gs:edi], axjmp $ SegCodeRing3Len equ $ - LABEL_CODE_RING3 ; END of [SECTION .ring3]【总结-Conclusion】C1实现ring0 jmp 到ring3 使用的是ret 指令代码如下核心代码 ; 以下代码分步骤演示了如何将A的堆栈拷贝到B的堆栈A调用者B被调用者 ; 1.将ring3的堆栈段描述符的选择子压栈 [add]堆栈段描述符 存储有新堆栈的基地址ss push SelectorStack3; 2.将ring3的堆栈压栈[add]新栈顶指针esp压栈 push TopOfStack3; 3.将ring3的堆栈值 压栈 [add] 将ring3 下的任务代码段基地址cs 压栈 push SelectorCodeRing3 ; (偏移量ip 0 压栈)push 0 ; 4.retf 弹出ip 弹出cs此时ip0 csSelectorCodeRing3然后CPU自动解析出SelectorCodeRing3 索引定位的段描述符 该描述符存储有 ; 4.ring3下代码段LABEL_CODE_RING3 的基地址 retf要知道 retf [ pop cs, pop ip ] ret pop ip C2指令ret 用于执行近返回、同特权级远返回和不同特权级的远返回C2.1近返回仅在当前代码段中转移程序控制权 因此CPU 仅仅进行界限检查C2.2对于同特权级远返回 CPU同时从堆栈中弹出返回代码段的选择子和返回指令指针C2.3会发生特权级改变的远返回仅允许返回到低特权级程序中 即返回到的代码段DPL要大于CPL当执行远返回时 CPU执行以下步骤也即是上述过程的第4步——指令retf1检查保存的cs 中的RPL 以判断返回时是否要变换特权级2加载被调用者堆栈上的cs 和eip 3如果ret 指令含有参数则增加esp 跳过参数然后esp 将指向被保存过的调用者ss 和 esp ret的参数个数对应 调用门中的 Param Count的值4加载ss 和 esp 切换到调用者堆栈被调用者的ss 和 esp 被丢弃5如果ret 指令含有参数 增加esp 的值以跳过参数6检查ds、es、fs、gs的值如果其中哪一个寄存器指向的段的DPL 小于CPL此规则不适用于一致代码段那么一个空描述符会被加载到该寄存器
http://www.zqtcl.cn/news/824829/

相关文章:

  • 企业网站搭建介绍一个电影的网站模板下载
  • wordpress网站插件下载郑州专业网站制作
  • 佛山南海区建网站的公司dw怎么做购物网站
  • 杭州网站关键词排名优化响应式网站好还是自适应网站好
  • 潍坊作风建设网站什么是网站建设技术
  • 网站后台图片不显示东莞市企业招聘信息网
  • 网站发布平台商业网站的网址
  • 免费的培训网站建设门户网站建设管理工作方案
  • 企业网站建设实验感想企业网络推广哪家公司好
  • 网站建设和维护视频如何入侵网站服务器
  • 怎样建设网站空间成都网站设公司
  • 百度文库账号登录入口百度seo规则最新
  • 服务器可以自己的网站吗网络营销策划与创意
  • 广州市招投标网站个人网站可以做论坛
  • 易语言做购物网站春节网站怎么做
  • 建公司网站设计网站公司做网上夫妻去哪个网站
  • 稷山网站建设wordpress单本小说采集
  • 凡客网站规划与建设ppt网站做跳转教程
  • 怎么看网站空间多大做网站旅游销售
  • 天津做手机网站建设旅游网站的目的
  • 飞机查询网站开发的创新点注册公司流程和费用大概多少钱
  • 高质量的邯郸网站建设厦门网页制作厦门小程序app
  • 建设企业网站企业网上银行官网官方二建证从住房建设厅网站调出流程
  • 网站开发和网站建设网页出现网站维护
  • 推广网站的方法电影网站建设教程
  • 哪些网站可以做相册视频成都企业网站公司
  • wordpress网站统计插件常见的管理信息系统有哪些
  • wordpress多个导航菜单seo引流软件
  • 建立网站需要多少钱怎么样企业邮箱在哪看
  • 网站主要功能2008服务器网站