第五站 使用winHex利器加深理解数据页

这篇我来介绍一个winhex利器,这个工具网上有介绍,用途大着呢,可以用来玩数据修复,恢复删除文件等等。。。。它能够将一个file解析成hex形式,这样你就可以对hex进行修改,然后你就可以看到修复后的结果,为什么要在sqlserver系列中说这个呢???很简单呀,sqlserver的DB本质上也是一个mdf文件,对吧,既然是文件,我就可以利用winhex对它进行随意的修改,然后你也知道sqlserver的数据都是以数据页的形式封装的,那我就可以修改它的数据页,对不对,这样我就可以随便改变记录的顺序,包括槽位,记录,页头等等。。。说干就干吧!!!

一:准备数据

我计划在数据库中插入三条测试数据,如图:


DROP TABLE dbo.PersonCREATE TABLE Person(ID INT IDENTITY,NAME VARCHAR(5),Age INT)INSERT dbo.Person VALUES('amy',20)
INSERT dbo.Person VALUES('anna',25)
INSERT dbo.Person VALUES('smart',28)SELECT * FROM dbo.Person

接下来通过DBCC命令,查看下三条记录的数据页情况,如下图:


DBCC TRACEON(3604)
DBCC IND(Ctrip,Person,-1)
DBCC PAGE(Ctrip,1,78,2)DATA:Memory Dump @0x00000000100EA00000000000100EA000:   01010400 00800001 00000000 00000c00 †................
00000000100EA010:   00000000 00000300 3f000000 551fa500 †........?...U...
00000000100EA020:   4e000000 01000000 8e000000 66000000 †N...........f...
00000000100EA030:   03000000 00000000 00000000 00000000 †................
00000000100EA040:   01000000 00000000 00000000 00000000 †................
00000000100EA050:   00000000 00000000 00000000 00000000 †................
00000000100EA060:   30000c00 01000000 14000000 03000001 †0...............
00000000100EA070:   00160061 6d793000 0c000200 00001900 †...amy0.........
00000000100EA080:   00000300 00010017 00616e6e 6130000c †.........anna0..
00000000100EA090:   00030000 001c0000 00030000 01001800 †................
00000000100EA0A0:   736d6172 74000000 00000000 00000000 †smart...........
00000000100EA0B0:   00000000 00000000 00000000 00000000 †....................00000000100EBFC0:   20202020 20202020 20202020 20202020 †
00000000100EBFD0:   20202020 20200000 00000000 00000000 †      ..........
00000000100EBFE0:   00000000 00000000 00000000 00000000 †................
00000000100EBFF0:   00000000 00000000 1f0b8d00 76006000 †............v.`.OFFSET TABLE:Row - Offset
2 (0x2) - 141 (0x8d)
1 (0x1) - 118 (0x76)
0 (0x0) - 96 (0x60)

我想大家现在都清楚了,数据页中的一条条存储记录都是通过页尾的槽位指向的,具体可以参见前几篇对数据页的介绍,比如你看到页尾的:8d0076006000了吗?要注意,这些都是按照字节逆序来的。

  1. 6000 这个就是slot0,也就是 (0x0) - 96 (0x60)

  1. 0x76 这个就是slot1,也就是(0x1) - 118 (0x76)

  1. 0x8d 这个就是slot2,也就是(0x2) - 141 (0x8d)

是不是有点意思,如果你一定要看到slot具体指向的内容,你可以继续用DBCC命令,一清二楚。

DBCC PAGE(Ctrip,1,78,1)PAGE: (1:78)BUFFER:BUF @0x0000000083FD8E00bpage = 0x0000000083ADC000           bhash = 0x0000000000000000           bpageno = (1:78)
bdbid = 8                            breferences = 0                      bUse1 = 2495
bstat = 0x1c0000b                    blog = 0xbbbbbbbb                    bnext = 0x0000000000000000PAGE HEADER:Page @0x0000000083ADC000m_pageId = (1:78)                    m_headerVersion = 1                  m_type = 1
m_typeFlagBits = 0x4                 m_level = 0                          m_flagBits = 0x8000
m_objId (AllocUnitId.idObj) = 63     m_indexId (AllocUnitId.idInd) = 256
Metadata: AllocUnitId = 72057594042056704
Metadata: PartitionId = 72057594041204736                                 Metadata: IndexId = 0
Metadata: ObjectId = 341576255       m_prevPage = (0:0)                   m_nextPage = (0:0)
pminlen = 12                         m_slotCnt = 3                        m_freeCnt = 8021
m_freeData = 165                     m_reservedCnt = 0                    m_lsn = (142:102:3)
m_xactReserved = 0                   m_xdesId = (0:0)                     m_ghostRecCnt = 0
m_tornBits = 0Allocation StatusGAM (1:2) = ALLOCATED                SGAM (1:3) = ALLOCATED
PFS (1:1) = 0x61 MIXED_EXT ALLOCATED  50_PCT_FULL                         DIFF (1:6) = CHANGED
ML (1:7) = NOT MIN_LOGGEDDATA:Slot 0, Offset 0x60, Length 22, DumpStyle BYTERecord Type = PRIMARY_RECORD         Record Attributes =  NULL_BITMAP VARIABLE_COLUMNS
Record Size = 22
Memory Dump @0x000000000F7FC0600000000000000000:   30000c00 01000000 14000000 03000001 †0...............
0000000000000010:   00160061 6d79††††††††††††††††††††††††...amySlot 1, Offset 0x76, Length 23, DumpStyle BYTERecord Type = PRIMARY_RECORD         Record Attributes =  NULL_BITMAP VARIABLE_COLUMNS
Record Size = 23
Memory Dump @0x000000000F7FC0760000000000000000:   30000c00 02000000 19000000 03000001 †0...............
0000000000000010:   00170061 6e6e61††††††††††††††††††††††...annaSlot 2, Offset 0x8d, Length 24, DumpStyle BYTERecord Type = PRIMARY_RECORD         Record Attributes =  NULL_BITMAP VARIABLE_COLUMNS
Record Size = 24
Memory Dump @0x000000000F7FC08D0000000000000000:   30000c00 03000000 1c000000 03000001 †0...............
0000000000000010:   00180073 6d617274 †††††††††††††††††††...smartOFFSET TABLE:Row - Offset
2 (0x2) - 141 (0x8d)
1 (0x1) - 118 (0x76)
0 (0x0) - 96 (0x60)DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

仔细观察下上面的红色字体,有没有总结出各个slot槽位对应的记录内容,比如:

  • slot0槽位指向的记录内容:amy => 616d79。

  • slot1槽位指向的记录内容:anna => 616e6e61。

  • slot2槽位指向的记录内容:smart => 736d617274。

这里你要知道,winhex中都是16进制表示的,所以2个16进制对应一个字节。

二:使用WinHex修改数据

我们大家都知道,sqlserver引擎会通过扫描slot槽位来呈现数据,就像上面的记录那样,依次扫描slot0...slot1....slot2...,如下图:

上面这个截图没什么稀奇的地方,大家也觉得见怪不怪了,那下面就有一个想法来了,如果我通过winHex来交换slot0和slot1的顺序,那效果会是怎样???按照常理说,这时候引擎还是按照slot槽位依次扫描,这时候应该会将ID=2的记录先喷出来,然后再喷出ID=1,ID=3。。。事实是不是这样子呢?好奇吧,我们来看看。。。

三:相关步骤

  1. 我们知道Ctrip数据库是联机的,要修改它必须先脱机,然后再关掉数据页的一致性校验(这个也是数据库的保护机制,防止第三方恶意的去篡改数据),这个应该大家都明白,如下图:

  1. 从网上下载一个破解版的winhex,然后打开本地的Ctrip.mdf文件,调整winhex的编辑模式为默认的可读写,如图:

  1. 我们知道一个数据页的大小是8KB=8192B,那么第78号数据页的起始位置的偏移量应该就是:78*8192=638976,然后通过快捷键Alt+G打开偏移量列表,键入638976,如下图:

找到记录的内容之后,我们再来找槽位,槽位的开始位置在78号数据页的末尾,那怎么算呢?这个算法也很简单,offset=79*8192-1=647167。说干就干。

当你真的找到了偏移量,是不是很兴奋呢?下面要做的就是把60和76交换一下,也就是将slot0和slot1交换,看看怎么样????

  1. 交换完毕后,ctrl+s保存,然后让Ctrip数据库联机,并使用Sql语句查看下现在的效果???

当你看到这张图的时候,是不是已经疯了。。。。这样我就非常肯定的论证了,引擎真的就是通过依次扫描slot的槽位来指向记录的,如果你大概理解了上面的操作,现在你可以修改任意数据页的数据了,只要你找得到数据页的偏移量,然后任由你发挥啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

法国 计算机金融 大学,捷报|GPA3.0,计算机转申金融,斩获法国顶级商学院录取!...

原标题:捷报|GPA3.0,计算机转申金融,斩获法国顶级商学院录取!NutsCongratulationsNuts北大学员,GPA3.0计算机转申金融,斩获✨ 全法排名第二ESSEC金融录取✨OfferESSEC法国著名学府埃塞克高等商学院(cole suprieure des…

是小厂全栈好,还是大厂专业工程师好?

作者:邹溪源,长沙资深互联网从业者,架构师社区特邀嘉宾!一在博客园中使用小公司大公司进行搜索,列入的搜索记录长达50页。虽然完全命中关键词的文章也许并不多,但这或许也能体现出这个话题的热门程度。今天…

计算机英特尔显卡在哪找,Win10英特尔显卡设置图标不见了该怎么办 - 系统之家...

电脑中使用英特尔显卡的时候,就会在系统任务栏托盘中显示图标,方便用户进行操作,但是有win10用户反映说自己的任务栏托盘中没有显示英特尔核芯显卡的托盘图标,这是什么情况?下面小编就来给大家分析分析。一、查看是否安…

.NET Core + Kubernetes:Service

通过 .NET Core Kubernetes:Deployment 文章的介绍,我们可以通过 Deployment 控制器快速创建一组 Pod 来提供服务,每个 Pod 都会被分配一个集群内可见的虚拟 IP 地址,然后通过一个独立的 Endpoint(Pod IP ContainerP…

bim建筑绘图计算机要求,BIM考试报名条件:想要成为一级BIM建模师需要达到哪些要求?...

【摘要】如今,BIM成为建筑领域无处不在的一个热词,学习BIM技术也是当前的热潮。那么你知道一级BIM建模师考试的考评要点吗?获得BIM技能等级认证,成为行业急需的BIM技术人才需要达到哪些要求呢?一级BIM建模师一、文化要求报考一级BIM建模师基…

EventBus/EventQueue 再思考

EventBus/EventQueue 再思考Intro之前写过两篇文章,造轮子系列的 EventBus/ EventQueue,回想起来觉得当前的想法有点问题,当时对 EvenStore 可能有点误解,有兴趣可以参考 动手造轮子:实现一个简单的 EventBus动手造轮子…

网络原理题+复习资料

1.试说明运输层在协议栈中的地位和作用,运输层的通信和网络层的通信有什么重要区别?为什么运输层是必不可少的? 答:运输层处于面向通信部分的最高层,同时也是用户功能中的最低层,向它上面的应用层提供服务…

德清租房软件测试,门头沟实习生出租房

10 图2室 65㎡苏州街海淀南路小区距4号线大兴线海淀黄庄地铁站步行438m来自经纪人: 陈伟建1天前8300元8 图1室 35㎡北太平庄花园路8号院距10号线牡丹园地铁站步行1122m来自经纪人: 陈泽科1天前4800元10 图1室 45㎡西北旺芳怡园距16号线西北旺地铁站步行1128m来自经…

[推荐]大量 Blazor 学习资源(一)

预警前言 / Introduction Blazor 是什么?Blazor 允许您使用 C# 而不是 JavaScript 构建交互式 Web UI。Blazor 应用由使用 C#、HTML 和 CSS 实现的可重用 Web UI 组件组成。客户端和服务器代码都用 C# 编写,允许您共享代码和库。???? 本文主要来给大…

网络原理往期考试题+部分详解+最终版

一.填空题: (号代表出现次数,无则说明一次) 1. 在采用电信号表达数据的系统中,数据有数字数据和__模拟数据__两种。 2. 国际标准化组织ISO提出的不基于特定机型、操作系统或公司的网络体系结…

计算机博士两篇一区两篇会议,本科博士联手!西电陈渤团队两篇论文被顶级会议录用...

第34届神经信息处理系统大会(Neural Information Processing Systems, NeurIPS,https://neurips.cc/)将于12月06日—12月12日,通过线上举行。该会议是跨学科的,主要包括人工智能和自然神经信息处理,代表着热门科研领域的最前沿&am…

从零开始实现 ASP.NET Core MVC 的插件式开发(七) - 问题汇总及部分问题解决方案...

标题:从零开始实现 ASP.NET Core MVC 的插件式开发(七) - 问题汇总及部分问题解决方案作者:Lamond Lu地址:https://www.cnblogs.com/lwqlun/p/12930713.html源代码:https://github.com/lamondlu/Mystique前景回顾从零开始实现 ASP…

C++实现顺序串(完整代码)

代码如下: #include<iostream> #include <cstring> #define _CRT_SECURE_NO_WARNINGS using namespace std;class String { public:String(){size 0;str new char[size 1];str[0] \0;}String(const String &obj){size obj.size;str new char[size 1];i…

投影仪硬件边缘融合服务器,带你了解投影融合的边缘融合显示技术

原标题&#xff1a;带你了解投影融合的边缘融合显示技术边缘融合显示系统是一个专业、复杂的视屏显示系统。在设计组建的时候务必考虑周密&#xff0c;消除各类不良因素。因为边缘融合系统建设具有相关器材多、系统连接复杂、易受环境因素干扰的特性&#xff0c;所以如果没有在…

Sql Server之旅——第六站 为什么都说状态少的字段不能建索引

我们在学sqlserver的时候&#xff0c;大多教科书和前辈们都说状态少的字段不要建索引&#xff0c;由此带来的开销还不如不建索引&#xff0c;但是这句话有多少人真的知道&#xff0c;或者说有多少人真的对此有比较深刻的理解&#xff0c;而不是听别人道听途说。。。这样记得快&…