Domanda Classe per leggere Bytes in un array

Stato
Discussione chiusa ad ulteriori risposte.

xXStephXx

Utente Electrum
28 Aprile 2008
389
16
1
125
Questa classe può essere utile a chi deve scrivere sul gamecode di un gioco, e riprodurre gli array di bytes in C++ o C#
Se voi scrivete una 70ina di bytes tutti di fila xD Sarà difficile ricopiare tutto manualmente e spesso si possono fare errori di copiatura che causano crash inspiegati durante l'esecuzione..

Questa classe legge i bytes dato un inizio e una fine dai voi scelto, e stampa l'array in C++ syntax su un file .txt presente nella cartella del file.

Processo.h
Codice:
#include <iostream>
#include <windows.h>
#include <fstream>
#include <stdlib.h>

using namespace std;
class Processo
{
     private:
        HANDLE hProcess;
        BYTE* array;
        int size;
              
      public:
        Processo(char*);
        ~Processo();
        void StampaArray(char* nome);
        void OttieniBytes(DWORD inizio, DWORD fine);
        
};

Processo::Processo(char* nome_wind)
{
     HWND hWnd = FindWindow(0, nome_wind);
     DWORD proc_id;
     GetWindowThreadProcessId(hWnd, &proc_id);
     if(!proc_id)
     {
      MessageBox(NULL, "Processo non trovato", "ERRORE", MB_OK | MB_ICONERROR);
      return;
     }
     hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, proc_id);
}
   
    Processo::~Processo()
    {
                         delete array;
} 
void Processo::OttieniBytes(DWORD inizio, DWORD fine)
{
    
     if(fine <=inizio)return ;
     array = new BYTE[fine-inizio];
     size= fine-inizio;
     
     
     ReadProcessMemory(hProcess, (LPVOID)inizio, array, size, NULL);
     
        
        
     
}


void Processo::StampaArray(char* nome)
{   char* valore;
    ofstream file;
    file.open("ArrayOfBytes.txt", ios_base::app);
    file << "\n BYTE "<<nome<<"[] = {";
    for(int i = 0; i < size; i++)
    {
            if(i!= size-1)
           file << (WORD*)*(array+i) <<",";
           else
           file << (WORD*)*(array+i) <<"};\n";
}
}

Adesso vediamo come applicarla..
Mettiamo che su CE avete fatto il pick up in asm e lo volete riportare brevemente in C++

main.cpp

Codice:
#include "Processo.h"

using namespace std;

int main()
{
Processo* p = new Processo("METIN2"); //creo un'istanza alla classe per il processo metin2
p->OttieniBytes(0x005FF533, 0x005FF54F); //leggo i bytes del code-cave
p->StampaArray("FUNC"); //stampo l'array col nome di FUNC
p->OttieniBytes(0x004339C0, 0x004339C6); //leggo i bytes dello jmp
p->StampaArray("JMP"); //stampo l'array col nome di JMP su ArrayOfBytes.txt
delete p;


cin.get();

 
}


N.B nella funzione OttieniBytes, va messo l'address iniziale e l'address successivo a quello dove finisce la funzione


Questo è l'output su ArrayOfBytes.txt


Codice:
//ArrayOfBytes.txt
BYTE FUNC[] = {0x60,0x8b,0x48,0xc,0x51,0x8b,0xd,0xc8,0x4f,0x5f,0,0xe8,0xed,0xea,0xe1,0xff,0x61,0x55,0x8b,0xec,0x83,0xec,0x44,0xe9,0x77,0x44,0xe3,0xff};

 BYTE JMP[] = {0xe9,0x6e,0xbb,0x1c,0,0x90};
 
Ultima modifica:
Però devo dire che ho provato a gestire un po' di errori, ma non sono riuscito... Per esempio.. In teoria se non trova il processo dovrebbe stampare un messaggio di errore ( che non viene stampato ). Poi se l'address dal quale iniziare la lettura è maggiore di quello dal quale finirla.. nella funzione ho messo return.. Il problema è che non ritorna xD Si limita solo a dare errore runtime.

Però a questo secondo problema, potrei rimediare facendo una cosa del genere

Codice:
if (inizio > fine)
{
tmp = inizio;
inizio = fine; 
fine = tmp;

}
 
Stato
Discussione chiusa ad ulteriori risposte.