jmp

《操作系统真象还原》MBR

邮差的信 提交于 2021-02-12 05:21:53
  以下是读本书第三章的收获。   如何知道一个源程序的各符号(指令和变量)地址?简单来说,地址就是该符号偏移文件开头的距离,符号的地址是按顺序编排的,所以两个相邻的符号,其地址也是相邻的。对于指令来说,指令的地址=上一个指令的地址+上一个指令的大小,最初的符号地址为0,可以根据此公式推算出所有符号的地址。 section称为节,它是提供给程序员编排程序用的,我们可以将一段读取字符串的代码放在section A下,将读取硬盘的代码放进section B下,可以给A,B换成一个更具体的名字,来提高可读性。 例如,下图这段代码,将整个程序分成section code和section data两节,顾名思义,就是存放代码和数据的两个section,这样我们就很清楚地知道每部分代码是做什么用的。另一个值得注意的细节是section并不会对符号的编址用什么影响,去掉section和不去掉其实符号的地址都是一样的。 vstart用于告诉编译器,之后的符号都以某个地址为初始地址来编址。如下图,像$$的地址替换成以0x7c00为初始地址的地址,符号var1和var2的地址被替换成以0x900的地址。 当然,我们还可以通过section.节名称.start来获得在文件中真正的地址。如section.code.start值为0x0,即section code偏移文件的距离为0

《操作系统真象还原》BIOS

拜拜、爱过 提交于 2021-02-12 04:56:49
  以下是读本书第二章的收获。   记得我大学学习操作系统的时候会遇到一些奇奇怪怪的问题,因为觉得问题太奇怪了,所以羞于问老师。诸如 ROM到底是个什么东西 ;如果用 内存映射的方式访问外部设备,是不是内存条里专门有块内存空间来用于访问供外部设备 ,是不是先访问内存条这个地址,然后就直接跳到访问这个设备了等等。幸运的是,这本书都给我一一解答了。   实际上,ROM是下图这样的一种只读存储器(取自百度百科),是一种即使没有通电,也能保存信息的存储器。ROM其实是既可以读也可以写,只不过由于历史原因统称只读存储器。ROM种类不少,我们常用的固态硬盘就是基于闪存(一种ROM)的存储器。   我们下面将要说的BIOS正是存储在ROM设备中的程序,为什么BIOS放在ROM上?个人觉得,BIOS每次通电开机时都要运行,所以是不适合RAM这种断电即丢失信息的存储器了;至于磁盘也不太适合了,我们知道CPU能够直接访问的只有寄存器和内存,不包括磁盘这种外围设备。所以要执行在磁盘中程序的话,首先要将代码加载到内存里,再让CPU从内存取指令出来执行,但因为此时还未执行BIOS程序,换句话说,我们还没有对硬件IO操作的功能,所以将代码从磁盘里加载出来的功能还不能使用。这样的话,磁盘程序放不出BIOS,BIOS也执行不了初始化操作,将BIOS放在硬盘估计就是让BIOS和硬盘俩对着对方干瞪眼,所以硬盘并不适合

自制操作系统Antz(6)——内核初步,引入c语言

早过忘川 提交于 2021-02-11 13:22:07
Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址: https://www.cnblogs.com/LexMoon/category/1267413.html    在前几天的任务中,我们已经简单实现了MBR,直接操作显示器和硬盘操作来加载其他扇区的程序,如今已经可以进入保护模式了,之前一直使用的是汇编语言,接下来要使用c语言实现内核了。 0. GCC前提   gcc -c -o main.o main.c   -c的作用是编译,汇编到目标代码,不进行链接,也就是直接生成目标文件。   -o的作用是将输出的文件以指定文件名来存储,有同名文件会直接覆盖。   如果你不会使用GCC,请先去略作了解。   这行命令会生成一个main.o文件。它只是一个目标文件,也是待重定位文件,重定位是指文件里面所用的符号还没有安排地址,这些符号的地址要与其他目标文件组成一个可执行文件时再重新定位(排地址),符号是指该目标文件中所调用的函数或使用的变量,这里的组成就是指链接。   main.o是可重定位文件,ld命令可以链接,指定最终生成文件的起始虚拟地址。   ld main.o -Ttext 0xc0001500 -e main -o main.bin   

