CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - odczyt z bloku pamięci ram

odczyt z bloku pamięci ram

dział ogólny

odczyt z bloku pamięci ram

Nowy postprzez zeno32167 » piątek, 14 listopada 2008, 23:26

Otórz mam pewien blok pamięci, np CFEDE0 i wiem że w nim jest zapisany jakiś string, jak go odczytać? chciałbym go np wrzucić sobie do boxa albo labela etc.
Avatar użytkownika
zeno32167
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 30 sierpnia 2008, 17:15
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: odczyt z bloku pamięci ram

Nowy postprzez Witold » poniedziałek, 17 listopada 2008, 20:29

Jeżeli w "własnym" procesie to chyba:
Kod: Zaznacz cały
char * s0 =  reinterpret_cast<char*>(0xCFEDE0);
//lub
char * s1 = ( char*)0xCFEDE0; // wer. bez nowego sposobu rzutowania

Jeżeli w "obcym": ReadProcessMemory może być przydatne.
http://msdn.microsoft.com/en-us/library/ms680553.aspx
http://4programmers.net/Delphi/ReadProcessMemory
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: odczyt z bloku pamięci ram

Nowy postprzez zeno32167 » czwartek, 20 listopada 2008, 21:30

chodzi mi o odczyt z obcego

i teraz mam problem

Kod: Zaznacz cały
AnsiString string1 ;
HWND h = FindWindow(NULL,"test"); // uchwyt do tego procesu z ktorego chce przeczytać 0xCFEDE0

ReadProcessMemory(h,/*tutaj chce żeby mu dać voida jak ja znam adres 0xCFEDE0 - jak go tutaj podać?*/,string1/* - tutaj jeśli chyba dobrze rozumiem wrzuci mi to co odczyta z tego bloku pamieci*/,16,NULL);

Edit1->Text = string1 ; no i tutaj chce sobie wrzucic to co mi odczytał


na 4programmers jest przyklad dla delphi, a ja zielony z tego

dzieki za pomoc
Avatar użytkownika
zeno32167
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 30 sierpnia 2008, 17:15
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: odczyt z bloku pamięci ram

Nowy postprzez Cyfrowy Baron » piątek, 21 listopada 2008, 09:36

Wypróbuj to:

KOD cpp:     UKRYJ  
void TForm1::GetFileName(char *emFILE_NAME, char *emFILE_PATH)
{
  char emFILE_DRIVE[_MAX_DRIVE];
  char emFILE_DIR[_MAX_DIR];
  char emFILE_FNAME[_MAX_FNAME];
  char emFILE_EXT[_MAX_EXT];

  _splitpath(emFILE_PATH, emFILE_DRIVE, emFILE_DIR, emFILE_FNAME, emFILE_EXT);

  lstrcpy(emFILE_NAME, emFILE_FNAME);
  lstrcat(emFILE_NAME, emFILE_EXT);
  return;
}
//----------------------------------------------------------
bool TForm1::GetProcess(DWORD *PID, char *EXENAME) // PID - identyfikator procesu
{
  char FileName[MAX_PATH];
  HANDLE snapshot;
  PROCESSENTRY32 processinfo;
  *PID = 0;
  processinfo.dwSize = sizeof(processinfo);

  snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  if (snapshot == NULL) return false;

  bool status = Process32First(snapshot, &processinfo);

  while(status)
  {
    GetFileName(FileName, processinfo.szExeFile);

    if(lstrcmpi(EXENAME, FileName) == 0)
    {
      *PID = processinfo.th32ProcessID;
      CloseHandle(snapshot);
      return true;
    }
    status = Process32Next(snapshot, &processinfo);
  }
  CloseHandle(snapshot);
  return false;
}
//---------------------------------------------------------
BOOL TForm1::GetMemory(DWORD emPROCESS_ID, DWORD emMEM_ADDRESS, LPVOID emMEM_BUF, DWORD emMEM_MAX)
{
  HANDLE emHPROCESS;
  if((emHPROCESS = OpenProcess(PROCESS_ALL_ACCESS, TRUE, emPROCESS_ID)) == NULL)
  {
    ShowMessage("OpenProcess");
    return false;
  }

  if(!ReadProcessMemory(emHPROCESS, (LPVOID)emMEM_ADDRESS, emMEM_BUF, emMEM_MAX, NULL))
  {
    CloseHandle(emHPROCESS);
    ShowMessage("ReadProcessMemory");
    return false;
  }
  CloseHandle(emHPROCESS);
  return true;
}
//----------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  DWORD PROCESSID;
  int Count;

  // GetProcess pobiera numer procesu w oparciu o jego nazwę

  if(!GetProcess(&PROCESSID, "mój program.exe"))
  {
    ShowMessage("Proces nie istnieje")
    return;
  }

  /* GetMemory pobiera numer prpocesu ze zmiennej PROCESSID,
     adres, bufor, maksymalna długość adresu */


  if(!GetMemory(PROCESSID, 0xCFEDE0, (LPVOID)&Count, 4))
  {
    ShowMessage("Błąd odczytu");
    return;
  }

  Edit1->Text = IntToStr(Count);
}
//---------------------------------------------------------
 

