【OS】04 - 主引导程序的拓展(上) ,理论详情 实验: 把文件写入虚拟软盘 0x01 创建虚拟软盘 1.1 创建虚拟软盘和文件,文件写入虚拟软盘 需要的工具: bochsrc freedos.img bochsrc ############################################################### # Configuration file for Bochs ############################################################### # how much memory the emulated machine will have megs: 32 # filename of ROM images romimage: file=/usr/local/share/bochs/BIOS-bochs-latest vgaromimage: file=/usr/share/vgabios/vgabios.bin # what disk images will be used floppya: 1_44=freedos.img, status=inserted # choose the boot disk. boot: a # where do we send log messages? # log: bochsout.txt # disable the mouse mouse: enabled=0 # enable key mapping, using US layout as default. keyboard_mapping: enabled=1, map=/usr/local/share/bochs…
深入浅出的处理器(上) 深入浅出的处理器(中) 深入浅出的处理器(下) 深入浅出的处理器(续) tip: 点击链接的时候按下键盘的 CTRL 就会另外新打开一个页面
嵌入式C语言编译器,文章的理论部分 注意: 下文验证的内容,使用的是这里的func.h、test.c func.h #include <stdio.h> void func() { #ifdef TEST printf("TEST = %s\n", TEST); #endif return; } test.c #include <stdio.h> #include "func.h" int g_global = 0; int g_test = 1; int main(int argc, char *argv[]) { func(); printf("&g_global = %p\n", &g_global); printf("&g_test = %p\n", &g_test); printf("&func = %p\n", &func); printf("&main = %p\n", &main); return 0; } 0x01 预处理指令: gcc -E test.c -o test.i test.i # 1 "test.c" // 1 :表示后文部分是test.c的第一行展开内容 # 1 "<built-in>" # 1 "<command-line>" # 1 "test.c" # 1 "/usr/include/stdio.h" 1 3 4 // .....…
#include <iostream> using namespace std; // 函数模版 template <typename T> void Swap(T& a, T& b) { T t = a; a = b; b = t; } // 类模版 template <typename T> class Op { public: T process(T v) { return v * v; } }; int main() { int a = 2; int b = 1; Swap(a, b); cout << "a = " << a << " " << "b = " << b << endl; double c = 0.01; double d = 0.02; Swap<double>(d, c); cout << "c = " << c << " " << "d = " << d << endl; Op<int> opInt; // 需要指明类型 Op<double> opDouble; cout << "5 * 5 = " << opInt.process(5) << endl; cout << "0.3 * 0.3 = " << opDoubl…
文章还是比较清楚的,mark一下 知乎:网络地址转换协议NAT功能详解及NAT基础知识介绍
segFault
如果不打工你最想做什么?
win10专业版/企业版-密钥和激活脚本
'Enter' 快乐没了
如果不打工你最想做什么? 注:文章最下方可评论
方法1 Win10正式专业版密钥(32位和64位均可正常使用): W269N-WFGWX-YVC9B-4J6C9-T83GX Win10正式企业版密钥(32位和64位均可正常使用): NPPR9-FWDCX-D2C8J-H872K-2YT43 方法2 win10专业版激活脚本 @echo off echo The system is being activated...... slmgr.vbs /upk slmgr /ipk NPPR9-FWDCX-D2C8J-H872K-2YT43 slmgr /skms zh.us.to slmgr /ato echo System is activated. echo. & pause 方法3 2024/07/31 更新 又找到一个方法,亲测有用,非常优雅使用win10 windows10专业版激活的教程如下: 1.使用Windows PowerShell(管理员的权限运行) 依次输入: slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX slmgr /skms kms.03k.org slmgr /ato 也可以写成一个脚本跑一跑
语雀崩了…
PE格式分析_6(IMAGE_SECTION_HEADER)
PE格式分析_5(IMAGE_OPTIONAL_HEADER)
语雀崩了,一天了,数据都放到一起是不明智的选择...
节表( IMAGE_SECTION_HEADER ) 作用:描述PE文件与内存之间的映射关系,说明PE文件的指定内容拷贝至内存的哪个位置、拷贝大小及内存属性的设置。 一个结构体总大小: 0x 28 (40) 字节 节表位置: 置于选项头之后,位置 = 选项头( IMAGE_OPTIONAL_HEADER) 的地址 + 选项头( IMAGE_OPTIONAL_HEADER)的大小。 // IMAGE_SECTION_HEADER 节表结构体,大小40B typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 节表名称:描述性字段 2个字节, 这个段写了区段名字(.text .rdata ....),但是系统不承认这个名字,名字随便改 // 重要的是内存属性 不是名字, 调试器查看内存有区段显示,是从这里获取的 // 下方4个字段:从文件S1处开始,拷贝S2大小的数据,到内存S3处,有效数据占用内存S4大小 union { DWORD PhysicalAddress; DWORD VirtualSize; // S4:在内存中的大小 } Misc; DWORD VirtualAddress; // S3:内存地址:基于模块基址,与SectionAlignment对齐(0x1000) DWORD SizeOfRawData; // S2:文件大小(从文件中取SizeOfRawData字节到VirtualAddress地址),与FileAlignment对齐(0x200) DWORD PointerToRawData; // S1:文件偏移,与FileAlignment对齐(0x200) //跟调试相关 …
IMAGE_OPTIONAL_HEADER typedef struct _IMAGE_OPTIONAL_HEADER { WORD Magic; // 判断32位0x10b,64位0x20b BYTE MajorLinkerVersion; // 主链接器版本号,仅供参考 BYTE MinorLinkerVersion; // 副链接器版本号,仅供参考 //系统分配内存不看着3个值,对于调试器有影响 DWORD SizeOfCode; // 代码所占空间大小,仅供参考,OD反汇编代码,通过这个字段获得内存 // SizeOfCode可以尝试出极限值,让OD调试可以使用,但是会卡很久 // OS是从节表里算的代码段的大小 DWORD SizeOfInitializedData; // 已初始化数据所占空间大小,仅供参考,微软没使用 DWORD SizeOfUninitializedData;// 未初始化数据所占空间大小,仅供参考,微软没使用 DWORD AddressOfEntryPoint; // ***** oep:原本的程序入口 //这个值可以修改,但是修改过后必须跳转到在该偏移处跳转到真正入口 DWORD BaseOfCode; // 代码基址 (无用) DWORD BaseOfData; // 数据基址 (无用) DWORD ImageBase; // ****** 建议模块地址:exe映射加载到内存中的首地址 = PE 0处,即实例句柄hInstance // 一般而言,exe文件可遵从装载地址建议,但dll文件无法满足 (开了随机基址可能也不是这个值,是通过重定位表得到) //这个值最好不要改,改的话要改动大量地方,因为函数和全局变量的地址也需要跟着改变 DWORD Sectio…