私は(C ++)プロジェクトに取り組んでいます。これには、完全に動的に割り当てられた関数が必要です。つまり、malloc / newとmprotectを使用してから、バッファーを手動でアセンブリコードに変更します。このため、他の_cdecl関数の複製であるために、この「バッファー」に何が必要かを正確に知りました。例えば:
int ImAcDeclFunc(int a, int b)
{
return a + b;
}
この関数の複製を文字通り作成したいが、完全に動的に作成したい場合、何が必要になりますか(インラインアセンブリを備えたC ++であることを覚えておいてください)?手始めに、私はこのようなこと(または同様の解決策)をしなければならないと思います:
// My main....
byte * ImAcDeclFunc = new byte[memory];
mprotect(Align(ImAcDeclFunc), pageSize, PROT_EXEC | PROT_READ | PROT_WRITE);
この後、のアセンブリコードを見つける必要がありますImAcDeclFunc(int a, int b);
。今でも私は組み立てがお粗末ですが、この関数はAT&T構文でどのようになりますか?これが私の大胆な試みです:
push %ebp
movl %%ebp, %%esp
movl 8(%ebp), %%eax
movl 12(%ebp), %%edx
addl edx, eax
pop ebp
ret
このコードが正しい場合(私は非常に疑わしいので、訂正してください)、このコードの値を16進数で見つけるだけでよく(たとえば、「jmp」は0xE9、「inc」は0xFE)、これらの値を直接使用します。 C ++?以前の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...
コード/バッファー全体に対してこれを実行した後、完全に動的な_cdecl関数にはこれで十分でしょうか(つまり、関数ポインターにキャストして実行できint result = ((int (*)(int, int))ImAcDeclFunc)(firstArg, secondArg)
ますか?)。そして、私はboost :: functionやそれに類似したものを使用することに興味がありません。関数が完全に動的である必要があるため、私の興味は:)
注:この質問は私の前の質問の続きですが、はるかに詳細です。