2019独角兽企业重金招聘Python工程师标准>>>
一、下雨
最近一直在下雨,对于这样的天气真是厌烦,但也没办法,是不?夏天到是期盼,可以降温,这个季节太冷。
这算是第三次拿起这本书,希望在年前能够看完。
最近除去工作也算很忙,上下班路上看看文学小说,还有就是这个第三次打算看完的书。因为地点是在有点远,玩个游戏手机电池经不住,所以就这样了;看这本书是因为这次算是有督促,所以这次不想中途放弃。
二、言归正传
第三次看的技术书是《x86实模式到保护模式》,希望这次能够看完。当然是抄书了,不知道什么时候养的习惯
书中介绍的如何调用系统API的一个实现。
在保护模式中想要访问代码,就要知道 选择子+偏移量 这个就是目的地的地址,不然怎么坐车都不知道
下面是一个程序的头部,在头部偏移0x28的地方有个表,记录的是当前程序要用到的系统提供的函数
函数名的长度是256个字节
;===============================================================================
SECTION header vstart=0program_length dd program_end ;程序总长度#0x00head_len dd header_end ;程序头部的长度#0x04stack_seg dd 0 ;用于接收堆栈段选择子#0x08stack_len dd 1 ;程序建议的堆栈大小#0x0c;以4KB为单位prgentry dd start ;程序入口#0x10 code_seg dd section.code.start ;代码段位置#0x14code_len dd code_end ;代码段长度#0x18data_seg dd section.data.start ;数据段位置#0x1cdata_len dd data_end ;数据段长度#0x20;-------------------------------------------------------------------------------;符号地址检索表salt_items dd (header_end-salt)/256 ;#0x24salt: ;#0x28PrintString db '@PrintString'times 256-($-PrintString) db 0TerminateProgram db '@TerminateProgram'times 256-($-TerminateProgram) db 0ReadDiskData db '@ReadDiskData'times 256-($-ReadDiskData) db 0header_end:
在系统中也有个表记录的是 系统提供的函数名、偏移量、选择子
当加载程序的时候就在这个表中匹配字符串
把加载的程序名用偏移量+选择子替换掉了,那么程序就可以飞了
参数传递要么寄存器、要么共有的堆栈了
;符号地址检索表salt:salt_1 db '@PrintString'times 256-($-salt_1) db 0dd put_stringdw sys_routine_seg_selsalt_2 db '@ReadDiskData'times 256-($-salt_2) db 0dd read_hard_disk_0dw sys_routine_seg_selsalt_3 db '@PrintDwordAsHexString'times 256-($-salt_3) db 0dd put_hex_dworddw sys_routine_seg_selsalt_4 db '@TerminateProgram'times 256-($-salt_4) db 0dd return_pointdw core_code_seg_selsalt_item_len equ $-salt_4salt_items equ ($-salt)/salt_item_len