C++ CLI bellek adresi okuma yazılımı

246675

Kilopat
Katılım
29 Ocak 2019
Mesajlar
3.801
Makaleler
6
Çözümler
22
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.
 

Yeni konular

Geri
Yukarı