मैं एक (C++) परियोजना है, जिसमें पूरी तरह से गतिशील रूप से आवंटित कार्यों की आवश्यकता है, जो malloc/नई और mprotect का मतलब है पर काम कर रहा है पर नए कार्यों बनाने और उसके बाद करने के लिए मैन्युअल रूप से बफर संशोधित करने के लिए विधानसभा के साथ C++ का उपयोग करते हुए असेंबली कोड इस वजह से मैंने ठीक से सोचा है, मेरे "बफर" में क्या आवश्यक है, क्योंकि यह किसी अन्य _cdecl फ़ंक्शन के को दोहराएं। उदाहरण के लिए:आवंटित और रनटाइम
int ImAcDeclFunc(int a, int b)
{
return a + b;
}
मैं सचमुच इस समारोह का डुप्लिकेट बनाने के लिए चाहते हैं, लेकिन पूरी तरह से गतिशील, कि क्या आवश्यकता होती है (और यह सी ++ इनलाइन विधानसभा के साथ है याद) चाहते हैं? शुरुआत के लिए, मुझे लगता है मैं कुछ इस तरह (या एक समान समाधान) क्या करना है जाएगा:
// My main....
byte * ImAcDeclFunc = new byte[memory];
mprotect(Align(ImAcDeclFunc), pageSize, PROT_EXEC | PROT_READ | PROT_WRITE);
इस के बाद मैं ImAcDeclFunc(int a, int b);
के लिए विधानसभा कोड पता लगाने के लिए होगा। अब मैं असेंबली में अभी भी लुसी हूं, तो यह कार्य AT & टी वाक्यविन्यास में कैसे होगा? यहाँ मेरी बोल्ड प्रयास है:
push %ebp
movl %%ebp, %%esp
movl 8(%ebp), %%eax
movl 12(%ebp), %%edx
addl edx, eax
pop ebp
ret
अगर यह कोड सही है (जो मैं अत्यधिक संदेह, कृपया मुझे सही करें) मैं केवल हेक्स में इस कोड के मूल्य खोजने की आवश्यकता होगी अब (उदाहरण के लिए, 'JMP' 0xE9 और है ' inc '0xFE है), और इन मानों का सीधे सी ++ में उपयोग करें? अगर मैं अपने पिछले सी ++ कोड जारी रखने के लिए:
*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)
करें?)। और मैं बढ़ावा :: समारोह या कुछ समान का प्रयोग करने में कोई दिलचस्पी नहीं हूँ, मैं जरूरत समारोह पूरी तरह से गतिशील, इसलिए मेरी रुचि :)
नोट होने की: यह सवाल मेरे previous one पर एक निरंतरता है, लेकिन साथ बहुत अधिक विशिष्टताएं।
आपको फ़ंक्शन कॉपी करने की आवश्यकता क्यों होगी? मूल एक उतना ही अच्छा है। क्या आप कुछ उच्च स्तरीय प्रतिनिधित्व से पूरी तरह से नया कार्य उत्पन्न करना चाहते हैं? –
@ एनएम। हां, यह सब मेरे लिए समझने के लिए सिर्फ एक उदाहरण था, और आसानी से आपके लिए सबकुछ प्रस्तुत करना था। मुझे आसानी से इनमें से बीस की आवश्यकता होगी। यदि आप मेरा लिंक पढ़ते हैं (मेरे दूसरे प्रश्न के लिए) तो आप वास्तव में समझेंगे कि क्यों :) –
मैंने पहली बार उस प्रश्न को समझने की कोशिश की, बिना किसी सफलता के। –