Sql Server之旅——第六站 使用winHex利器加深理解数据页

  

        这篇我来介绍一个winhex利器,这个工具网上有介绍,用途大着呢,可以用来玩数据修复,恢复删除文件等等。。。。它能够将一个file解析成

hex形式,这样你就可以对hex进行修改,然后你就可以看到修复后的结果,为什么要在sqlserver系列中说这个呢???很简单呀,sqlserver的DB本

质上也是一个mdf文件,对吧,既然是文件,我就可以利用winhex对它进行随意的修改,然后你也知道sqlserver的数据都是以数据页的形式封装的,

那我就可以修改它的数据页,对不对,这样我就可以随便改变记录的顺序,包括槽位,记录,页头等等。。。说干就干吧!!!

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

Person(ID ,NAME (),Age dbo.Person (, dbo.Person (, dbo.Person (, dbo.Person

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

TRACEON( IND(Ctrip,Person, PAGE(Ctrip,,,)
Memory 00000000100EA000: 00000000100EA010: 00000000100EA020: 4e000000 8e000000 00000000100EA030: 00000000100EA040: 00000000100EA050: 00000000100EA060: 30000c00 00000000100EA070: 6d793000 0c000200 00000000100EA080: 00000000100EA090: 001c0000 00000000100EA0A0: 736d6172 00000000100EA0B0: 00000000100EBFC0: 00000000100EBFD0: 00000000100EBFE0: 00000000100EBFF0: 1f0b OFFSET Row () ( () ( () ()

  我想大家现在都清楚了,数据页中的一条条存储记录都是通过页尾的槽位指向的,具体可以参见前几篇对数据页的介绍,比如你看到页尾的:

8d00了吗?要注意,这些都是按照字节逆序来的。

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

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

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

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

PAGE(Ctrip,)
PAGE: (:BUFFER:

BUF <span style="color: #008000;">@0x0000000083FD8E00<span style="color: #000000;">

bpage <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0x0000000083ADC000 bhash <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0x0000000000000000 bpageno <span style="color: #808080;">= (<span style="color: #800000; font-weight: bold;">1:<span style="color: #800000; font-weight: bold;">78<span style="color: #000000;">)
bdbid <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">8 breferences <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0 bUse1 <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">2495<span style="color: #000000;">
bstat <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0x1c0000b blog <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0xbbbbbbbb bnext <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0x0000000000000000<span style="color: #000000;">

PAGE HEADER:

Page <span style="color: #008000;">@0x0000000083ADC000<span style="color: #000000;">

m_pageId <span style="color: #808080;">= (<span style="color: #800000; font-weight: bold;">1:<span style="color: #800000; font-weight: bold;">78) m_headerVersion <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">1 m_type <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">1<span style="color: #000000;">
m_typeFlagBits <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0x4 m_level <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0 m_flagBits <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0x8000<span style="color: #000000;">
m_objId (AllocUnitId.idObj) <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">63 m_indexId (AllocUnitId.idInd) <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">256<span style="color: #000000;">
Metadata: AllocUnitId <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">72057594042056704<span style="color: #000000;">
Metadata: PartitionId <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">72057594041204736 Metadata: IndexId <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0<span style="color: #000000;">
Metadata: ObjectId <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">341576255 m_prevPage <span style="color: #808080;">= (<span style="color: #800000; font-weight: bold;">0:<span style="color: #800000; font-weight: bold;">0) m_nextPage <span style="color: #808080;">= (<span style="color: #800000; font-weight: bold;">0:<span style="color: #800000; font-weight: bold;">0<span style="color: #000000;">)
pminlen <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">12 m_slotCnt <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">3 m_freeCnt <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">8021<span style="color: #000000;">
m_freeData <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">165 m_reservedCnt <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0 m_lsn <span style="color: #808080;">= (<span style="color: #800000; font-weight: bold;">142:<span style="color: #800000; font-weight: bold;">102:<span style="color: #800000; font-weight: bold;">3<span style="color: #000000;">)
m_xactReserved <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0 m_xdesId <span style="color: #808080;">= (<span style="color: #800000; font-weight: bold;">0:<span style="color: #800000; font-weight: bold;">0) m_ghostRecCnt <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0<span style="color: #000000;">
m_tornBits <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0<span style="color: #000000;">

Allocation Status

GAM (<span style="color: #800000; font-weight: bold;">1:<span style="color: #800000; font-weight: bold;">2) <span style="color: #808080;">= ALLOCATED SGAM (<span style="color: #800000; font-weight: bold;">1:<span style="color: #800000; font-weight: bold;">3) <span style="color: #808080;">=<span style="color: #000000;"> ALLOCATED
PFS (<span style="color: #800000; font-weight: bold;">1:<span style="color: #800000; font-weight: bold;">1) <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0x61 MIXED_EXT ALLOCATED 50_PCT_FULL DIFF (<span style="color: #800000; font-weight: bold;">1:<span style="color: #800000; font-weight: bold;">6) <span style="color: #808080;">=<span style="color: #000000;"> CHANGED
ML (<span style="color: #800000; font-weight: bold;">1:<span style="color: #800000; font-weight: bold;">7) <span style="color: #808080;">= <span style="color: #808080;">NOT<span style="color: #000000;"> MIN_LOGGED

DATA:

<span style="color: #ff0000;">Slot <span style="color: #ff0000;"><span style="font-weight: bold;">0,Offset <span style="font-weight: bold;">0x60,Length <span style="font-weight: bold;">22<span style="color: #000000;"><span style="color: #ff0000;">,DumpStyle BYTE

Record Type <span style="color: #808080;">= PRIMARY_RECORD Record Attributes <span style="color: #808080;">=<span style="color: #000000;"> NULL_BITMAP VARIABLE_COLUMNS
Record Size <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">22<span style="color: #000000;">
Memory <span style="color: #000000;">Dump <span style="color: #008000;">@0x000000000F7FC060

<span style="color: #800000; font-weight: bold;">0000000000000000: 30000c00 <span style="color: #800000; font-weight: bold;">01000000 <span style="color: #800000; font-weight: bold;">14000000 <span style="color: #800000; font-weight: bold;">03000001 †<span style="color: #800000; font-weight: bold;">0<span style="color: #000000;">...............
<span style="color: #800000; font-weight: bold;">0000000000000010: <span style="color: #800000; font-weight: bold;">001600<span style="color: #0000ff;">61<span style="color: #000000;"><span style="color: #0000ff;"> 6d79††††††††††††††††††††††††...amy

<span style="color: #ff0000;">Slot <span style="color: #ff0000;"><span style="font-weight: bold;">1,Offset <span style="font-weight: bold;">0x76,Length <span style="font-weight: bold;">23<span style="color: #000000;"><span style="color: #ff0000;">,DumpStyle BYTE

Record Type <span style="color: #808080;">= PRIMARY_RECORD Record Attributes <span style="color: #808080;">=<span style="color: #000000;"> NULL_BITMAP VARIABLE_COLUMNS
Record Size <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">23<span style="color: #000000;">
Memory <span style="color: #000000;">Dump <span style="color: #008000;">@0x000000000F7FC076

<span style="color: #800000; font-weight: bold;">0000000000000000: 30000c00 <span style="color: #800000; font-weight: bold;">02000000 <span style="color: #800000; font-weight: bold;">19000000 <span style="color: #800000; font-weight: bold;">03000001 †<span style="color: #800000; font-weight: bold;">0<span style="color: #000000;">...............
<span style="color: #800000; font-weight: bold;">0000000000000010: <span style="color: #800000; font-weight: bold;">001700<span style="color: #0000ff;">61<span style="color: #000000;"><span style="color: #0000ff;"> 6e6e61††††††††††††††††††††††...anna

<span style="color: #ff0000;">Slot <span style="color: #ff0000;"><span style="font-weight: bold;">2,Offset <span style="font-weight: bold;">0x8d,Length <span style="font-weight: bold;">24<span style="color: #000000;"><span style="color: #ff0000;">,DumpStyle BYTE

Record Type <span style="color: #808080;">= PRIMARY_RECORD Record Attributes <span style="color: #808080;">=<span style="color: #000000;"> NULL_BITMAP VARIABLE_COLUMNS
Record Size <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">24<span style="color: #000000;">
Memory <span style="color: #000000;">Dump <span style="color: #008000;">@0x000000000F7FC08D

<span style="color: #800000; font-weight: bold;">0000000000000000: 30000c00 <span style="color: #800000; font-weight: bold;">03000000 1c000000 <span style="color: #800000; font-weight: bold;">03000001 †<span style="color: #800000; font-weight: bold;">0<span style="color: #000000;">...............
<span style="color: #800000; font-weight: bold;">0000000000000010: <span style="color: #800000; font-weight: bold;">001800<span style="color: #0000ff;">73<span style="color: #000000;"><span style="color: #0000ff;"> 6d617274 †††††††††††††††††††...smart

OFFSET <span style="color: #0000ff;">TABLE<span style="color: #000000;">:

Row <span style="color: #808080;">-<span style="color: #000000;"> Offset
<span style="color: #800000; font-weight: bold;">2 (<span style="color: #800000; font-weight: bold;">0x2) <span style="color: #808080;">- <span style="color: #800000; font-weight: bold;">141 (<span style="color: #800000; font-weight: bold;">0x8d<span style="color: #000000;">)
<span style="color: #800000; font-weight: bold;">1 (<span style="color: #800000; font-weight: bold;">0x1) <span style="color: #808080;">- <span style="color: #800000; font-weight: bold;">118 (<span style="color: #800000; font-weight: bold;">0x76<span style="color: #000000;">)
<span style="color: #800000; font-weight: bold;">0 (<span style="color: #800000; font-weight: bold;">0x0) <span style="color: #808080;">- <span style="color: #800000; font-weight: bold;">96 (<span style="color: #800000; font-weight: bold;">0x60<span style="color: #000000;">)

<span style="color: #0000ff;">DBCC 执行完毕。如果 <span style="color: #0000ff;">DBCC 输出了错误信息,请与系统管理员联系。

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

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

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

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

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

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

上面这个截图没什么稀奇的地方,大家也觉得见怪不怪的,那下面就有一个想法来了,如果我通过winHex来交换slot0和slot1的顺序,那效果会是

怎样???按照常理说,这时候引擎还是按照slot槽位依次扫描,这时候应该会将ID=2的记录先喷出来,然后再喷出ID=1,ID=3。。。事实是不是

这样子呢?好奇吧,我们来看看。。。

1.  我们知道Ctrip数据库是联机的,我们要修改它必须先脱机,然后再关掉数据页的一致性校验(

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

3. 我们知道一个数据页的大小是8KB=8192B,那么第78号数据页的起始位置的偏移量应该就是:78*8192=638976,然后通过快捷键

    Alt+G打开偏移量列表,键入638976,如下图:

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

说干就干。

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

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

当你看到这张图的时候,是不是已经疯了。。。。这样我就非常肯定的论证了,引擎真的就是通过依次扫描slot的槽位来指向记录的,如果你

大概理解了上面的操作,现在你可以修改任意数据页的数据了,只要你找得到数据页的偏移量,然后任由你发挥啦~~~~感谢感谢。。。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本篇内容主要讲解“sqlalchemy的常用数据类型怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sqlalche...
今天小编给大家分享一下sqlServer实现分页查询的方式有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“sqlmap之osshell怎么使用”,在日常操作中,相信很多人在sqlmap之osshell怎么使用问题上存在疑惑,小编查阅了各式资料,整理出
本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
1. mssql权限sa权限:数据库操作,文件管理,命令执行,注册表读取等system。是mssql的最高权限db权限:文件管理,数据库操作等 users-administratorspublic权限:数据库操作 guest-users2、sql server注入执行命令查
sql执行计划如何查看?在SPL庞大的数据中我们不知道如何查看实际数据库中发生了什么事情,有必要定期进行查询优化和索引否则会影响我们后期的SQL的查询速度。那么针对这样的问题我们必须要知道SQL执行的计划,在本文中winwin7小编给大家分享下SQL执
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点应用非常广泛。不过在使用中,我们会遇到非常多的错误,面对这么庞大的数据库环境,当然会有精确的错误代码的对照季,下面小编分享的
SQL Server本地账户无法登陆出现错误提示:error:40-Could not open a connenction to SQL Server的问题很常见,对于初学者来说可能不知道如何解决,一起来看看下面的解决方案。解决步骤如下:1、这种情况需要开启 SQL Server service
微软推出的SQL2008是一款非常好用的数据库软件,它稳定、功能强大,为众多企业提供了最佳的数据库解决方案,那么我们如何在Windows中安装它呢,一些朋友对SQL Server 2008的安装过程还不是很熟悉,下面就一起来看看SQL Server 2008详细安装图解...
本页概要如果您使用的是 SQL Server 2005备份和还原Sp_detach_db 和 Sp_attach_db 存储过程关于排序规则的说明导入和导出数据(在 SQL Server 数据库之间复
DBCC CHECKIDENT 检查指定表的当前标识值,如有必要,还对标识值进行更正。 语法 DBCC CHECKIDENT ( &#39;table_name&#39; [ , { NORESEED
这里对 SQL Server 字符串函数进行分门别类地列出,便于查阅和记忆,相信大家都在其它方面有高深的编程基础,从字面上来说大家都知道这些函数的意义,就不对这些函数作过多的解释了,主要谈些经验,具体
查询及删除重复记录的方法 1、查找表(people)中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select*frompeoplewherepeopleIdin(selectpe
微软发SQL Server 2008第二个CTP预览版from: http://news.csdn.net/n/20070807/107158.html8月7日消息,微软公司本周发布了SQL Serv
症状当您将数据库备份恢复到另一台服务器时,可能会遇到孤立用户的问题。SQL Server 联机丛书中的孤立用户疑难解答主题中没有讲述解决此问题的具体步骤。本文介绍了如何解决孤立用户问题。更多信息虽然术
当登录SQL Server 2005时可能碰到错误: &#39;No Process is on the Other End of the Pipe&#39;。解决方法:(1)Open up SQL
概要本文描述如何映射标准登录和集成登录来解决在运行 SQL Server 的服务器之间移动数据库时的权限问题。更多信息当您将数据库从一个运行 SQL Server 的服务器移到另一个运行 SQL Se
----------------------------------------问题:该用户与可信的SQL SERVER 连接无关联使用sa用户或自建用户使用“SQL SERVER 身份认证”连接数据
更新日期: 2007 年 5 月 20 日 使用下表可以确定各种版本的 Microsoft SQL Server 2005 支持哪些功能。有关 SQL Server 2005 Enterprise E
当从Excel导入数据到Sql Sever中,可能会出现以下问题:&#xD;&#xA;对于指定的缓冲区大小而言,源列的数据太大