2012-06-28 6 views
8

मेरे पास हेक्स कोड की एक सरणी है जो असेंबली निर्देशों में अनुवाद करती है और मैं सी में प्रोग्राम बनाना चाहता हूं जो इन्हें निष्पादित कर सकता है।एक सी प्रोग्राम कैसे बनाएं जो x86 हेक्स कोड चला सकता है

unsigned char rawData[5356] = { 
    0x4C, 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x0C, 0x00, 0x00, 
    0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x2E, 0x74, 0x65, 0x78, 
    0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0xB4, 0x05, 0x00, 0x00, 0xA4, 0x01, 0x00, 0x00, 0x68, 0x08, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x60, 
    0x2E, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x40, 0x00, 0x30, 0xC0, 0x2E, 0x62, 0x73, 0x73, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0xC0, 0x2F, 0x34, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x14, 0x00, 0x00, 0x00, 0x58, 0x07, 0x00, 0x00, 0x32, 0x0C, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x10, 0x30, 0x60, 
    0x2F, 0x33, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x6C, 0x07, 0x00, 0x00,...and so on 
+2

इस होमवर्क है? यह वास्तव में एक सवाल नहीं है, बल्कि एक असाइनमेंट है। आपको हमें बताएं कि आपने पहले से क्या प्रयास किया है और आप कहां खो गए हैं। – carmenism

+2

** क्या आपने कच्चेडेटा (देखभाल कॉलिंग सम्मेलन, कृपया) के लिए फ़ंक्शन पॉइंटर घोषित करने के लिए ** कोशिश की और फिर उस फ़ंक्शन का आह्वान किया ??? इसके अलावा विंडोज़ (यदि आप विंडोज का उपयोग कर रहे हैं) से इनकार किया जा सकता है क्योंकि डीईपी (बस इसे निष्क्रिय करें)। –

+0

मैं इसे कैसे अक्षम कर सकता हूं? – Iowa15

उत्तर

8

86 यह संभव है।

यहां एक छोटा सा नमूना है। पृष्ठ को लिखने/निष्पादन विशेषाधिकारों के साथ आवंटित करें और वहां अपने ऑपकोड कॉपी करें।

#ifdef _WIN32 
#include <windows.h> 
#else 
#include <sys/mman.h> 
#include <unistd.h> 
#endif 


int main(){ 
    char opcodes[] = { ..... }; 

    #ifdef _WIN32 

    HANDLE mem_handle = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE, 0, length, NULL); 

    void* mem_map = MapViewOfFile(mem_handle, FILE_MAP_ALL_ACCESS | FILE_MAP_EXECUTE, 0x0, 0x0, length); 

    #else // posix 
    void* mem_map = mmap(NULL, sizeof(opcodes), PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); 
    #endif 

    memcpy(mem_map, opcodes, sizeof(opcodes)); 

    ((void(*)())mem_map)(); 

    return 0; 
} 

पॉज़िक्स सिस्टम के लिए mmap() कॉल का उपयोग करें।

ट्रैम्पोलिन के बारे में भी पढ़ें। लिंक देखें: http://pages.cs.wisc.edu/~weinrich/papers/method_dispatch.pdf

आपने यह नहीं बताया कि यह एक पूर्ण कार्यक्रम या एक समारोह है या नहीं। सापेक्ष/पूर्ण संपीड़न के साथ समस्या हो सकती है।

छोटी टिप्पणी: यह कोड एमएमयू सक्षम के साथ पावरपीसी और एआरएम के साथ भी काम करता है।

+1

+1 अच्छा समाधान! मुझे लगता है कि यह निष्पादन योग्य नहीं है बल्कि सिर्फ एक समारोह है, यह किसी ज्ञात मार्कर से शुरू नहीं होता है। –

4

फ़ंक्शन पॉइंटर घोषित करें और फिर फ़ंक्शन को कॉल करें।

void (*f)(void) = (void (*)(void)) rawData; 
f(); 

बेशक यह अनिर्धारित व्यवहार है और काम करने की गारंटी नहीं है।

+0

धन्यवाद के साथ नीचे मेरा उत्तर देखें, तो क्या मैं सिर्फ – Iowa15

+1

के लिए चक्र के माध्यम से चक्र चलाता हूं, यही कारण है कि वे सी को एकजुट करने वाले से कदम उठाते हैं! –

+2

