DOS头分析
DOS头分析
PE文件结构综览:
首先上图片:
看到上面的图片可以清晰的看到PE结构复杂结构式什么样子的。有DOS首部,PE头部,PE节表,很多的表块,最后就是一些调试信息。
DOS头由DOS 'MZ' HEADER 和DOS stub组成,DOS "MZ"头中的MZ是PE文件的一个标志之一。后期我们在写PE小工具的时候这个会被我们用于去识别PE文件。
首先我们来理解DOS头。我们知道Windows系统主体是由C去完成的。所有我们可以在windows中去找到用C描述的DOS头结构。
DOS头分析:

第一个就是WinNT.h在我计算机中位置。打开后我们就能看到我们想要的DOS头数据结构了。

1 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
2 +0 WORD e_magic; // Magic number
3 +2 WORD e_cblp; // Bytes on last page of file
4 +4 WORD e_cp; // Pages in file
5 +6 WORD e_crlc; // Relocations
6 +8 WORD e_cparhdr; // Size of header in paragraphs
7 +A WORD e_minalloc; // Minimum extra paragraphs needed
8 +C WORD e_maxalloc; // Maximum extra paragraphs needed
9 +E WORD e_ss; // Initial (relative) SS value
10 +10 WORD e_sp; // Initial SP value
11 +12 WORD e_csum; // Checksum
12 +14 WORD e_ip; // Initial IP value
13 +16 WORD e_cs; // Initial (relative) CS value
14 +18 WORD e_lfarlc; // File address of relocation table
15 +1A WORD e_ovno; // Overlay number
16 +1C WORD e_res[4]; // Reserved words
17 +24 WORD e_oemid; // OEM identifier (for e_oeminfo)
18 +26 WORD e_oeminfo; // OEM information; e_oemid specific
19 +28 WORD e_res2[10]; // Reserved words
20 +3C LONG e_lfanew; // File address of new exe header
21 } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

我们可以看到这样一个结构体这个结构体就是DOS 头结构体,Windows很多数据都是通过这样的结构体去组织的。前面的"+数字"是我添加上去的,WinNT.H头文件中没有的,这个表示偏移地址。在这里我默认情况是你知道什么是偏移地址,Windows的内存基址。否则一些东西你是无法理解的。当然这个数字是16进制表示的。
我们用一个UE打开一个PE文件,也就是exe程序。(当然DLL也是PE文件,遵循PE结构。但是我们这里默认就是EXE程序),我打开我收集的一个内存查看工具:
入下图:

