Avatar billede quiw Nybegynder
17. november 2008 - 21:24 Der er 13 kommentarer og
1 løsning

Read from Memory

Hejsa eksperter, jeg har læst lidt på msdn omkring readmemory, og kom frem med følgende kode:

#include <iostream>
#include <windows.h>
#include <psapi.h>

using namespace std;

int ReadMemory(char *Caption, long address)
{
    int output; //Variablen til outputtet
   
    DWORD PROC_ID; //Variablen til at indeholde vindue ID
    HANDLE PROC_HANDLE; //Variablen til at indeholde handle
   
    GetWindowThreadProcessId(FindWindow(NULL, (LPCTSTR)Caption), &PROC_ID); // Finder ID fra vindue ved navn xx
    PROC_HANDLE = OpenProcess(PROCESS_ALL_ACCESS, false, PROC_ID); //Finder handle ud fra ID
    ReadProcessMemory(PROC_HANDLE, Caption, &output, sizeof(output), 0); //Læser fra Adressen, i det givne handle
    CloseHandle(PROC_HANDLE); //Afslutter handle
    return output; // Returnerer outputtet
}


int main()
{
  cout << "Output fra test33: "<<ReadMemory("test33",0x23ff74)<<"\n";
  system("pause");
  return 0;
}

Jeg har lavet et yderligere program, ved navn test33, hvor addressen 0x23ff74 indeholder tallet: 452452, men når jeg forsøger at læse, får jeg blot outputtet: 1953719668

Det stemmer jo ikke helt, er det nogle der kan hjælpe mig med at finde fejlen?
Avatar billede bertelbrander Novice
17. november 2008 - 22:03 #1
Jeg tror det skal være:
SIZE_T BytesRead = 0;
ReadProcessMemory(Proc, &address, &output, 4, &BytesRead);
Avatar billede quiw Nybegynder
17. november 2008 - 22:12 #2
Hm, jeg har tilføjet til koden, og ja, jeg får et nærmere resultat, jeg får nu: 4456486
- Men det er stadig ikke det præcise resultat.

Følgende kode ser nu således ud:
#include <iostream>
#include <windows.h>
#include <psapi.h>

using namespace std;

int ReadMemory(char *Caption, long address)
{
    int output; //Variablen til outputtet
   
    DWORD PROC_ID; //Variablen til at indeholde vindue ID
    HANDLE PROC_HANDLE; //Variablen til at indeholde handle
    SIZE_T BytesRead = 0;
   
    GetWindowThreadProcessId(FindWindow(NULL, (LPCTSTR)Caption), &PROC_ID); // Finder ID fra vindue ved navn xx
    PROC_HANDLE = OpenProcess(PROCESS_ALL_ACCESS, false, PROC_ID); //Finder handle ud fra ID
    ReadProcessMemory(PROC_HANDLE, &address, &output, 4, &BytesRead); //Læser fra Adressen, i det givne handle
    CloseHandle(PROC_HANDLE); //Afslutter handle
    return output; // Returnerer outputtet
}


int main()
{
  cout << "Output fra test33: "<<ReadMemory("test33",0x23ff74)<<"\n";
  system("pause");
  return 0;
}
Avatar billede quiw Nybegynder
17. november 2008 - 22:14 #3
Og dog, hvis jeg ændre variablen i test33 til f.eks. 10, så får jeg stadig outputtet 4456486.
Avatar billede bertelbrander Novice
17. november 2008 - 22:20 #4
Jeg tror du skal tilføje noget fejlcheck.
Hvad bliver BytesRead sat til?
Hvad returnerer ReadProcessMemory
Bliver PROC_HANDLE sat til noget fornuftigt?
Avatar billede quiw Nybegynder
17. november 2008 - 22:32 #5
Min kode ser nu således ud:

#include <iostream>
#include <windows.h>
#include <psapi.h>

using namespace std;

int ReadMemory(char *Caption, long address)
{
    int output; //Variablen til outputtet
   
    DWORD PROC_ID; //Variablen til at indeholde vindue ID
    HANDLE PROC_HANDLE; //Variablen til at indeholde handle
    SIZE_T BytesRead = 0; //Variabel til antal læste bytes.
   
    if(!GetWindowThreadProcessId(FindWindow(NULL, (LPCTSTR)Caption), &PROC_ID)){ // Finder ID fra vindue ved navn xx
          cout << "#Fejl, ikke finde process ID! \n";                             
    }
   
    PROC_HANDLE = OpenProcess(PROCESS_ALL_ACCESS, false, PROC_ID); //Finder handle ud fra ID
   
    if(!ReadProcessMemory(PROC_HANDLE, &address, &output, 4, &BytesRead)){ //Læser fra Adressen, i det givne handle
          cout << "#Fejl, kunne ikke læse fra memory! \n";
    }
    if(!CloseHandle(PROC_HANDLE)){ //Afslutter handle
          cout << "#Fejl, kunne ikke lukke handle korrekt! \n";
    }
    cout << "#Handle    : "<<PROC_HANDLE<<"\n";
    cout << "#BytesRead  : "<<BytesRead<<"\n\n";
    return output; // Returnerer outputtet
}


int main()
{
  cout << "Output fra test33: "<<ReadMemory("test33",0x23ff74)<<"\n";
  system("pause");
  return 0;
}


Og får følgende output:

#Handle    : 0x34
#BytesRead  : 4

Output fra test33: 4456486

- Jeg får ingen fejlmeddelelser ..
Avatar billede bertelbrander Novice
17. november 2008 - 22:58 #6
Prøv at poste koden til test33
Avatar billede quiw Nybegynder
17. november 2008 - 23:00 #7
koden til test33.exe:

#include <iostream>
#include <windows.h>


using namespace std;

int main(){
    int c = 10;
   
    SetConsoleTitle("test33");

    cout << "Adresse af c "<<&c<<", indhold af c: "<<c<<" \n";
    system("pause");
    return 0;
}
Avatar billede quiw Nybegynder
19. november 2008 - 14:44 #8
bertelbrander? :)
Avatar billede bertelbrander Novice
19. november 2008 - 19:22 #9
Jeg kan ikke umiddelbart få det til at virke, har ikke rigtigt haft tid til at studere det nærmere. Jeg kikker på det senere.
Avatar billede quiw Nybegynder
19. november 2008 - 19:41 #10
Det sætter jeg pris på :)
Avatar billede bertelbrander Novice
19. november 2008 - 23:18 #11
Der er to problemer.

Først, der hvor du kalder ReadProcessMemory skal det være:
if(!ReadProcessMemory(PROC_HANDLE, (int *)address, &output, 4, &BytesRead))
DVS ikke &address men address skal castes til en int*

Det næste problem er at den process du får fat i med din metode ikke er den rigtige, det er cmd.exe du får fat i. Hvis du læser fra et Windows GUI program er der ikke nogen problemer, hvis det er et konsol program du skal læse fra, skal vi finde en anden metode til at finde den rigtige process.
Avatar billede quiw Nybegynder
19. november 2008 - 23:55 #12
Altså, nu virker det, du har ret, det skal være int*.
- Men, det du mener er, at mit konsolproram bliver åbnet, underlagt cmd.exe? men det ser ud til at virke, på trods af at det er et konsol program :)

Takker mange gange, du må endelig smide et svar :)
Avatar billede bertelbrander Novice
20. november 2008 - 00:02 #13
Jeg er ikke en af dem der smider om sig med svar; jeg samler ikke på point.
Avatar billede quiw Nybegynder
20. november 2008 - 11:41 #14
Okay, jeg værdsætter ihvertfald din hjælp :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester