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

odczyt z bloku pamięci ram

dział ogólny

Re: odczyt z bloku pamięci ram

Nowy postprzez Cyfrowy Baron » poniedziałek, 16 stycznia 2012, 16:24

Być może to błąd ze zmiennymi, jeżeli korzystasz z środowiska 2009 lub nowszego. Uzupełnij profil, by było wiadomo w jakim środowisku programujesz,
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 » wtorek, 17 stycznia 2012, 02:45

kraz3 napisał(a):
Co jest nie tak?,proszę o podpowiedz.


A gdzie reszta kodu ?
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 » wtorek, 17 stycznia 2012, 11:09

Cyfrowy Baron napisał(a):Być może to błąd ze zmiennymi, jeżeli korzystasz z środowiska 2009 lub nowszego.

No, Baron, przecież z treści błędu widać, że nie chodzi o żadne zmienne, tylko o brak definicji metod GetProcess i GetMemory.

kraz3, definicja tych metod znajduje się tu -> link
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 Cyfrowy Baron » wtorek, 17 stycznia 2012, 16:00

polymorphism napisał(a):No, Baron, przecież z treści błędu widać, że nie chodzi o żadne zmienne, tylko o brak definicji metod GetProcess i GetMemory.


Masz rację! :? Skupiłem uwagę na deklaracjach funkcji w pliku nagłówkowym i wogóle nie zwróciłem uwagi na fakt, że brak jest definicji tych funkcji w pliku źródłowym. To dlatego, że na ogół definicje są, a często brak deklaracji.
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 kraz3 » środa, 18 stycznia 2012, 17:51

Nie uzupełniałem profilu,ponieważ nie jestem programistą.Wcelach edukacyjnych zainteresowałem się tematem i nie mogę sobie poradzić.Po dopisaniu definicji tych funkcji do pliku,mam teraz jeszcze więcej błędów.Czy jest ktoś kto mógłby ten plik poprawić?.Próbuję to kompilolwać w Borland versja 6.
Plik wygląda 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 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;
  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 procesu 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);

}

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


A błędy tak:


Build
[C++ Error] Unit1.cpp(35): E2451 Undefined symbol 'PROCESSENTRY32'
[C++ Error] Unit1.cpp(35): E2379 Statement missing ;
[C++ Error] Unit1.cpp(37): E2451 Undefined symbol 'processinfo'
[C++ Error] Unit1.cpp(37): E2109 Not an allowed type
[C++ Error] Unit1.cpp(39): E2268 Call to undefined function 'CreateToolhelp32Snapshot'
[C++ Error] Unit1.cpp(39): E2451 Undefined symbol 'TH32CS_SNAPPROCESS'
[C++ Error] Unit1.cpp(39): E2034 Cannot convert 'int' to 'void *'
[C++ Error] Unit1.cpp(43): E2268 Call to undefined function 'Process32First'
[C++ Error] Unit1.cpp(55): E2268 Call to undefined function 'Process32Next'

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

Re: odczyt z bloku pamięci ram

Nowy postprzez Cyfrowy Baron » środa, 18 stycznia 2012, 18:35

kraz3 napisał(a):Nie uzupełniałem profilu,ponieważ nie jestem programistą.


A co to ma do rzeczy. Domyślam się tylko, że używasz wersji TRIAL środowiska i z tego powodu odczuwasz obawy przed podaniem tej informacji w profilu, ale nikt nie jest w stanie tego sprawdzić, a z tego co się już zorientowałem, to 90% użytkowników tego forum jest w tym samym położeniu co Ty.

Dane odnośnie wersji środowiska są potrzebne do udzielenia precyzyjnej odpowiedzi, gdyż zmiany pomiędzy wersjami przed C++Builder 2009 i po są na tyle duże, że kod ze starszych wersji nie skompiluje się w nowszych wersjach.



Co się tyczy błędów, to w sekcji include musisz włączyć bibliotekę: #include <tlhelp32.h>, czyli:

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

