Windows核心编程_静态编译和动态编译的区别
1.静态编译
静态就是将需要的系统dll打包进PE文件(关于PE文件的深刻介绍博主会在后面对其进行介绍)中,编译器会将这些模块码,或资源文件的数据,全部添加到可执行文件中,存放在可执行文件的模块区或资源区,并且做文件地址映射!
这样在运行的时候Windows就会将这些数据映射到内存中(文件与内存偏移映射后面会介绍)
然后需要用到这些dll或者资源时,直接jmp或call或mov去引用这些数据段上的数据即可!
并且引用时的数据大小编译器在编译期间通过文件地址的映射就已经决定了!
比如我们引用一个图像,使用的是静态编译,那么这个数据就会被加载到文件的任何位置并以段来做划分!
然后在引用代码:
image *img = MY_IMAG(资源宏)
编译器会先将资源加载进来,然后替换成
image *img = 0x2b3c4d(映射后的地址)
因为有的时候我们安装了Visual Studio的运行时库,这些库的dll都存放到了系统目录下,但是有的操作系统却没有安装这些运行时库,导致在其它系统上运行总是报缺少dll,而且下载的时候版本不对,函数入口点以及参数可能都不对,也就是向前兼容不好!
所以静态编译是非常好的一个选择!
设置方法:
2.动态编译
动态编译即将需要打包的动态库写入到PE头文件结构里,让Windows的PE加载器自己去解析和加载!
和上面一样映射
映射地址也是在编译期间编译器会确定
比如我们load了一个dll,并引用了其中的一个函数:addtest
那么如下:
load("TEST.dll");
addtest();
在编译期间,编译器会打开dll文件,在里面寻找addtest函数的入口偏移地址,然后加载到内存后产生映射段地址关系,直接可以根据这个偏移量来直接加载即可!
其实整个编译过程很复杂,因为在此过程中可能会加载其它dll,所以编译器在编译期间会生成一个结构表,来保存每个dll模块名,每当我们调用一个loaddll之类的函数,编译器就会先计算这个dll会被加载到哪儿,注意模块是优先包含进来的,也就是在编译我们的代码之前,编译器会先将dll编译到文件里,然后在编译我们的,不然这样调用顺序就有问题了,我们还没加载dll,就调用dll了!
然后将这些计算出来的dll入口地址保存到这个表里
然后我们在调用addtest的时候,编译器会在dll文件里将这个函数的入口地址给找出来,然后调用的时候地址=编译期间结构表里保存的dll地址+入口地址=完整的api地址!
这就是虚拟映射内存的魅力所在,解决了变址的问题!
步骤和上面一样只是用多线程DLL
Windows核心编程_静态编译和动态编译的区别相关推荐
- Windows核心编程_设置Windows开机自动登录
设置自动登录的方法在Windows中已经给出了非常方便的方法,当Windows内核进入登入界面时会检查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ ...
- Windows核心编程_获取鼠标指定位置的RGB颜色值
Windows核心编程_获取鼠标指定位置的RGB颜色值 大家平常会见到很多屏幕取色工具,其原理都是获取鼠标位置的屏幕像素点颜色! 一般思路都是:获取鼠标位置,然后取出鼠标指向的屏幕像素点颜色! Get ...
- Windows核心编程_代码段共享_LocalAlloc/GlobalAlloc区别
数据段共享 数据段共享起源于Windows16位的时代,在Win16操作系统时代下,16位windows用一个全局堆和局部堆来管理内存,每一个应用程序或dll装入内存时,代码段被装入全局堆,而系统又为 ...
- Windows核心编程_提权
在Windows下编程有些涉及到硬件或者跨内存的API会发现失效了,原因是因为权限问题,这也是Windows出于安全的保护,但是事物都有两面性的,Windows又为我们提供了提权的API! 1.Adj ...
- Windows核心编程_修改其它进程里的内存值+示例:修改游戏分数
最近一直忙于Opencv图像处理方面的学习,以及工作,没有更新C/C++专栏方面的博客了,所以今天就给大家写个应用层方面的编程代码,可用于参考学习,本篇博客将运用WindowsSDK库所提供的API来 ...
- Windows核心编程_判断是否管理员权限运行
在Windows安全性越来越强的情况下,不常于XP时代,几乎毫无安全可言,各种对内核文件操控的rin3API不需要权限就可以运行和随意修改,如常见的注册表需改! 但是Win8以后安全性得到了强力的提升 ...
- Windows核心编程_让窗口跟随系统样式变化
当我们使用 VS 编写win32程序时,窗口会有点丑,这个是因为GDI库,Windows有自己的UI库代码,但是版本很多,不同内核版本使用的GUI库不一样,一般vs在编译win32程序时会给你加载一个 ...
- Windows核心编程_关闭Windows
下面介绍几种在Windows编程中关闭Windows的几种方式 首先介绍一个API ExitWindowsEx 这个API是WIndows下为开发人员提供的对操作系统睡眠的几种方式 API介绍: 函数 ...
- Windows核心编程_远线程方式实现Dll注入
之前有介绍过HOOK的方式注入,这次介绍以其它方式注入,而无须HOOK,要知道在Windows这个浩荡的海洋里,API就是宝藏,找到足够多的宝藏那么你就是海贼王~! 实现思路如下: 首先打开一个进程的 ...
最新文章
- datagrid分页问题(前后跳页)《控件版》
- JGG:华中师大蒋兴鹏组-不同稀疏水平信号的微生物组关联检验方法
- mysql语句表_mysql表级sql语句
- GDB / TUI 模式
- 大数据-MapReduce计算框架
- (转)ASP.NET中常见文件类型及用途
- 序列化(串行化)- 使用BinaryFormatter进行序列化
- 《Python网络程序设计(微课版)》223道习题参考答案
- Log4j框架配置文件log4j.properties配置使用详解
- PAT排名汇总(排序)
- JDK安装包和Mysql安装包整理
- 小程序源码:首席省钱赚钱专家微信小程序源码下载,淘宝客 外卖侠 外卖cps -多玩法安装简单
- 加密的PDF文件如何解密?教你使用手机就能解密的方法
- Debian - Add the checking mail notification - mutt
- 【权威发布】360天眼实验室:Xshell被植入后门代码事件分析报告(完整版)
- Servlet的执行原理
- 高防cdn的构建简单吗?高防cdn有什么优势?
- 基于消费者驱动的契约测试
- Windows装机指南
- Exchange-导出邮箱数据到pst文件
热门文章
- Linux网络配置与远程连接
- redis哨兵模式原理_Redis哨兵原理,我忍你很久了
- navision系统和sap区别_上海生产管理EPR系统和SAP系统有什么不同,我们应该选择哪个?...
- Java八大排序详解及源码
- cesium cesium is not defined
- mysql php 时间比较大小_MySql中时间比较的实现
- html5canvas绘制图片源码,HTML5 CANVAS:绘制图片
- centos java jdk 升级_centos jdk 升级到1.7.0_45方法
- mysql半同步模式_MySQL 半同步复制模式的实现
- linux 默认组,系统自动创建的默认安全组和自己创建的安全组的默认规则