飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 9146|回复: 13

关于内存地址和寄存器中的高位和低位简介

[复制链接]

该用户从未签到

发表于 2007-4-6 09:59:26 | 显示全部楼层 |阅读模式
CCDebuger大侠在OllyDBG 入门系列(四)-内存断点 中提到了系统存储的原则为“高高低低”.刚才我也转了一篇帖子,也有涉及这方面的东西,这里简单的和大家说一下我对“高高低低”原则的认识.若有解释不当之处,还望大家指正.

OllyICE三步简单脱SoftwareCompress 1.4加壳程序:https://www.chinapyg.com/viewthr ... &extra=page%3D1

原文:

基本算法是这样的:先用 GetDriveTypeA 函数获取磁盘类型参数,再用 GetVolumeInformationA 函数获取这个 crackme 程序所在分区的卷标。如我把这个 Crackme 程序放在 F:\OD教程\crackhead\ 目录下,而我 F 盘设置的卷标是 GAME,则这里获取的就是 GAME,ASCII 码为“47414D45”。但我们发现一个问题:假如原来我们在数据窗口中看到的地址 40339C 处的 16 进制代码是“47414D45”,即“GAME”,但经过地址 00401442 处的那条 MOV EBX,DWORD PTR DS:[ESI] 指令后,我们却发现 EBX 中的值是“454D4147”,正好把我们上面那个“47414D45”反过来了。

0040339C     47 41 4D 45 00 00 00 00 00 00 00 00 00 00 00 00     GAME............


我是这样理解的:

我们可以假设内存表就是一张纸. 当我输入一个数据的时候,软件就会为我们在内存中开辟一个地址,以往内存表中存放数据,如这里就是往这个地址开始写入数据:0040339C .
我们对内存表的高位和低位的理解就可以想做这里就是一张白纸.  我们把每个空格都当作一个位置,从0~1000开始计数,写在最前的就是低位,比如说写四个数,从0~3 . GAME数据的低位~高位就是从G到M.

之后呢,我们从内存表中区数据,放入寄存器中,我们可以把寄存器比做一个水桶,我们放入数据的时候肯定是把"水"先倒到水筒的底部.
如我们从内存中区GAME放入到水桶中的话 水桶中存放的数据就成了EMAG 也就是 45 4D 41 47 (注意每个字节是两个16进制的字符)
而水桶的高位和地位呢,想必大家会很明白,水桶的最上方就是高位,水桶底就是低位,所以EMAG 数据的高低位就是 E~G(E为最高位 G为最低位)


这样大家就清楚 高高低低原则了 (低位用D表示 高位用G表示)
                                D           G                          G            D
如果把内存地址的数据 01 02 03 04  放到寄存器就是 04 03 02 01
                                G            D                          D           G
如果把寄存器  的数据 04 03 02 01  放到内存地址为 01 02 03 04

数据的传递中 是遵循高高低低原则的 相信大家按照这个思路去理解 会更简单些~~
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-1-29 15:06
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2007-4-6 18:48:31 | 显示全部楼层
    坛主介绍得容易理解,谢谢
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-3 23:07
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2007-4-6 19:32:49 | 显示全部楼层
    学习了,讲得不错的说
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-4-6 19:33:23 | 显示全部楼层
    留个脚印,便于查找
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-7-15 18:27
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    发表于 2007-4-6 20:59:55 | 显示全部楼层
    终于明白了,谢谢楼主
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2007-6-9 23:24:06 | 显示全部楼层
    补充一下, 如果大家想理解的更确切些 , 可以这样理解

    比如说 寄存器EAX中的数据是87654321   (我们可以这样认为 3是百位/2是十位/1是各位)==>所以呢, 8就是最高位,1就是最低位,

    而在内存地址中呢, 我们可以认为就是一张空格纸, 第一个空格为01, 第二个空格为02^^^^ 依次排下去, 这样呢 我们把内存看成一张表格, 左上角就是低位, 然后依次增加. 地址依次的+1. 每一个空格就是一个地址, 比前一个空格的地址+1.

    这样呢 也是比较好理解的.  高高低低呢==>
    比如说从寄存器中取4个字节放内存中: 寄存器的数据EAX中是 87654321

    而放到内存中的时候呢
    00000001 00000002 00000003 00000004
         21            43            65          87

    因为两个16进制的数值代表一个字节.
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-8-7 13:17
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2007-6-12 13:42:11 | 显示全部楼层
    感谢大侠的分享!

    多练多得啊!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-6-13 08:47:12 | 显示全部楼层
    感谢楼主分享
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-6-13 16:58:54 | 显示全部楼层
    上学的时候就没有看明白  谢谢
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-7-5 05:41:38 | 显示全部楼层
    学习中,,谢谢
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表