C++转Delphi:this[-0x00003111]的理解与代码转换求助
拆解C++代码并转换为Delphi版本
嘿,我来帮你把这段代码弄明白,再转换成Delphi版本~
先解释你困惑的&this[-0x00003111]
在C++里,this是指向当前类对象的指针(比如MyClass* this)。指针的下标运算有个小技巧:
ptr[n]等价于*(ptr + n):把指针往后偏移n个当前指针类型大小的位置,再解引用- 反过来,
ptr[-k]就等价于*(ptr - k):把指针往前偏移k个当前指针类型大小的位置,再解引用
而&this[-0x3111]其实是个简化写法:因为&*(ptr - k)的结果就是ptr - k(解引用后再取地址,等于原偏移后的指针本身),所以这段代码等价于this - 0x3111。
⚠️ 注意:这里的偏移是按当前类对象的大小计算的,比如如果当前类大小是4字节,那最终地址就是(uintptr_t)this - 0x3111 * 4。但原代码里用reinterpret_cast<unsigned int>转成整数,大概率是想做字节级偏移(而不是对象大小级)——那这段C++代码其实写得不太严谨,正确的字节偏移写法应该是:
reinterpret_cast<unsigned int>(reinterpret_cast<unsigned char*>(this) - 0x3111)
转换成Delphi代码
Delphi里对应this的是Self,我们分两种情况处理:
情况1:原代码确实是按对象大小偏移(少见)
假设你的类是TMyClass,代码如下:
var OffsetAddr: UInt32; begin OffsetAddr := UInt32(NativeInt(Self) - $3111 * SizeOf(TMyClass)); end;
情况2:原代码意图是字节级偏移(更可能)
这是最常见的内存hack场景,直接把Self转成整数后减去十六进制的$3111即可:
var OffsetAddr: UInt32; begin OffsetAddr := UInt32(NativeInt(Self) - $3111); end;
对应原C++代码的完整转换
原C代码里的两次转换(reinterpret_cast+static_cast)在Delphi里可以简化成上面的写法,因为NativeInt(Self)已经把指针转成整数类型,再转成UInt32就对应C的unsigned int。
内容的提问来源于stack exchange,提问作者Robbie Nam
相关产品推荐
相关产品推荐