可以看+0H这个位置开始的2个字节(我在这里假设了解windows下的WORD类型是两个字节)。这两个字节也就是e_magic中的内容是MZ。DOS头中我们关注的另一个内容就是最后一个成员也就是+3Ch这个位置,也就是占四个字节的e_lfanew。(大家要知道32位机器中long型和DWORD型是一样的4个字节),DOS头中我们关注这两个内容。e_lfanew这个是为了存储PE头的偏移地址。那为什么要这个呢??DOS头后面不就是PE头了么?也就是+3Ch位置后面不就是PE头了么?其实不是我么这里的DOS头不是广义上的。广义上的DOS头还有一个。DOS stub 这个DOS stub的大小是不固定的,既然这个不固定那么广义上的DOS头的大小也就是不固定。广义DOS头不固定,那我们怎么定位PE头,那就离不开这个四字节的e_lfanew了。e_lfanew中存储了PE头的偏移地址。e_lfanew的位置在+3Ch位置。因为小端存储方式。所以就是上面图中画红线框中的倒过来,那么PE头的开始位置是 "0x00 00 0100",也就是16进制的100处。这样我们很容易的就定位到了PE头。
这里就提前让大家看一下PE头结构吧:
1 typedef struct _IMAGE_NT_HEADERS {
2 +00h DWORD Signature;
3 +04h IMAGE_FILE_HEADER FileHeader;
4 ??? IMAGE_OPTIONAL_HEADER32 OptionalHeader;
5 } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
这个是广义上的PE头结构。这个结构的+00h处其实就是e_lfanew中偏移指向的位置总PE文件开始处的+3Ch处就是这个Signature相对文件开始的偏移(我们称FOA,也就是文件相对偏移地址,这个要和虚拟地址相对偏移RVA区分开,后续我会介绍FOA和RVA的装换方式,这样我们就可以在内存中定位数据了)。Signature中的四个字节内容其实就是"PE00",也就是+3Ch中的内容"0x00 00 0100"所指向的位置中的内容,100h位置中的四个字节中ASIIC就是“PE00”,这个是PE文件的标志符,e_magic,+0地址开始的2个字节中的“MZ”,和Signature 的+3C开始位置的四个字节内容“PE00”共同标志这就是PE文件。我们后期写的PE工具,判断PE就是有这两个位置的数据去区分是不是Windows PE文件。
这一节到此位置。后面将和大家探讨PE head结构。
sql 分组不一定要group by
今天在公司写代码的时候,遇到一个sql语句构建问题。
情形是这样的:
我需要获取不同小组下前N条记录。
select top 10 * from dbo.Topic where GroupID in (60034,60037) and State=0 order by CrtTime desc
很明显,这是错的,不仅没group by,获取出来的还是按两个小组的创建时间的前10条数据。
可是,用group by的话,它有个很不通人性的特性。即是——凡是在group by后面出现的字段,必须同时在select后面出现;凡是在select后面出现的、同时未在聚合函数中出现的字段,必须同时出现在group by后面。
这样就让我不得不放弃使用group by来分组查询。
后来在网上找到,分组,不一定要用group by来实现。用row_number() over()同样可以实现。
语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记录返回一个序号。
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
有了这么一个函数存在,最终我构建了我的sql语句:
select *
from
(
select *,row_number() over (partition by GroupID order by CrtTime desc) rank from Topic where State=0
) T
where T.rank<=10 and T.GroupID in(60034,60040)
实现了这么一个功能:从不同的组别(60034,60040)里获取到了按创建时间降序排序的各个小组里的前10条记录。
参考文章:sql查询-分组
DOS头分析的更多相关文章
- PE文件学习系列二 DOS头分析
合肥程序员群:49313181. 合肥实名程序员群 :128131462 (不愿透露姓名和信息者勿加入)Q Q:408365330 E-Mail:egojit@qq.com PE文件结 ...
- PE 学习之路 —— DOS 头、NT 头
1. 前述 可执行文件的格式是操作系统本身执行机制的反映,理解它有助于对操作系统的深刻理解,掌握可执行文件的数据结构及其一些机理,是研究软件安全的必修课.`PE(Portable Executable ...
- HTTP协议及其请求头分析
HTTP协议及其请求头分析 HTTP协议及其请求头分析 众所周知,Internet的基本协议是TCP/IP协议,目前广泛采用的FTP.Archie Gopher等是建立在TCP/IP协议之上的应用 ...
- DOS头 IMAGE_DOS_HEADER
IMAGE_DOS_HEADER STRUCT { +0h WORD e_magic // Magic DOS signature MZ(4Dh 5Ah) DOS可执行文件标记 +2h WORD e_ ...
- JPEG概述和头分析(C源码)
原创文章,转载请注明:JPEG概述和头分析(C源码) By Lucio.Yang 部分内容来自:w285868925,JPEG压缩标准 1.JPEG概述 JPEG是一个压缩标准,又可分为标准 JPE ...
- 基于byte[]的HTTP协议头分析代码
smark 专注于高并发网络和大型网站架规划设计,提供.NET平台下高吞吐的网络通讯应用技术咨询和支持 基于byte[]的HTTP协议头分析代码 最近需要为组件实现一个HTTP的扩展包,所以简单地实现 ...
- PE文件格式详解,第一讲,DOS头文件格式
PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...
- PE笔记之DOS头
IMAGE_DOS_HEADER STRUCT { +0h WORD e_magic // Magic DOS signature MZ(4Dh 5Ah) DOS可执行文件标记 +2h ...
- DOS头结构
DOS头结构typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header +0h WORD e_magic; ...
随机推荐
- flex builder 4.7 ios 该溶液无法找到设备
行政建议,没有设备 1) 视图itunes 该服务正在启动(Bonjour服务).测试..... .即使没有这样的假设 2)"D:\Program Files\Adobe\Adobe Fla ...
- java_tomcat_Server at localhost was unable to start within 45 seconds 小喵咪死活启动报错-二
错误:Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds 错误提示就是我们限定了部署的时间导致的错 ...
- Redis 上实现的分布式锁
转载Redis 上实现的分布式锁 由于近排很忙,忙各种事情,还有工作上的项目,已经超过一个月没写博客了,确实有点惭愧啊,没能每天或者至少每周坚持写一篇博客.这一个月里面接触到很多新知识,同时也遇到很多 ...
- 【百度地图API】如何制作“从这里出发”“到这里去”——公交篇
原文:[百度地图API]如何制作"从这里出发""到这里去"--公交篇 摘要: 百度地图首页上的“从这里出发”“到这里去”,一直是开发者们很热衷的一个功能.那么, ...
- Linux环境编程相关的文章
Linux环境编程相关的文章 好几年没有接触Linux环境下编程了,好多东西都有点生疏了.趁着现在有空打算把相关的一些技能重拾一下,顺手写一些相关的文章加深印象. 因为不是写书,也受到许多外部因素限制 ...
- javascript如何解析json对javascript如何解析json对象并动态赋值到select列表象并动态赋值到select列表
原文 javascript如何解析json对象并动态赋值到select列表 JSON(JavaScriptObject Notation)一种简单的数据格式,比xml更轻巧.JSON是JavaScri ...
- ASP.NET MVC中加载WebForms用户控件(.ascx)
原文:ASP.NET MVC中加载WebForms用户控件(.ascx) 问题背景 博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControl ...
- ftk学习记录(IME文章)
[声明:版权全部,欢迎转载.请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面说的是全屏设置,还是请大家看一下效果图. watermark/2/text/aHR0cDovL ...
- WebService使用JSON格式传递笔记+JQuery测试
原文WebService使用JSON格式传递笔记+JQuery测试 因为一些因素,必须改写WebService,很传统,但是很多公司还在用.. 因为XML 的关系,不想让他传递数据的时候过度肥大,所以 ...
- windows下 composer常见问题及处理
错误一: Warning: This development build of composer is over 30 days old. It is recommend ed to update i ...