自制操作系统Antz(7)——实现内核 (上)

不羁的心 提交于 2021-02-11 13:12:37
Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址: https://www.cnblogs.com/LexMoon/category/1267413.html    在前几天的任务中,我们已经简单实现了MBR,直接操作显示器和硬盘操作来加载其他扇区的程序,如今已经可以进入保护模式了,简单引入了C语言,接下来我们编写自己的内核。 0. 汇编生成 ELF   完成实模式到保护模式跳转的这一任务是由loader进行的,而我们不应该用loader做太多的事,loader只需要完成跳转就好了,剩下的工作交给内核。   为了加载内核到内存,需要使用ELF格式,如何编译这种格式呢?   来看看下面这个例子。 [section .data] strHello db " Hello, Antz ! " , 0Ah STRLEN equ $ - strHello [section .text] global _start _start: mov edx, STRLEN mov ecx, strHello mov ebx, 1 mov eax, 4 int 0x80 mov ebx, 0 mov eax, 1 int 0x80   global _start定义了程序的入口地址,相当于c/c+

oslab oranges 一个操作系统的实现 实验二 认识保护模式

南楼画角 提交于 2021-02-09 10:01:44
https://github.com/yyu/osfs00 实验目的: 理解 x86架构下的段式内存管理 掌握实模式和保护模式下段式寻址的组织方式、 关键数据结构、代码组织方式 掌握实模式与保护模式的切换 掌握特权级的概念,以及不同特权之间的转移 实验内容: 1. 认真阅读章节资料,掌握什么是保护模式,弄清关键数据结构: GDT、descriptor、selector、GDTR, 及其之间关系,阅读 pm.inc文件中数据结构以及含义,写出对宏Descriptor的分析 2. 调试代码,/a/ 掌握从实模式到保护模式的基本方法,画出代码 流程图,如果代码 /a/中,第71行有dword前缀和没有前缀,编 译出来的代码有区别么,为什么,请调试截图。 3. 调试代码,/b/,掌握GDT的构造与切换,从保护模式切换回实 模式方法 4. 调试代码,/c/,掌握LDT切换 5. 调试代码,/d/掌握一致代码段、非一致代码段、数据段的权限 访问规则,掌握 CPL、DPL、RPL之间关系,以及段间切换的基 本方法 6. 调试代码,/e/掌握利用调用门进行特权级变换的转移 代码对应 iso中chapter3 实验解决问题与课后动手改: 1. GDT、Descriptor、Selector、GDTR结构,及其含义是什么?他 们的关联关系如何? pm.inc所定义的宏怎么使用? 2.

台湾大学《临床试验》公开课,单元10:统计分析(四)

佐手、 提交于 2021-01-31 11:18:21
台灣大學《臨床試驗》公開課 视频较长,请在WIFI下或PC上观看 获取课程教辅资料,请回复“ 临床试验 ”。 流行病學與預防醫學研究所 簡國龍、劉仁沛 以臨床試驗研究設計及實際進行時處理的問題作一通盤性的介紹,使學生能對臨床試驗的方法及運用有一整體的認識。介紹臨床試驗的研究方法,以系統性說明臨床試驗過程需注意的內容,使學習者能熟練臨床試驗的步驟,並且 ... 本課程共 13 講,包含: 單元 1 .課程簡介 單元 2 .研究設計 ( 一 ) 單元 3 .研究設計 ( 二 ) 單元 4 .統計分析 ( 一 ) 指標種類與選擇 單元 5 .統計分析 ( 二 ) 單元 6 .藥品優良臨床試驗規範 / 評估臨床試驗品質 單元 7 .統計分析 ( 三 ) 單元 8 .不良反應與不良事件 單元 9 .臨床試驗執行 ( 一 ) 單元 10 .統計分析 ( 四 ) 單元 11 .統計分析 ( 五 ) 單元 12 .臨床試驗執行 ( 二 ) 單元 13 .臨床試驗執行 ( 三 ) 【一起学统计工具小tips】本公众号有海量的统计学习素材,输入统计专业术语或问题短语(如方差分析、标准差、ROC曲线、偏倚等),可智能检索各种统计文章。如果检索结果不满意,可变换检索的方式,如加长或缩短检索短语的长度等。重要干货和文章,请访问订阅号底部菜单。获取各种学习资料下载,请回复如下关键词:method|open

