Ho un problema con le deviazioni. Le deviazioni, come tutti sapete, possono muoversi solo tra 5 byte di spazio (cioè una chiamata "jmp" e un indirizzo a 4 byte). Per questo motivo è impossibile avere la funzione 'hook' in una classe (un metodo), non è possibile fornire il puntatore 'this' perché semplicemente non c'è abbastanza spazio (here's il problema è spiegato più a fondo). Quindi sono stato di brainstorming tutto il giorno per una soluzione, e ora voglio i tuoi pensieri sull'argomento quindi non inizierò un progetto di 3-5 giorni senza sapere se sarebbe possibile o meno.Funzioni dinamiche C++ e FULLY
Avevo inizialmente 3 obiettivi, volevo che le funzioni di "hook" fossero metodi di classe, volevo che l'intero approccio fosse orientato agli oggetti (nessuna funzione statica o oggetti globali) e, la parte peggiore/più difficile, essere completamente dinamico. Questa è la mia (in teoria) soluzione; con l'assemblaggio è possibile modificare le funzioni in fase di esecuzione (un esempio perfetto è qualsiasi metodo di deviazione). Quindi, dato che posso modificare le funzioni in modo dinamico, non dovrei anche essere in grado di crearle dinamicamente? Per esempio; Alloco memoria per, diciamo ~ 30 byte (tramite malloc/new). Non sarebbe possibile sostituire solo tutti i byte con numeri binari corrispondenti a diversi operatori di assembly (come 0xE9 è 'jmp') e quindi chiamare direttamente l'indirizzo (poiché conterrebbe una funzione)?
NOTA: conosco in anticipo il valore restituito e tutti gli argomenti per tutte le funzioni che voglio deviare, e poiché sto usando GCC, la convenzione thiscall è praticamente identica a quella _cdecl.
Quindi questo è il mio pensiero/prossima implementazione; Creo una classe 'Funzione'. Questo costruttore prende una quantità variabile di argomenti (tranne il primo argomento, che descrive il valore di ritorno della funzione obiettivo).
Ogni argomento è una descrizione degli argomenti che l'hook riceverà (la dimensione e se si tratta di un puntatore o meno). Quindi diciamo che voglio creare una classe Function per un int * RandomClass::IntCheckNum(short arg1);
. Quindi dovrei solo fare questo: Function func(Type(4, true), Type(4, true), Type(2, false));
. Dove "Tipo" è definito come Type(uint size, bool pointer)
. Quindi attraverso l'assemblea potrei creare dinamicamente la funzione (nota: si userebbe tutta la convenzione di chiamata _cdecl) poiché posso calcolare il numero di argomenti e la dimensione totale.
EDIT: Con l'esempio, Type(4, true)
è il valore di ritorno (int *), il scond Type(4, true)
è la RandomClass 'questo' puntatore e Type(2, false)
descrive il primo argomento (breve arg1).
Con questa implementazione potrei facilmente avere i metodi di classe come callback, ma richiederebbe una grande quantità di codice assembly (che non sono nemmeno particolarmente esperto in). Alla fine, l'unica cosa non dinamica sarebbero i metodi nella mia classe di callback (che richiederebbe anche callback pre e post).
Quindi volevo sapere; È possibile? Quanto lavoro richiederebbe e sono sopra la mia testa qui?
EDIT: Mi dispiace se ho presentato tutto un po 'confuso, ma se c'è qualcosa che vuoi più accuratamente spiegato, chiedi!
EDIT2: Vorrei anche sapere se riesco a trovare da qualche parte i valori esadecimali per tutti gli operatori di assemblaggio? Una lista aiuterebbe una tonnellata! E/o se è possibile in qualche modo "salvare" asm (""); codice ad un indirizzo di memoria (che dubito fortemente).
Perché usare le deviazioni? Non puoi usare una soluzione C++ pura come 'std :: function' o mi manca qualcosa? –
Non come se potessi aiutarti solo a chiarire le cose. Vuoi una funzione riscrivibile in una classe? (Voglio dire, puoi cambiarli in fase di esecuzione) Se è così penso che (quando fatto) potrebbe eventualmente aprire enormi opportunità per la programmazione AI in C++. +1 – akaltar
@akaltar Questo è noto come [programmazione genetica] (http://en.wikipedia.org/wiki/Genetic_programming) e in realtà non ha bisogno di funzioni riscrivibili. –