#include <tlhelp32.h> // <-- TUTAJ

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
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 » środa, 18 stycznia 2012, 22:26

Tu masz skompilowany kod programu wraz z projektem w wersji C++Builder 6 ;)
Jeśli masz poprawny adres to w polu Edit1 powinna pojawić się liczba zmiennoprzecinkowa 8-)
Ty masz podpięte to pod Button ja to zrobiłem w Timer i na bieżąco wyświetla się float tylko tyle ze potrzebowałem to do respawnu z pewnej gry
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
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 » czwartek, 19 stycznia 2012, 18:18

Witam,właśnie o taki projekt mi chodziło,byłem blisko,tylko brakowało tej deklaracji #include <tlhelp32.h>.Pozwoliłem sobie odczytywać w tym projekcie dane z pamięci do buforu i skorygowałem adres w pamięci w następujący sposób:

KOD cpp:     UKRYJ  
//----------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  DWORD PROCESSID;
  float a;
  char buff[13];
  //int Count;
  // GetProcess pobiera numer procesu w oparciu o jego nazwę

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

  {
    ShowMessage("Proces nie istnieje") ;

   return;
   }

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


  if(!GetMemory(PROCESSID, 0x41CF18, (LPVOID)&buff, 13))
  {
    ShowMessage("Błąd odczytu");

    return;
  }
  Edit1->Text = buff;
  //Edit1->Text = float(a);

}
//---------------------------------------------------------------------------


Projekt odczytuje dane,ale jest mały problem,spodziewałem się,że odczyta np. Ruch 22-18 ,a odczytuje tak: Ruch %d%c%d sądzę,że proces gry w czasie wyświetlania tego ruchu podstawia dane ruchu pod te %d%c%d i raczej z tym będzie problem,to wyższa filozofia aby dobrać się do tych podstawianych danych i jest to odrębny temat .Będę próbował coś zrobić w tym temacie,choć nie bardzo wiem jak.Proszę jeszcze o przykład jak taki projekt działa z Timerem,tak aby automatycznie co kilka czy kilkanaście sekund aktualizował odczyt.Dzięki za podpowiedzi jak i uwagi.
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

Re: odczyt z bloku pamięci ram

Nowy postprzez moderasura » czwartek, 19 stycznia 2012, 22:30

To ci raczej nic nie da bo chyba pobiera ten adres z pliku exe a to ma pobierać z pamięci, to w pamięci dopiero przetwarza konkretne dane tak mi się wydaje
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 » piątek, 20 stycznia 2012, 18:10

Witam! Chyba masz rację ten odczyt jest z pliku *.exe. Temat bardzo mnie interesuje, próbowałem odczytywać ten adres projektem w Delphi ver 7, odczyt identyczny. Zastanawiam się jak, a raczej jakim programem można śledzić działanie aplikacji w pamięci i później odczytać interesującą zmienną. Szukam czegokolwiek na ten temat w sieci. Poniżej kod w Delphi, może ktoś będzie chciał wypróbować. Dla mnie jest bardziej zrozumiały niż w C++.

KOD cpp:     UKRYJ  
//------------------------------------------------------------------------
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetGuicheckersFileName: string;
var
  TempStr : string;
  Guicheckers_HWND, TempHandle : THandle;
  Dat2 : array[0..13] of Char;
  Temp, MPointer : cardinal;
begin
  Result := '';
  Guicheckers_HWND := FindWindow('CheckClass', nil);
  if Guicheckers_HWND <> 0 then
  begin
  MPointer := ($41CF18);
  GetWindowThreadProcessId(Guicheckers_HWND, TempHandle);
  Guicheckers_HWND := OpenProcess(PROCESS_ALL_ACCESS, False, TempHandle);
  ReadProcessMemory(Guicheckers_HWND, Pointer(MPointer), @Dat2, 13, Temp);
  CloseHandle(Guicheckers_HWND);
  TempStr := Dat2;
  Result := TempStr;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

   Edit1.Text := GetGuicheckersFileName;