Musisz się jednak dobrze w tym orientować inaczej nie przetworzysz tego kodu, a mi nie chce się tego wszystkiego tłumaczyć, bo kod jest zbyt długi.
Może wystąpić problem z określeniem adresu, gdyż musi on mieć postać 0x...... a nie CFEDE0, czyli powinno być 0xCFEDE0, chyba, gdyż mogę się mylić...

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
moderasura
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: odczyt z bloku pamięci ram

Nowy postprzez zeno32167 » piątek, 21 listopada 2008, 17:04

uch rzeczywiscie kod dlugi, tak to bedzie 0xCFEDE0

ale jakoś pogoglowałem i sobie poradziłem, oto sposób jakby ktoś kiedyś chciał skorzystać:

KOD cpp:     UKRYJ  
HWND hwnd = FindWindow(NULL,"NazwaOkna");             // pobieramy uchwyt do okna
 DWORD pid;
 HANDLE hProcess ;
 if(hwnd)
 {
 GetWindowThreadProcessId(hwnd, &pid);           // pobieramy proces ID i przekazujemy do pid
 hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);   // dajemy dostep do procesu
 }
 
/*...*/ // kod czytajacy z pamieci
 DWORD bytes;           // tutaj bedzie zawarta liczba ile bajtow zostalo odczytane z bloku
 char buff[32];                    // akurat dla odczytu stringa z pamięci
 void *addr;
 addr = (void*)0xCFEDE0;                              // adres pamięci ktory chce przeczytac
 ReadProcessMemory(hProcess, addr, &buff, 32, &bytes);    // czytamy 32 bajty z tego bloku pamięci
 
// i nasza tablica buff[32] zawiera 32 pierwsze znaki z tego bloku pamięci
 
Avatar użytkownika
zeno32167
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 30 sierpnia 2008, 17:15
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: odczyt z bloku pamięci ram

Nowy postprzez moderasura » sobota, 31 grudnia 2011, 02:40

Witam.
Nadają się te kody do odczytu z pamięci wartości zmiennych i wyświetlenie ich w polach Edit. Oczywiście znając odpowiednie adresy.
Wyszperałem taki kod czytania z pamięci i zapisu ale coś on mi nie idzie pewnie trzeba coś includować np memory ale tez z tym nie szło w temat chyba trafilem :x

KOD cpp:     UKRYJ  
//znajdowanie okna, otwieranie procesu....

HWND hwnd;

hwnd = FindWindow(NULL, "Diablo II");
DWORD pid;
if(hwnd)
{
   GetWindowThreadProcessId(hwnd, &pid);
   hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
}
if(hProcess == NULL)
    {
       Label3->Caption = "Nienaleziono Diablo";
       return;
    }
    else
    {
       Label3->Caption = "Znaleziono Diablo";
    }
DWORD bytes;
long buff;
void *addr;
addr = (void*)0xB51C10; // adres ktory chce przeczytac
ReadProcessMemory(hProcess, addr, &buff, 4, &bytes);
Label5->Caption = buff;

//Odczytanie
DWORD bytes;
long buff;
void *addr;
addr = (void*)0xB51C10; // adres do którego zapisuje
ReadProcessMemory(hProcess, addr, &buff, 4, &bytes);
Label5->Caption = buff;

//zapisanie
DWORD bytes;
long buff2 = StrToFloat(Edit1->Text);
void *addr;
addr = (void*)0xB51C10;
WriteProcessMemory(hProcess, addr, &buff2, 4, &bytes);
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: odczyt z bloku pamięci ram

Nowy postprzez Cyfrowy Baron » sobota, 31 grudnia 2011, 09:24

moderasura napisał(a):pewnie trzeba coś includować


Chcesz włączyć bibliotekę, więc kod się nie kompiluje, czy też się kompiluje, ale wyskakują błędy?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: odczyt z bloku pamięci ram

Nowy postprzez moderasura » sobota, 31 grudnia 2011, 16:37

Wyskakuje cała masa błędów wkleję tu to co mi wywala, a tym czasem posiedzę nad tym może w końcu uda sie go skompilować :oops:
dodalem tez to
#include <tlhelp32.h>
#include <memory>
ale to nic nie zmienia.
Ostatnio edytowano wtorek, 3 stycznia 2012, 09:48 przez moderasura, łącznie edytowano 1 raz
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: odczyt z bloku pamięci ram

Nowy postprzez polymorphism » sobota, 31 grudnia 2011, 16:52

Ty chyba sobie żartujesz. Przecież wystarczy przeczytać treść błędów i już wiadomo, o co chodzi!

dodalem tez to
#include <tlhelp32.h>
#include <memory>
ale to nic nie zmienia.

A co ma zmienić? Poprawić błędy składniowe polegające na wielokrotnym definiowaniu zmiennych? Skąd Ty te nagłówki wziąłeś? Przecież wystarczy załączyć <windows.h> (to nie jest żadna wiedza tajemna, to jest wiedza wzięta z dokumentacji, z opisu użytych przez Ciebie funkcji).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: odczyt z bloku pamięci ram

