Conversione di tipo char* a int*

di il
13 risposte

Conversione di tipo char* a int*

Salve ha tutti, ho riscontrato problemi nel convertire un indirizzo di memoria salvato in un char* ha convertirlo nel  indirizzo di memoria di un int*. 

Windows 10 

Visual Studio 2019

13 Risposte

  • Re: Conversione di tipo char* a int*

    Ciao, posta il tuo tentativo così possiamo darci un'occhiata e aiutarti a capire dove sia il problema.

    P.S.
    Il tuo nick non mi era nuovo, allora ho controllato e in effetti… =)

  • Re: Conversione di tipo char* a int*

    Qualcosa del genere?

    int a = 5;
    char *p = (char *)&a;

    P.S.  Fai attenzione a dove metti le h ….

  • Re: Conversione di tipo char* a int*

    16/02/2023 - Nippolo ha scritto:


    Ciao, posta il tuo tentativo così possiamo darci un'occhiata e aiutarti a capire dove sia il problema.

    P.S.
    Il tuo nick non mi era nuovo, allora ho controllato e in effetti… =)

    FILE* File = fopen(Pos_File, "r");
    	char Q[20];
    
    	if (File != NULL) {
    		fgets(Q, 20, File);
    		fclose(File);
    	}
    
    	char prova[] = "";
    
    	int len = std::strlen(Q);
    	for (int i = 0; i < len; i++) {
    		Q[i] = std::tolower(Q[i]);
    	}
    
    	strcat(prova, "0x");
    	strcat(prova, Q);

    prova contiene "0x000001b83a5d3e60"

    devo trasformarlo in un int*

    Primo tentativo:

    int* qwe = reinterpret_cast<int*>(prova)

    Secondo tentativo:

    string char_ptr(prova); // esempio di puntatore char*
    uintptr_t char_addr = reinterpret_cast<uintptr_t>(char_ptr.c_str()); // cast in uintptr_t
    int* int_ptr = reinterpret_cast<int*>(char_addr); // cast in int*
  • Re: Conversione di tipo char* a int*

    Sei fuori strada

    #include <iostream>
    #include <cstdlib>
    
    int main(){
        const char *hexstring = "0x000001b83a5d3e60";
        long long n = (long long)strtoll(hexstring, NULL, 16);
        long long *ptr = (long long *)n;
        std::cout << ptr;
    
        return 0;
    }
    
    
  • Re: Conversione di tipo char* a int*

    Ma quindi l'indirizzo è una stringa ASCII … e dopo averlo convertito che te ne fai? Non puoi certo utilizzarlo in un tuo programma.

    La cosa mi sa tanto di un tentativo di accesso alla memoria di qualche gioco … (cheat)

  • Re: Conversione di tipo char* a int*

    Non è come sembra questo codice mi serve per creare una sorta di comunicazione con un altro programma figlio utilizzando la ram per essere il più veloci possibili, proprio nella comunicazione ho riscontrato un problema di sicurezza e ho trovato readprocessmemory e writeprocessmemory qualcuno mi potrebbe gentilmente spiegare nel dettaglio come usarle?

  • Re: Conversione di tipo char* a int*

    Appunto, proprio quelle API sono comunemente utilizzate per i cheat. E il processo figlio è il gioco.

    ho riscontrato un problema di sicurezza

    Di cosa parli esattamente?

    In ogni caso, leggi la documentazione

    https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-readprocessmemory

    https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-writeprocessmemory

  • Re: Conversione di tipo char* a int*

    Questo è il codice:

    	FILE* File = fopen(Pos_File, "r");
    	char Q[20];
    
    	if (File != NULL) {
    		fgets(Q, 20, File);
    		fclose(File);
    	}
    
    	char prova[20] = "";
    
    	int len = std::strlen(Q);
    	for (int i = 0; i < len; i++) {
    		Q[i] = std::tolower(Q[i]);
    	}
    
    	strcat(prova, "0x");
    	strcat(prova, Q);
    
    	long long n = (long long)strtoll(prova, NULL, 16);
    	long long* ptr = (long long*)n;
    
    	CTR::Ind_C = reinterpret_cast<int*>(ptr);
    
    
    	printf("Valori degli elementi\n");
    	for (int i = 0; i < 20; i++)
    	{
    		printf("%6d%c", CTR::Ind_C[i], (i % 10 == 9) ? '\n' : ' ');
    	}

    L'errore viene generato dalla riga

    printf("%6d%c", CTR::Ind_C[i], (i % 10 == 9) ? '\n' : ' ');
    Eccezione generata in corrispondenza di 0x00007FF639EF76D2 in Process.exe: 0xC0000005: violazione di accesso durante la lettura del percorso 0x0000016927EB66D0.

    Questo è il programma figlio che deve andare a leggere un valore all'interno del programma padre

  • Re: Conversione di tipo char* a int*

    Stai tentando di utilizzare un indirizzo che in questo processo non è allocato/utilizzato.

    Ti ricordo che gli indirizzi di memoria sono relativi al processo in esecuzione. Non capisco da dove hai preso quell'indirizzo che vuoi utilizzare senza alcun senso.

    In ogni caso, mi sembra che il thread si sia completato con la risposta che hai avuto rispetto al problema che avevi posto nel titolo.

  • Re: Conversione di tipo char* a int*

    L'indirizzo è allocato dinamicamente tramite un malloc e l'indirizzo vene scritto all'intero di un file che viene letto dal secondo programma

  • Re: Conversione di tipo char* a int*

    Non hai letto bene … ogni processo ha i propri indirizzi che sono virtuali e mappati. 

    Anche due indirizzi IDENTICI puntano a dati DIVERSI in PROCESSI DIVERSI.

    Quell'indirizzo esiste per il programma che lo ha allocato ma NON per l'altro.

    Per accedere devi utilizzare le API indicate a cui devi passare l'handle del processo target.

    Oppure, se devono comunicare in memoria, puoi utilizzare le API per la gestione della memoria SHARED tra processi.

    O, più semplicemente, possono dialogare con un socket.

    Ma in questo thread siamo già OT

  • Re: Conversione di tipo char* a int*

    Ma comunque mi sembrano argomenti un pochino più complessi di quanto riesci ad affrontare ora. Purtroppo non esistono scorciatoie 

  • Re: Conversione di tipo char* a int*

    Concordo

Devi accedere o registrarti per scrivere nel forum
13 risposte