end;

end.
//------------------------------------------------------------------------
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

Re: odczyt z bloku pamięci ram

Nowy postprzez moderasura » piątek, 20 stycznia 2012, 22:07

Do grzebania w pamięci polecam program (TSearch) To jest jeden z najlepszych programów lub Cheat Engine 5.6.Z ciekawości próbowałem znaleźć adres ale bez powodzenia.Inne adresy bez problemu znalazłem i wprowadziłem to do programu i działa.Zaopatrz się w kod do tej gry napisany jest w visual c++. zawarte kody w tym temacie działają na 100% i zmiana na inne jezyki programowania nic nie da, trzeba znaleźć ten odpowiedni adres i wprowadzić to do tego kodu i musi działać nie ma bata.

Sprawdziłem te adresy i doszedłem do wniosku ze dla każdego pola na planszy jest przypisany dany adres, co gorsza nie ma wspólnego adresu do wszystkich pozycji na planszy to wszystko się zmienia jak w kalejdoskopie, są 32 pola i do każdego z nich jest inny adres czyli 32 adresy trzeba postawić jakieś pułapki i może uda się wyłapać ten stały adres innej możliwości nie ma :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 kraz3 » niedziela, 22 stycznia 2012, 14:42

Witam, zgadza się, adresy zmiennej ruchu zmieniają się jak światełka na choince. Inaczej mówiąc mają zdolność relokowania w pamięci, więc odczyt stałego adresu nie ma sensu. Mam kod do tej gry w wersji 105 i 110, ten 110 nie chce się skompilować. Sygnalizuje błąd otwarcia pliku 'afxres.h'. Posiedzę nad wesją 105, choć to kolejna nowa platforma programowania. Rozwiązaniem jest dopisanie instrukcji króra zapisze pod stałym adresem w pamięci zmienną ruchu lub wysłanie tej zmiennej przez port RS232. Port byłby najlepszym rozwiązaniem, jestem w stanie oprogramować elektronikę o krórej pisałem na 'pw' tak aby czekała na znaki wysłane przez port. Szukam jak napisać jedno i drugie w Visual C++.
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

Re: odczyt z bloku pamięci ram

Nowy postprzez moderasura » piątek, 3 lutego 2012, 19:58

Witam mógł by mi ktoś doradzić lub wytłumaczyć dlaczego nie mogę zapisywać znaków lub liter wpisywanych w polu EDIT1 i zapisanie to w pamieci pod odpowiednim adresem tzn coś tam mi zapisuje ale to są jakieś bazgroły, a chciał bym wpisać dowolny znak z klawiatury do pamieci pod adresem

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button2Click(TObject *Sender)
{

String znak;

 HWND hWnd = FindWindow(NULL, "program");
    DWORD PROCESSID;

    if (!hWnd) {
 }
    else {
        DWORD pID;
        GetWindowThreadProcessId(hWnd, &pID);

        HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, NULL, pID);
        if (!hProc) {

        }


      znak= AnsiString(Edit1->Text);




        WriteProcessMemory(hProc, (void*)0x6D53A0, (void *)&znak, 1, 0);
        return;
    }
 }
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 » piątek, 3 lutego 2012, 21:20

Jeśli wysyłasz znak, to dlaczego podajesz wskaźnik na obiekt klasy String?

Jeśli już, to tak:
KOD cpp:     UKRYJ  
WriteProcessMemory(hProc, (void*)0x6D53A0, (void *) znak.c_str(), 1, 0);
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
moderasura
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 » piątek, 3 lutego 2012, 21:30

Dzięki za wskazówkę cały czas kombinowałem z konwersja a tum masz :? Oczywiście porada jak zawsze skuteczna pozdrawiam i jeszcze raz wielkie dzięki ;)
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

Poprzednia stronaNastę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 8 gości