ce吧 关注:194,690贴子:3,796,272

扫盲第一弹,基址到底是什么?

只看楼主收藏回复

最近看贴吧,发现好多人,只会用大佬开源,但是基本概念完全搞不懂。最基本的基址概念,也搞不清楚是什么东西。
更多的是有人自己也不是很清楚,但是却来顺手发帖带偏一群小白
今天我就来讲讲,基址到底是什么,偏移到底是怎么来的
下面是一个虚构的示例程序结构


IP属地:云南1楼2018-08-10 01:30回复
    可以看到,我们定义了一个人物类,里面包含了背包指针,装备指针,以及一些属性
    这个就是今天讲解的大前提,现在,我们就来具体看看,偏移的来历,以及怎么一步步变成我们需要的数值


    IP属地:云南2楼2018-08-10 01:32
    收起回复
      首先,我们定义人物指针为全局变量
      Character * character = new Character;
      一般来说,定义为全局变量后,编译之后,系统分配的内存地址,即是固定地址,也就是我们通常所说的基质。
      在这里,假设系统分配的地址为 0x10000;
      那么,在这个示例里面,人物基址 = 0x10000,但是,0x10000这个地址,却不是人物类的地址。
      那么,他是什么呢?答案是指针,通俗点说,就是0x10000这个地址,是一个指针,指针存放的内容,指向了人物类的地址


      IP属地:云南3楼2018-08-10 01:39
      回复(6)
        由此可得,人物类的地址 为 *(int*)0x10000,也就是易语言的 读内存整数(0x10000)
        现在就来看看,偏移到底是什么来的。现在我们读取了0x10000的内容,也就是人物类的内存地址。我们接着看看人物类的结构
        Bag * bag; //背包指针
        Equipment * equipment; //装备指针
        int health; //血量
        int money; //金币
        int level; //等级
        假设我们是32位程序,那指针为4字节,可以得到如下偏移
        Bag * bag; //0
        Equipment * equipment; //4
        int health; //8
        int money; //12
        int level; //16
        现在我们已经计算出了偏移,那如果我们要获取血量,只需读之前获取的地址 + 8的内存地址即可
        易语言的话,也就是 读内存整数(读内存整数(0x10000) + 8);
        就这样,我们就获取了血量


        IP属地:云南4楼2018-08-10 01:45
        收起回复
          **,大佬**,666


          来自Android客户端5楼2018-08-10 01:51
          回复
            真大佬来了


            来自Android客户端6楼2018-08-10 01:51
            收起回复
              那么,如果我们要获取背包物品数量怎么办,只需重复之前的步骤,读取背包的指针内容,再读取即可
              在这个示例程序里面,背包指针偏移为0,也就是 读内存整数(读内存整数(0x10000) );
              背包物品偏移为0,再读取上面的获取的地址一次即可。
              基址 和 偏移的概念,其实就这么简单
              下一篇讲解内容,让你完全看懂解密函数,到底是怎么解密的


              IP属地:云南7楼2018-08-10 01:52
              回复
                http://tieba.baidu.com/p/5530062070


                IP属地:黑龙江来自iPhone客户端8楼2018-08-10 02:03
                收起回复
                  好像会用一些汇编和了解PE文件大致是怎么回事的的基本都就知道是怎么回事,简单的将就是编译时候就初始化化过的全局变量。一般情况是指针。指向一段堆内存、偶尔是数组。也就是在函数外部的变量和satic 标记的变量


                  IP属地:四川9楼2018-08-10 02:51
                  收起回复
                    可以


                    IP属地:广西来自iPhone客户端10楼2018-08-10 02:53
                    回复
                      楼主可以教下我吗,发下你能教我什么,我付学费,q:728895062


                      IP属地:江苏来自Android客户端11楼2018-08-10 03:29
                      收起回复
                        明天继续第二弹科普,带你看懂解密函数,告别一堆看不懂的置入代码


                        IP属地:云南12楼2018-08-10 03:35
                        回复
                          学习LE !!


                          13楼2018-08-10 06:42
                          回复
                            大佬66666


                            IP属地:湖北14楼2018-08-10 09:52
                            回复
                              这个可以理解,
                              要是自己对照反汇编代码来写的话,
                              同一个功能可能有几十种写法
                              就看怎么处理堆栈平衡了


                              IP属地:湖北15楼2018-08-10 11:55
                              回复