我试图理解的代码覆盖了游戏进程内存的一部分(window.h,WriteProcessMemory),以便修改游戏中的参数(例如,力量)。值很可能是整数
代码尝试使用此函数替换
WriteProcessMemory( GameHandle, (BYTE*)StrengthMemoryAddress, &StrengthValue, sizeof(StrengthValue), NULL);
其中StrengthMemoryAddress是预先计算的动态地址,而StrengthValue如下:
byte StrengthValue[] = { 0x39, 0x5, 0x0, 0x0 };
用1337取代实力
我的问题基本上是字节数组在这个函数中的工作原理。来自谷歌我知道1337的十六进制值是0x539。
你怎么在字节数组中反转它?我看到他首先将0x39然后放入0x5,我得出的结论可能是以相反的顺序组合到0x539。另外,为什么你最后需要额外的0x0 - 你不能把它留下来吗?
感谢
答案 0 :(得分:8)
来自Google的我知道1337的十六进制值是0x539。
或者它是0x00000539,它是相同的,但写为4字节整数。现在,如果你在内存中以小端方式写这个整数,你必须按照以下顺序存储它(最低有效字节 - 0x39 - 先行):
WITH Temp AS
(
SELECT GroupProductRelationSorting
FROM EcomGroupProductRelation
WHERE GroupProductRelationProductID = 'PROD7'
)
SELECT GroupProductRelationProductID
FROM
(
SELECT
GroupProductRelationProductID,
ROW_NUMBER() OVER (PARTITION BY GroupProductRelationGroupID ORDER BY GroupProductRelationSorting) AS RN
FROM
EcomGroupProductRelation
INNER JOIN
EcomProducts ON
GroupProductRelationProductID = ProductID
WHERE
ProductActive = 1 AND
GroupProductRelationSorting > (SELECT GroupProductRelationSorting FROM Temp)
) x
WHERE RN = 1
这与字节序有关。您可能想要阅读有关该主题的更多信息。
答案 1 :(得分:1)
您期望0x39
是最高字节(Big Endian
),但最终您的结构是最低字节(Little Endian
)。
将int
逻辑地视为:
[ BYTE 0 ][ BYTE 1 ][ BYTE 2 ][ BYTE 3 ]
* 256^3 *256^2 *256 *1
MSB LSB
但这并不意味着您所在的架构以这种方式映射char
数组。事实上它恰恰相反。
value [what you expected] [what you got]
BIG ENDIAN LITTLE ENDIAN
0x39 BYTE 0 BYTE 3
0x05 BYTE 1 BYTE 2
0x00 BYTE 2 BYTE 1
0x00 BYTE 3 BYTE 0
如果您没有设置所有4个字节而不是丢失的字节被称为uninialized memory
并通过int
使用它,那么您创建的被视为undefined behavior
。这可能只会在丢失的字节中留下一个意外的值(无论之前发生过什么),但编译器可以自由地做任何想做的事情,比如删除你认为会做某事的代码,导致你出乎意料的行为。 / p>
答案 2 :(得分:0)