- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
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
数据的传递中 是遵循高高低低原则的 相信大家按照这个思路去理解 会更简单些~~ |
|