群友们好,本人高中生,学过一些编程,但是不太了解计算机的底层原理。最近玩CE(CheatEngine)的时候产生了一些疑问,在此问下大佬们:
1.内存偏移和直接加有什么区别?例:在一整片内存区域中,我发现一个数据的后一个是我想要的另一个数据,在当前数据的上层偏移量上直接+4和新增一个4的偏移似乎完全不同……此外,为什么直接加0偏移可以解引用取值?偏移到底是啥?
2.在查找内存引用的时候总能看到一些ESI和EAX啥的,我大概知道这个是寄存器,请问在追基址的时候,不同地址中的这些东西是一样的吗?我觉得不是,那是什么呢?
3.找内存引用的时候会看到有些地方做加法和减法,比如,这里是偏移还是简单的算术相加呢?此外还能见到edx+eax*4这种东西,这种怎么算呢?
谢谢各位,学业繁忙没办法系统学习汇编,只能来麻烦各位啦
关注
这么专业的吗?确实现在网上也没有什么地方能问专业的问题
这种属于死知识,你碰见了可以直接问gpt,你现在应该基础不咋滴,建议先学计算机基础,一步到位学汇编,你高看你了
1是内存堆栈指针的东西
2不知道
3计组的东西给忘了
很多东西都忘了,推荐问问ai
可以先学计组
另外,可以玩玩 图灵完备/turing complete 这款游戏,难度蛮高比较费时间,但是对学习理解数电和计组挺有用
寄存器的内容可以先去od那边看看
谁教你先学汇编的,不都是c过来的吗
回复之前建议确认下
卧槽,我想想我高中真特么
废物啊,这小子看起来真牛逼
厉害
1. 没用过ce,说一下可能的情况。一个整型数据占4个字节(32位),在内存里的情况就是从0x00到0x1f。从0x00开始算,+4有两种情况,一种情况是在地址上加4,即指向0x04。另一种情况是根据数据类型向后移动4个字节,即指向0x20(仅猜测,可以用数据去验证一下)
https://csdiy.wiki/
给你推荐一个
现在高中生都这么牛逼的吗?社会发展这么快的吗?
Gpt没问题的
可以看一下汇编语言
我嘞个豆看不懂
学单片机就懂了
建议学一下 csapp https://csapp.cs.cmu.edu
学这些挺费时间的,高中生学这个怕不是搞信竞的,可以看看计组的内存原理的部分,或者汇编的基础部分,不用全学
你可能把路走偏了,推荐你学算法竞赛这些。汇编难度大,还用处不大,性价比很低。如果你非要学的话,可以看王爽那本汇编语言入门16位汇编,然后转到64位汇编
这些问题涉及到了计算机底层的一些原理,下面我简要解释一下:
1. **内存偏移和直接加的区别**:
– **内存偏移**:指的是通过某个基址(如一个地址)加上一个偏移量来访问内存中的数据。例如,如果你有一个基址指向某个数据结构,通过加上一个偏移量可以访问到这个结构的其他成员。
– **直接加**:是指直接对一个数据值进行数学运算。比如,某个数据是4字节,直接加4就是跳过下一个4字节的空间,而偏移量通常用于指明某个特定位置的内存。
– **0偏移**是指“当前地址”,比如在指针解引用时,指针本身就代表一个内存地址,“等价于`*指针`,即指向该地址的值。
2. **寄存器(如ESI和EAX)**:
– 这些寄存器存储着指向内存地址的数据,它们在程序运行时起到重要作用。**ESI**和**EAX**等寄存器值不是固定的,它们根据执行的指令或程序上下文的不同而变化。
– 在追基址时,寄存器值通常会随程序的执行而变化,因为不同的函数或内存操作可能会修改它们的值。
3. **偏移和加法、减法**:
– **** 这样的表示是对内存的**偏移**,意思是基址是`edx`寄存器的值,加上常量`00000768`得到新的内存地址。
– **edx+eax*4** 表示在`edx`寄存器的基础上加上`eax`寄存器值乘以4(这通常是用来访问数组元素,因为每个元素占用4字节)。这类运算的实际含义就是根据`eax`的值来确定偏移的大小,常见于访问以`eax`作为索引的数组或数据结构。