欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

进入保护模式(四)设置一些公用的方法

程序员文章站 2024-03-17 15:56:34
...

一、下雨

        最近一直在下雨,对于这样的天气真是厌烦,但也没办法,是不?夏天到是期盼,可以降温,这个季节太冷。

        这算是第三次拿起这本书,希望在年前能够看完。

        最近除去工作也算很忙,上下班路上看看文学小说,还有就是这个第三次打算看完的书。因为地点是在有点远,玩个游戏手机电池经不住,所以就这样了;看这本书是因为这次算是有督促,所以这次不想中途放弃。

二、言归正传

        第三次看的技术书是《x86实模式到保护模式》,希望这次能够看完。当然是抄书了,不知道什么时候养的习惯

        书中介绍的如何调用系统API的一个实现。

        在保护模式中想要访问代码,就要知道 选择子+偏移量 这个就是目的地的地址,不然怎么坐车都不知道

       下面是一个程序的头部,在头部偏移0x28的地方有个表,记录的是当前程序要用到的系统提供的函数 

                                                                         函数名的长度是256个字节       

;===============================================================================
SECTION header vstart=0

         program_length   dd program_end          ;程序总长度#0x00
         
         head_len         dd header_end           ;程序头部的长度#0x04

         stack_seg        dd 0                    ;用于接收堆栈段选择子#0x08
         stack_len        dd 1                    ;程序建议的堆栈大小#0x0c
                                                  ;以4KB为单位
                                                  
         prgentry         dd start                ;程序入口#0x10 
         code_seg         dd section.code.start   ;代码段位置#0x14
         code_len         dd code_end             ;代码段长度#0x18

         data_seg         dd section.data.start   ;数据段位置#0x1c
         data_len         dd data_end             ;数据段长度#0x20
             
;-------------------------------------------------------------------------------
         ;符号地址检索表
         salt_items       dd (header_end-salt)/256 ;#0x24
         
         salt:                                     ;#0x28
         PrintString      db  '@PrintString'
                     times 256-($-PrintString) db 0
                     
         TerminateProgram db  '@TerminateProgram'
                     times 256-($-TerminateProgram) db 0
                     
         ReadDiskData     db  '@ReadDiskData'
                     times 256-($-ReadDiskData) db 0
                 
header_end:

在系统中也有个表记录的是 系统提供的函数名、偏移量、选择子

                                当加载程序的时候就在这个表中匹配字符串

                                把加载的程序名用偏移量+选择子替换掉了,那么程序就可以飞了

                                参数传递要么寄存器、要么共有的堆栈了

;符号地址检索表
         salt:
         salt_1           db  '@PrintString'
                     times 256-($-salt_1) db 0
                          dd  put_string
                          dw  sys_routine_seg_sel

         salt_2           db  '@ReadDiskData'
                     times 256-($-salt_2) db 0
                          dd  read_hard_disk_0
                          dw  sys_routine_seg_sel

         salt_3           db  '@PrintDwordAsHexString'
                     times 256-($-salt_3) db 0
                          dd  put_hex_dword
                          dw  sys_routine_seg_sel

         salt_4           db  '@TerminateProgram'
                     times 256-($-salt_4) db 0
                          dd  return_point
                          dw  core_code_seg_sel

         salt_item_len   equ $-salt_4
         salt_items      equ ($-salt)/salt_item_len

 

    

       

转载于:https://my.oschina.net/findurl/blog/185412