C++:
#include <iostream>
#include "windows.h"
int main()
{
int PID;
int Memory;
int Buffer;
std::cout << "Process ID: ";
std::cin >> PID;
HANDLE hHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, PID);
if (hHandle == INVALID_HANDLE_VALUE) {
std::cerr << "An error occured. Error: " << GetLastError();
return 1;
}
std::cout << "Memory address: ";
std::cin >> std::hex >> Memory;
std::cout << "=========================" << std::endl;
ReadProcessMemory(hHandle, LPCVOID(Memory), &Buffer, sizeof(Memory) + 1, 0);
std::cout << "Handle ID: " << hHandle << std::endl;
std::cout << "Handle address: " << &hHandle << std::endl;
std::cout << "Memory address: " << Memory << std::endl;
std::cout << "Hexadecimal memory address: " << std::hex << Memory << std::endl;
std::cout << "Read value is " << Buffer << "." << std::endl;
std::system("pause");
return 0;
}
Kullanımı:
MemoryAccess.exe
Process ID: [işlem kimliği]
Memory address: [bellek adresi]
Bellek adresi nasıl alınır?
IDA Free ve Cheat Engine gibi yazılımlardan bir program hakkında bellek bilgilerini edinebilirsiniz.
O zaman bunu neden kullanayım?
Bu sadece öğretme amaçlı yapılmış bir yazılım. ReadProcessMemory fonksiyonu demosu gibi düşünebilirsiniz.
ReadProcessMemory hakkında daha fazla bilgiyi buradan bulabilirsiniz.
Çalışma prensibi
C++:
int main() {
}
Her C++ programında olması gereken "int main" fonksiyonu ile ilk temeli atıyoruz.
C++:
int PID;
int Memory;
int Buffer;
std::cout << "Process ID: ";
std::cin >> PID;
Fonksiyon için gerekli olan değişkenleri ayarlıyoruz. Memory olan sorgulanacak adres, Buffer da bizim terminalde gördüğümüz değer olacaktır.
std::cout kısmı ile terminalimize yazıyı yazıyoruz. Belirttiğimiz integer türündeki PID değişkenine std::cin ile değer atıyoruz.
C++:
HANDLE hHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, PID);
if (hHandle == INVALID_HANDLE_VALUE) {
std::cerr << "An error occured. Error: " << GetLastError();
return 1;
}
std::cout << "Memory address: ";
std::cin >> std::hex >> Memory;
HANDLE değişkeni açarak OpenProcess ile gereken bayrakları ve parametreleri ayarladıktan sonra hata ayıklaması yapıyoruz. Eğer HANDLE değeri geçersiz ise, "An error occured." hatası verip 1 koduyla çıkış yapacaktır.
Sonra da önceden belirttiğimiz sorgulanacak bellek adresine değer atama yapıyoruz.
C++:
std::cout << "=========================" << std::endl;
ReadProcessMemory(hHandle, LPCVOID(Memory), &Buffer, sizeof(Memory) + 1, 0);
std::cout << "Handle ID: " << hHandle << std::endl;
std::cout << "Handle address: " << &hHandle << std::endl;
std::cout << "Memory address: " << Memory << std::endl;
std::cout << "Hexadecimal memory address: " << std::hex << Memory << std::endl;
std::cout << "Read value is " << Buffer << "." << std::endl;
std::system("pause");
return 0;
Terminal ekranını toparlama amaçlı bir çizgi çektikten sonra edindiğimiz bilgileri yazıyoruz. "Read value is" ile başlayan da ReadProcessMemory'dan Buffer'a aktarılan verinin çekilmesi sonucu oluşan sonuçtur. Pause dedikten sonra da 0 koduyla da çıkış yapıyoruz.
Umarım işinize yarar, okuduğunuz için teşekkürler.