2017-07-27 5 views
0

Je suis actuellement en train de jouer avec la mémoire dans certains jeux que je joue pour voir ce que je suis capable de faire, j'ai une classe d'édition de mémoire modifiée pour satisfaire mes besoins mais je ne peux pas éditer ou lire booléen valeurs qui me cause problème. La classe m'aide à modifier les valeurs d'un processus externe à l'aide d'un crochet.C# Édition de mémoire Booléens

écriture à une valeur bool est ce que je veux faire plus et ce que j'ai essayé, mais TBH je ne sais pas quel est le problème avec elle

public bool WriteBool(int Address, bool Value) 
{ 
    byte[] bArray = BitConverter.GetBytes(Value); 
    bool flag = Process_MemoryReaderWriter.WriteProcessMemory((IntPtr)this.Handle, (IntPtr)Address, bArray, 2, 0); 
    return flag; 

} 

Je dois aussi lire quelques valeurs booléennes dans c'est ce que j'ai essayé;

public bool ReadBool(int Address) 
{ 
    IntPtr intPtr = IntPtr.Zero; 
    byte[] bArray = new byte[4]; 
    IntPtr intPtr1 = intPtr; 
    Process_MemoryReaderWriter.ReadProcessMemory((IntPtr)this.Handle, (IntPtr)Address, bArray, 2, out intPtr1); 
    int rBInt = BitConverter.ToInt32(bArray, 0); 
    int num = rBInt; 
    bool boolValue = num != 0; 
    return boolValue; 
} 

J'ai déterminé que les booléens sont la question que tout semble fonctionner très bien où cela est la dernière étape où le programme semble échouer. Comme vous pouvez probablement le dire je ne sais pas vraiment ce que je fais avec cela (preuve que cela ne fonctionne pas), mais toute aide serait utile, en gardant à l'esprit si possible s'il vous plaît essayer de garder les réponses de manière semi-simple.

Je crois avoir fourni tout mais si vous avez besoin de plus d'informations s'il vous plaît demander :)

+1

Comment structurer une valeur "booléenne" en mémoire dépend de la plate-forme et/ou du langage de programmation utilisé. Habituellement, ils sont stockés sous la forme d'entiers 0 ou 1, mais ils peuvent différer en taille, et peuvent avoir une taille de 1, 2 ou 4 octets (voir même 8). Assurez-vous que vous obtenez la bonne taille. –

+1

'BitConverter' est une classe d'aide pour la sérialisation, pas une méthode magique qui vous donne les octets que votre cible veut. "Bool" n'est pas un type bien défini, vous devez savoir comment les valeurs vraies et fausses sont représentées dans le jeu particulier (ce qui dépend du compilateur, de la plate-forme, des hacks de "bas niveau" ...). 'BitConverter.GetBytes (bool)' vous donne un seul octet qui est soit zéro ou un, ce qui sera à peu près * jamais * ce que vous voulez. – Luaan

Répondre

0

BitConverter.GetBytes(bool) retourne un tableau d'octets de taille 1, alors qu'il ressemble à WriteProcessMemory et ReadProcessMemory s'attendent des tableaux d'octets de taille 2 (quatrième paramètre de chaque). Changer ceux à 1 devrait résoudre ce problème. En outre, BitConverter a aussi une méthode ToBoolean, donc pour vous lire pourriez faire quelque chose comme:

public bool ReadBool(int Address) 
{ 
    IntPtr intPtr = IntPtr.Zero; 
    byte[] bArray = new byte[1]; 
    Process_MemoryReaderWriter.ReadProcessMemory((IntPtr)this.Handle, (IntPtr)Address, bArray, 1, out intPtr); 
    return BitConverter.ToBoolean(bArray, 0); 
} 

Juste pour que vous le savez, comment les autres systèmes gèrent booléens ne sont pas bien définis, mais vous devriez être en sécurité en supposant que 0 == faux à tout le moins. La taille de l'octet peut être votre problème principal - certains langages et systèmes utilisent 4 octets/float, d'autres 1 donc vous devrez peut-être ajuster votre code (par exemple, votre méthode ReadBool fonctionne si l'autre processus utilise 4 octets).