执行方式免杀之内联汇编(FUD101连载三)

风格不统一 提交于 2021-01-23 05:21:30
声明 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。 雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。 前言 针对本篇及后续文章中用到的部分技术,我已经写好了相关代码,用于快速生成免杀的可执行程序,源代码放在了(github)[https://github.com/1y0n/AV_Evasion_Tool]上,也可以直接下载编译好的(程序)[https://github.com/1y0n/AV_Evasion_Tool/releases] 工具界面如下: 效果如下: 学习免杀,汇编是一个永远绕不开的话题。这一章节,我们将学习汇编一些常见的指令,通过这些指令执行我们的 shellcode 可以取得很好的免杀效果。当然,我们学习的仅是汇编中比较基础的部分,更多的内容需要自己不断地学习研究。 No.1 基础知识 寄存器 通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。32位通用寄存器有 8 个: 常见操作码 花指令 花指令指一些没有实际意义的指令,执行或不执行它们对最后的结果不会带来影响,但可以增加反汇编分析的难度,甚至会干扰反汇编程序的正常工作

171.控制转移指令

拟墨画扇 提交于 2021-01-13 00:39:35
1.控制转移指令  无条件转移指令 JMP  条件转移指令 JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、 JP / JNP、 JB / JNB、 JL / JNL、 JBE / JNBE、 JLE / JNLE、 JCXZ  循环指令 LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE  子程序调用和返回指令 CALL、RET  中断与中断返回指令 INT、INTO、IRET 2.无条件转移指令 段内直接短转移:JMP SHORT OPR   执行操作:(IP) ← (IP) + 8位位移量 段内直接近转移:JMP NEAR PTR OPR   执行操作:(IP) ← (IP) + 16位位移量 段内间接转移: JMP WORD PTR OPR   执行操作: (IP) ← (EA) 段间直接远转移:JMP FAR PTR OPR   执行操作:(IP) ← OPR 的段内偏移地址        (CS) ← OPR 所在段的段地址 段间间接转移: JMP DWORD PTR OPR   执行操作: (IP) ← (EA)         (CS) ← (EA+2) 3.条件转移指令 注意:只能使用段内直接寻址的8 位位移量 3.1根据单个条件标志的设置情况转移 格式 测试条件 JZ(JE) OPR ZF=1 jump

转移指令

六眼飞鱼酱① 提交于 2021-01-13 00:33:55
可以修改IP,或可以同时修改CS和IP的指令称为转移指令。转移指令就是可以控制CPU执行内存中某处代码的指令。 只修改IP时,称为段内转移,如:jmp ax 同时修改CS和IP时,称为段间转移,如:jmp 1000:0 由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移。 短转移IP的修改范围为-128--127 近转移IP的修改范围为-32768--32767 8086CPU的转移指令分为以下几类: 无条件转移指令:jmp 条件转移指令 循环指令。loop 过程 中断 操作符:offset 功能:取得标号的偏移地址。 assume cs:codesg codesg segment start: mov ax,offset start ;相当于mov ax,0 s: mov ax,offset s ;相当于mov ax,3 codesg ends end start jmp指令: jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP。 jmp要同时给出两种信息: 转移的目的地址 转移的距离(段间转移,段内转移,段内近转移) jmp short标号(转到标号处执行) assume cs:codeseg codeseg segment start: mov ax,0 jmp short s ;转到标号s处执行 add ax,1 s: inc ax