我们在逆向游戏的时候,老是听有人会说找基址呀. 但是你不好奇什么才叫基址码?
今天我们就探究一下什么是基址。
首先我们认识一下exe文件是怎么加载进Memory的。
首先双击exe, 电脑就会分配 4GB Virtual Memory (32bit computer) 给程序。
exe首先会贴进这个4GB空间。在exe PE结构里面有Image Base 和 Image Size两个数组确认了exe在这个4GB内存中哪里开始贴,哪里结束。(因为exe是第一个加载进这个Virtual Memory里面的,正常情况下ImageBase不会被占用,不需要考虑重定位)。所以在Image Base ~ (Image Base + Image Size)这一区域的内存范围就是这个游戏的基址内存。
接着,当所有exe和dll贴到内存中之后,exe就开始运行了。在运行的时候,会产生很多malloc/new在堆中创建的数据。这个堆的数据就是临时的,我们平常查到的数据一般都来自这里。
那我们查基址的一种方法是通过偏移查基址,这个原理又是什么呢?
我们知道我们查到的数据都在new出来的结构里面,那么new出来的结构肯定都需要通过一个参数存储这个new出来的地址, 而且需要delete/free。如下:
1 | int* newAddress = new int[10]; |
那么只要new/malloc了,那么在exe主函数中,就会存在一个指针指向这个new出来的空间。
我们寻找指针的过程其实就是寻找exe主函数中的指针的过程, 过程如下