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
Adesso vediamo come applicarla..
Mettiamo che su CE avete fatto il pick up in asm e lo volete riportare brevemente in C++
main.cpp
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
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};