首页 > 教程资料 > 日常

探索X86和X64调试和数据分析时的差别

小编 2023-04-07 09:37:35 人看过

今天线上班学员来问X86和X64有哪些区别,想想呢 正好整理一下 发个文章,X86经过这么多年的发展,他的代码检测 反调试 等各项技术已经发展的非常成熟了,所以 调试分析的难度是比X64大很多的。

而如今的新上线的游戏基本全部都是X64的了,咱们整理了一下其中的区别:

1. 从内存方来看

理论上32位的游戏最大寻址空间只有4 gb

这个值是怎么算出来的呢

32位游戏的最大寻址空间是

2的32次方=4294967296(bit)
4294967296(bit)=4194304(kb)
4,194,304(kb)=4096(mb)
4,096(mb)=4(gb)

这样我们就得到了4GB,这个值了

64位游戏同样的算法

2的64次方=18446744073709551616(bit)
18446744073709551616(bit)=18014398509481984(kb)
18014398509481984(kb)=17592186044416(mb)
17592186044416(mb)=17179869184(gb)
17179869184(gb)=16777216(tb)
16777216(tb)=16384(pb)
16384(pb)=16(eb)


   最后得到了16eb 这是4gb的4294967296倍,但是这所说的都是理论上的数据目前情况看来64位舍弃了16位没用到

    从这张图可以看到我们  概念中的地址最大是0xffffffffffffffff,但是他有2字节(1个16进制4位,1个字节2个十六进制,2个字节就是16位)没用到,实际情况是0x00007ffffffffffff,所以我们重新运算,64-16=48

所以我们是2的48次方=281474976710656(bit)
281474976710656(bit)=274877906944(kb)
274877906944(kb)=268435456(mb)
268435456(mb)=262144(gb)
262144(gb)=256(tb)

     我们算出的256 tb 是0x0000fffffffffffff的内存分配,我们还要除以2,因为我们的实际情况是0x00007ffffffffffff,所以我们得到了128

可以看出64位比32位大的太多了

2 寄存器的区别

可以看的出

32位的寄存器 eax,ecx,edx,ebx,esp,ebp,esi,edi

64位的寄存器 rax,rcx,rdx,rbx, rsp,rbp,rsi,rdi,r8,r9,r10,r11,r12,r13,r14,r15

   寄存器都从32位变成了64位,多了r8-r15寄存器,出了rcx,rdx,r8,r9 可能是参数,其他的寄存器还和32位的功能一样,另外多了16个128位的XMM寄存器以及16个256位的YMM寄存器

3. 函数的调用约定不一样

   我们调试32位程序的时候,遇到call xxxxxxx,参数都以push 的方式传进堆栈,然后在ret的时候,ret 字节 平栈回到call的下一行,或者 add 字节 外平栈,64位就不一样了,他通过rcx,rdx,r8,r9 来传参,修改[rsp+0x20](以此+8)来扩展参数, 这样就解决了堆栈平衡的问题了

当然2者还有很多区别,需要在实战当中去带领大家看了,了解更多欢迎www.weichennet.com


版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章