1.第二阶段x64游戏实战-x86和x64的区别
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
上一个内容:这是第一章
x64相比较与x86来说是简单的,因为x64的游戏都比较新,对游戏加的一些防护也比较少,而且它的游戏数据相对于x86来说更简单,更容易分析,很多32位游戏都进行了升级加入了64位版本
主要记住x64函数由于64位处理器多了几个寄存器,编译器会优先使用寄存器传参从而增加性能
传参优先使用rcx、rdx、r8、r9,其余参数使用栈传
rcx(第一个参数)
rdx(第二个参数)
r8(第三个参数)
r9(第四个参数)
函数调用之前会申请一块栈空间,访问栈时使用rbp+偏移的方式
寄存器的区别:
64位寄存器兼容源32位寄存器,下图是常用的64位寄存器
![]()
调用约定
x86中使用stdcall(调用的函数进行平栈操作)、cdecl(调用完函数我们自己手动平栈)、fastcall等
x64使用类似fastcall的约定,fastcall前4个参数会使用rcx(第一个参数)、rdx(第二个参数)、r8(第三个参数)、r9(第四个参数),4个参数之外的使用栈传参
栈的使用
32位代码在函数中使用push和pop等指令改变栈的大小
64位代码在函数中在函数执行之前会申请一块栈空间,如下图sub rsp,0x80这样的代码申请栈空间,至于sub后面的数是多少取决于编译器
![]()
申请之后访问变量时或存放变量时采用,mov rbp-0x10, 0x10这样的代码进行操作
32位代函数中会频繁push或pop,这就会导致esp频繁变动,所以64位函数比32位函数性能会好
![]()
fastcall汇编代码
使用CE搜索的血量
如下图可以看出内存地址很长了是8字节的
游戏中血量修改成2361,再次搜索
然后就能找到游戏中血量在当前电脑内存的位置了
下图1和2都要双击
双击完2如下图修改数值为12,修改完游戏中也会变化,如果不变化可以尝试关闭角色详情窗口重新打开
然后角色数据一般都会写到一个结构体或一个类中,所以找到了血量也会找到其它的属性,比如防御力、怒气、闪避、暴击率、外功、内功等
鼠标右击如下图,选择浏览相关内存区域
如下图右击选择4字节(DEC),意思是以4字节十进制的模式显示数据
通过与游戏中角色属性界面的对比下图红框都是角色属性的值