Ho lavorato a un progetto (C++), che richiede funzioni allocate dinamicamente, che significa malloc/new e mprotect e quindi modificare manualmente il buffer in codice assembly. Per questo motivo mi sono chiesto esattamente cosa è richiesto in questo "buffer", perché sia una replica di qualsiasi altra funzione _cdecl. Per esempio:Utilizzo di C++ con assembly per allocare e creare nuove funzioni in fase di esecuzione
int ImAcDeclFunc(int a, int b)
{
return a + b;
}
Se mi piacerebbe creare letteralmente un duplicato di questa funzione, ma completamente in modo dinamico, che cosa che richiedono (e ricordatevi che è C++ con linea montaggio)? Per cominciare, penso che avrei dovuto fare qualcosa di simile (o una soluzione simile):
// My main....
byte * ImAcDeclFunc = new byte[memory];
mprotect(Align(ImAcDeclFunc), pageSize, PROT_EXEC | PROT_READ | PROT_WRITE);
Dopo questo avrei dovuto scoprire il codice assembly per il ImAcDeclFunc(int a, int b);
. Ora sono ancora pessimo al montaggio, quindi come sarebbe questa funzione nella sintassi AT &? Ecco il mio tentativo audace:
push %ebp
movl %%ebp, %%esp
movl 8(%ebp), %%eax
movl 12(%ebp), %%edx
addl edx, eax
pop ebp
ret
Ora, se questo codice è corretto (che dubito fortemente, per favore correggetemi) farebbe Ho solo bisogno di trovare il valore di questo codice in esadecimale (ad esempio, 'JMP' è 0xE9 e ' inc 'è 0xFE) e usa questi valori direttamente in C++? Se continuo il mio precedente codice C++:
*ImAcDeclFunc = 'hex value for push'; // This is 'push' from the first line
*(uint)(ImAcDeclFunc + 1) = 'address to push'; // This is %ebp from the first line
*(ImAcDeclFunc + 5) = 'hex value for movl' // This is movl from the second line
// and so on...
Dopo che ho fatto questo per tutto il codice/tampone, quello sarebbe sufficiente per una funzione _cdecl completamente dinamico (cioè poteva ho appena gettato a un puntatore a funzione e fare int result = ((int (*)(int, int))ImAcDeclFunc)(firstArg, secondArg)
?). E io non sono interessato a usare il boost :: funzione o qualcosa di simile, ho bisogno la funzione di essere completamente dinamico, quindi il mio interesse :)
NOTA: Questa domanda è una continuazione sul mio previous one, ma con molto più specifico.
Perché dovresti copiare una funzione? L'originale è altrettanto buono. Vuoi generare una funzione completamente nuova da una rappresentazione di livello superiore? –
@ n.m. Sì, questo è stato solo un esempio per me per capire e per presentare facilmente tutto per te. Avrò facilmente bisogno di una ventina di questi. Se leggi il mio link (alla mia altra domanda) capiresti esattamente perché :) –
Ho provato a capire quella domanda la prima volta, senza alcun successo. –