हाँ, यह सही है। हालांकि, संभावित जटिलताओं हैं। 1) क्या असेंबली वास्तव में सी कॉलिंग सम्मेलन का पालन करती है (आप इसे कॉल करने में सक्षम हो सकते हैं, लेकिन यह वापस नहीं आ सकता है)। 2) आप इसे निष्पादन योग्य कोड में स्पष्ट रूप से "केवल डेटा" के रूप में परिवर्तित करने के लिए तैयार आधुनिक प्रणालियों के रूप में ऐसा करने में सक्षम नहीं हो सकते हैं। उस डेटा सेगमेंट में जो सरणी हो सकती है उसे निष्पादन योग्य नहीं माना जा सकता है। यह सभी प्रकार की चीजों (प्लेटफॉर्म, ओएस, संकलन और लिंक विकल्प इत्यादि) पर निर्भर करता है –

-1

क्या आप सिर्फ उन्हें फ़ाइल में आउटपुट नहीं कर सकते थे और फिर system() कॉल का उपयोग कर सकते थे? इस तरह आपको चिंता करने की ज़रूरत नहीं है कि वह सरणी सी कॉलिंग सम्मेलन का पालन करती है या नहीं।

+0

यह केवल तभी काम करेगा यदि हेक्स कोड एक उचित-निष्पादन योग्य प्रोग्राम बनाते हैं और न केवल एक कार्य कहें। – JAB

+1

सिस्टम हेक्स के लिए नहीं है। यह ओएस कमांड (डॉस या यूनिक्स) के लिए है। – ST3

1

शीर्षलेख फ़ाइल elf.h देखें।

आपको ओपीकोड के साथ इन संरचनाओं से फ़ील्ड को पूरा करने की आवश्यकता है।

x86 में निष्पादन योग्य लोड करने के लिए एक प्रोटोकॉल है, जब लिंकर लोड किए गए कोड पर नियंत्रण पास करता है, तो यह क्रैश हो जाता है।

यहाँ देखो एक वैध निष्पादन योग्य बनाने का तरीका:

http://bellard.org/otcc/otccelfn.c

4

कुछ मंच पर, आप सिर्फ घोषणा कर सकते हैं नहीं:

void (*f)(void) = (void (*)(void)) rawData; 

और

f(); 

hexed कोड को चलाने के लिए प्रयास करें।

चूंकि डेटा पृष्ठ निष्पादन योग्य नहीं हो सकता है। किसी भी सामग्री की देखभाल किए बिना फ़ंक्शन को परिभाषित करने का एक सुविधाजनक तरीका है अपनी प्रोजेक्ट में .s फ़ाइल जोड़ना।

इसे जीएनयू के साथ संकलित करें, और अपनी ऑब्जेक्ट फ़ाइल को अपने अंतिम प्रोग्राम से लिंक करें।

उदाहरण के लिए

:

main.c

int main() 
{ 
    helloasm(); 
    return 0; 
} 

एक्स।printf("Hello ASM\n"); exit(11);

.global helloasm 
helloasm: 
.byte 0x48, 0xc7, 0xc7, 0x01, 0x00, 0x00, 0x00, 0xe8, 0x0b, 0x00, 0x00, 0x00, 0x48, 0x65, 0x6c, 0x6c 
.byte 0x6f, 0x20, 0x41, 0x53, 0x4d, 0x21, 0x0a, 0x5e, 0x48, 0xc7, 0xc2, 0x0b, 0x00, 0x00, 0x00, 0xb8 
.byte 0x01, 0x00, 0x00, 0x00, 0x0f, 0x05, 0xbf, 0x0b, 0x00, 0x00, 0x00, 0xb8, 0x3c, 0x00, 0x00, 0x00 
.byte 0x0f, 0x05 

संकलित & रन

as x.s -o x.o 
gcc main.c x.o -o main 
./main 
Hello ASM! 

इसके अतिरिक्त, यदि आपका hexed कोड सरणी एक बाइनरी फ़ाइल में है, a.bin की तरह: रों

कोड सी बयान की तरह काम करता

hexdump -C a.bin 
00000000 48 c7 c7 01 00 00 00 e8 0b 00 00 00 48 65 6c 6c |H...........Hell| 
00000010 6f 20 41 53 4d 21 0a 5e 48 c7 c2 0b 00 00 00 b8 |o ASM!.^H.......| 
00000020 01 00 00 00 0f 05 bf 0b 00 00 00 b8 3c 00 00 00 |............<...| 
00000030 0f 05            |..| 
00000032 

फिर अपने x.s हो सकता है:

.global helloasm 
helloasm: 
.incbin "a.bin" 
संबंधित मुद्दे