2015-06-18 4 views
5

मेरे पास एक ट्रेस निर्देश है और फ़ंक्शन कॉल और रिटर्न निकालना चाहते हैं।कॉल के बीच मतभेद, पुश + रेट और पुश + असेंबली में कूदें

मैंने पाया कि call अनुदेश को छोड़कर, push + jmp और push + ret समारोह कॉल के लिए इस्तेमाल किया जा सकता है? पहले मैं यह सुनिश्चित करना चाहता हूं कि यह सही है? और यदि हां उनके बीच मतभेद क्या हैं?

यदि push + ret कॉल की तरह है तो फ़ंक्शन का अंत या वापसी क्या होगा? ret को push इसके बिना निर्देश के बिना देख रहे हैं?

उत्तर

4

सरल शब्दों में:

कॉल पता

यह ढेर पर अद्यतन कार्यक्रम काउंटर (जो call के बाद शिक्षा के लिए अंक) आ जाएगी तो पता संकेत दिया के लिए कूद (मोड को संबोधित करना लागू हो सकता है)।

सेवानिवृत्त

यह निर्देश आंतरिक रूप से पॉप और ढेर बंद का पता और इसे करने के लिए कूदता है। यह अच्छी तरह से call से मेल खाता है ताकि यह पूर्व call के बाद निर्देश पर वापस जा सके।

JMP पता

यह केवल दिया पता लिए कूदता है (को संबोधित मोड आवेदन कर सकते हैं)। यह ढेर के साथ कुछ भी नहीं करता है।


तो, आप भी ऐसा कर सकते हैं:

push address 
ret 

जो पॉप और पता कि ढेर पर धकेल दिया गया जैसा कि ऊपर वर्णित पर चला जाएगा। यह एक माइक्रोप्रोसेसर में अप्रत्यक्ष कूद करने का एक चालाक तरीका है जो अपने कूद निर्देशों में अप्रत्यक्ष पते मोड का समर्थन नहीं करता है।

अनुक्रम:

push address 
jmp someplace 

बस कूद जाएगा किसी ऐसे स्थान को और नहीं ढेर प्रभावित या पता कि ढेर पर धकेल दिया गया का उपयोग करें। यदि पताjmp के बाद निर्देश है, तो यह लगभग call someplace के बराबर है।

निर्देश सेट कि एक अप्रत्यक्ष को संबोधित कूद का समर्थन नहीं करते के लिए, मैं इस अच्छी छोटी काम के आसपास देखा है:

push address 
ret 

कौन सा कूद जाएगा जो कुछ भी करने के लिए address है।

+0

लेखक की असामान्य विविधता अक्सर उपयोग की जाती है जब लेखक कोड की वास्तविक कार्यक्षमता को अस्पष्ट करना चाहता है (उदाहरण के लिए, मैलवेयर और "कॉपी-संरक्षित" वाणिज्यिक सॉफ़्टवेयर)। –

+0

अनिवार्य रूप से 'पॉप' नहीं है और पॉप किए गए पते पर अप्रत्यक्ष कूदता है? –

+0

@ जोहान हास्कल हाँ यह है ... "डुह" मेरे हिस्से पर। : पी मैं सोच रहा था "नहीं 'कॉल, नहीं' ret' '। :) – lurker

6

हां, आप सही हैं।

जब call जारी किया जाता है, तो स्टैक पर धक्का दिया गया वापसी पता अगला पता है जहां निष्पादन जारी रखना चाहिए (वर्तमान निर्देश के तुरंत बाद पता)। संक्षेप में यह एक परमाणु push है जिसके बाद jmp है।

इसका मतलब यह है कि यदि आप मैन्युअल रूप से push और फिर jmp, समारोह है कि आप बाद में ret कर सकते हैं में कूद और, बशर्ते समारोह में सभी ढेर पहुँच संतुलित है, यह पता है कि आप पहले से धक्का दिया करने के लिए वापस आ जाएगी।

इसी प्रकार, आप कॉल रिटर्न अनुकरण करने के लिए push और फिर ret कर सकते हैं, लेकिन यह आपको बाद में वापस लौटने में सक्षम होने के लिए सेट नहीं करता है। इस प्रकार का व्यवहार अधिकांशतः डिस्सेबलर्स को फेंकने के लिए किया जाता है, जिससे यह निर्धारित करना मुश्किल हो जाता है कि कोड वास्तव में एक सरल डिस्सेबलर के साथ किस पते पर जा रहा है।

+0

"इस प्रकार का व्यवहार अधिकांशतः डिस्सेबलर्स को फेंकने के लिए किया जाता है" क्या आपको पता है कि आईडीए प्रो के पास कॉल/रिटर्न के रूप में इन रणनीतियों को सही तरीके से समझने के लिए कोई कार्यक्षमता है या नहीं? एक सामान्य परिप्रेक्ष्य से, आप किस दिशा में सुझाव देंगे कि कोई उस कोड को अलग करने के लिए जाता है जो इस obfuscation रणनीति को नियोजित करता है? संपादित करें: थोड़ी अधिक खोज ने इस धागे को जन्म दिया जो आपके उत्तर का संदर्भ देता है और मेरे प्रश्न का उत्तर देता है: http://reverseengineering.stackexchange.com/questions/10911/automatically-decode-pushret-call-into-jmp – SullX

संबंधित मुद्दे