Nowy postprzez moderasura » sobota, 31 grudnia 2011, 17:30

Pies drapał te moje znalezisko wykorzystam twój kod Baronie tylko nie wiem czy bedzie pasował do tego co chcę zrobić, czyli bobrać zmienną z pamięci i wczytać to w pole edit chodzi mi o float point :roll:
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: odczyt z bloku pamięci ram

Nowy postprzez Cyfrowy Baron » sobota, 31 grudnia 2011, 18:21

moderasura napisał(a):float point


Co to jest float point?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: odczyt z bloku pamięci ram

Nowy postprzez moderasura » sobota, 31 grudnia 2011, 18:32

Dokładnie chodziło mi o PlayerPositionMemoryPointer a nie float point :shock: jak zwykle coś pokręciłem :lol:
Ostatnio edytowano wtorek, 3 stycznia 2012, 09:46 przez moderasura, łącznie edytowano 1 raz
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: odczyt z bloku pamięci ram

Nowy postprzez Cyfrowy Baron » sobota, 31 grudnia 2011, 20:48

Nie rozumiem jednak jaki masz problem z wpisaniem zmiennej typu float do obiektu typu TEdit?!?

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
moderasura
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: odczyt z bloku pamięci ram

Nowy postprzez moderasura » poniedziałek, 2 stycznia 2012, 15:22

Ok spoko poradziłem sobie jakoś Wpakowałem to do Timer

Jeszcze pozostało mi wykombinować tak by dało sie więcej adresów przetwarzać nie wiem czy dobrym rozwiązaniem będzie wykorzystac kilka Timerów czy to upakować do jednego

Po kilku modyfikacjach kodu program działa prawie rewelacyjnie :geek:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
DWORD PROCESSID;
  float a;
  //int Count;
  // GetProcess pobiera numer procesu w oparciu o jego nazwę

  if(!GetProcess(&PROCESSID, "acg3x.exe"))

  {
    ShowMessage("Proces nie istnieje") ;

   return;


   }


  /* GetMemory pobiera numer prpocesu ze zmiennej PROCESSID,
     adres, bufor, maksymalna długość adresu */


  if(!GetMemory(PROCESSID, 0xadres, (LPVOID)&a, 4))
  {
    ShowMessage("Błąd odczytu");

    return;
  }

  Edit1->Text = float(a);
}
//---------------------------------------------------------------------------
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: odczyt z bloku pamięci ram

Nowy postprzez kraz3 » poniedziałek, 16 stycznia 2012, 11:07

Próbowałem tym sposobem i dalej mam problem z odczytem.Dzięki za podpowiedz.Czy tak ma wyglądać plik unit1.h ?.

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TEdit *Edit1;
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
private:        // User declarations
public:         // User declarations
        __fastcall TForm1(TComponent* Owner);
     void TForm1::GetFileName(char *emFILE_NAME, char *emFILE_PATH);
     bool TForm1::GetProcess(DWORD *PID, char *EXENAME);
     BOOL TForm1::GetMemory(DWORD emPROCESS_ID, DWORD emMEM_ADDRESS,
     LPVOID emMEM_BUF, DWORD emMEM_MAX);

};

//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Chciałem odczytać adres 0x41CF10 z procesu Guicheckers tak:

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  DWORD PROCESSID;
  float a;
  //int Count;
  // GetProcess pobiera numer procesu w oparciu o jego nazwę

  if(!GetProcess(&PROCESSID, "Guicheckers.exe"))

  {
    ShowMessage("Proces nie istnieje") ;

   return;


   }


  /* GetMemory pobiera numer prpocesu ze zmiennej PROCESSID,
     adres, bufor, maksymalna długość adresu */


  if(!GetMemory(PROCESSID, 0x41CF10, (LPVOID)&a, 4))
  {
    ShowMessage("Błąd odczytu");

    return;
  }

  Edit1->Text = float(a);

}

//---------------------------------------------------------------------------
 

I wyświetla mi takie komunikaty:

[Linker Error] Unresolved external 'TForm1::GetProcess(unsigned long *, char *)' referenced from C:\DOCUMENTS AND SETTINGS\BABKA\PULPIT\ODCZYT PAMIĘCI W BORLAND\UNIT1.OBJ
[Linker Error] Unresolved external 'TForm1::GetMemory(unsigned long, unsigned long, void *, unsigned long)' referenced from C:\DOCUMENTS AND SETTINGS\BABKA\PULPIT\ODCZYT PAMIĘCI W BORLAND\UNIT1.OBJ



Co jest nie tak?,proszę o podpowiedz.
Ostatnio edytowano poniedziałek, 16 stycznia 2012, 11:11 przez kraz3, łącznie edytowano 1 raz
Avatar użytkownika
kraz3
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): sobota, 14 stycznia 2012, 20:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: brak kompilatora
Gadu Gadu: 0
    Windows XPInternet Explorer 8

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 32 gości