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?
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; }
Jeg tror du skal tilføje noget fejlcheck. Hvad bliver BytesRead sat til? Hvad returnerer ReadProcessMemory Bliver PROC_HANDLE sat til noget fornuftigt?
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; }
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.
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 :)
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.