Template fonksiyon ve sınıfı hakkındaki post
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
template <class T> unsigned long MEMORY_Write(int WriteAddress, const T& value, HANDLE hproc) { const byte* p = (const byte*)(const void*)&value; unsigned long i; WriteProcessMemory(hproc, (void*)WriteAddress, p, sizeof(value), &i); return i; } template <class T> unsigned long MEMORY_Read(int ReadAddress, T& value, HANDLE hproc) { byte* p = (byte*)(void*)&value; unsigned long i; ReadProcessMemory(hproc, (void*)ReadAddress, p, sizeof(value), &i); return i; } |
Kullanımı şu şekilde
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
HANDLE hproc = OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessId()); int mynumber = 51; DWORD adr = (DWORD) & (mynumber); DWORD xe; // 51'in oldugu adresi okut ve Göster. MEMORY_Read(adr, xe, hproc); ShowMessage(xe); // 51'in oldugu adrese küsüratlı sayı yaz. float myfloat = 313.5131; MEMORY_Write(adr, myfloat, hproc); // 51'in oldugu yere küsüratlı sayı yazılmış olmalı. Şimdi okuyalım onu ve // gösterelim. float okunan; MEMORY_Read(adr, okunan, hproc); ShowMessage(okunan); // Bir array oluşturdum,değerleri şunlar. BYTE array_k[10] = {0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, 0x85, 0x95}; // boş bir array oluşturdum 10 byte alabilir. BYTE *bosarray = new BYTE[10]; // dolu array'i bosarray'e yazdırdım. MEMORY_Write((int) & bosarray, array_k, hproc); // yazdırdıgım bos alanın ilk 5 byte'ını okutuyorum ve gösteriyorum. for (int i = 0; i < 5; i++) { BYTE okunanbyte; MEMORY_Read((int)&bosarray + i, okunanbyte, hproc); ShowMessage(IntToHex((int)okunanbyte, 1)); } delete[] bosarray; |
Projelerimizi kısaltabilir, daha uygun ve temiz kodlar yazabiliriz.
Not1: IsReadBadPtr kullanarak kodu sağlamlaştırabilirsiniz.
Not2: Byte dizisi okuma ve yazma durumlarında, array çok büyükse sıkıntı çıkacaktır. Fonksiyonlara opsiyonel parametre olarak maksimum uzunluk değişkeni koyup, güvenlik açsından kullanmanız çok yararlı olacaktır.
Not3: Fonksiyonu bir unsigned long değere eşitlediğimizde, çıkan sonuç 0 ise okuma yazma başarısızdır, buna göre kodlama sağlamlaştırılabilir.