簡體   English   中英

C:從ram運行已編譯的函數

[英]C : running a compiled function from ram

我正在一個項目中,我需要將一個簡單的exe文件加載到緩沖區,然后從ram內調用exe文件的入口點。

我知道我無法加載並運行一個非常復雜的exe文件,該文件具有很多來自緩沖區的依賴關系,但我認為可以調用exe (PE)文件的獨立功能(例如一個空的main)。

為此,我必須找到exe文件的入口地址(其偏移量),然后將該地址(現在已加載到緩沖區中)轉換為指向函數的指針,然后調用該函數,它可能會調用加載在ram中的函數,但我不知道如何找到地址。

到目前為止,這是我所做的:

int main(){

    void (* function)();
    unsigned char* buffer;
    FILE* fp;
    size_t size;
    char* path = "address of the file";
    fp = fopen(path, "rb");
    fseek(fp, 0, SEEK_END); 
    size = ftell(fp);         /*calc the size needed*/
    fseek(fp, 0, SEEK_SET); 
    buffer = (unsigned char *) malloc(size);
    fclose(fp);

    /*problem : i have to sum the buffer address with that offset here*/
    function = (void (*)())(buffer);

    function();

    return 0;
}

我認為從代碼中可以很清楚地知道我要做什么。

這是一個嘗試為meterpreter做相同事情的鏈接(想法是相同的):

https://github.com/rsmudge/metasploit-loader/blob/master/src/main.c

我將不勝感激。

謝謝

您可能很想解決錯誤的問題。 如果您使用的是操作系統(例如Windows或Linux),那么最簡單的方法就是調用system函數,即

char* path = "address of the file";
system(path);

這將運行exe。

請注意,幾乎所有為在OS上運行而構建的exe都不是簡單的加載到內存並運行。 那是因為任何C程序的啟動代碼都不會像您想象的那樣以main()開頭。 它從更深的層次開始,涉及加載運行時庫,分配內存,最終運行時將調用main()

就是說,如果您不處理真正的exe文件(exe文件在Windows上是PE格式 ,在Linux上是ELF),但是它是一個手工編譯的二進制映像,那么假設代碼已編譯,那么您正在執行的操作就可以了如果使用PIC選項使代碼可重定位,則代碼不依賴於C運行時庫或任何動態加載的庫,並且入口點是二進制文件的第一個地址。 但是,我可以告訴你,沒有人會這樣。

“ exe”文件更合適,稱為Portable Executable 入口點(請注意,這很可能不是main() )在OpationalHeader中作為屬性AddressOfEntryPoint。

PIMAGE_DOS_HEADER dos;
PIMAGE_NT_HEADERS pe;
void (* function)();

dos = (PIMAGE_DOS_HEADER)data;
if (dos->e_magic != IMAGE_DOS_SIGNATURE) {
    return NULL;
}

pe = (PIMAGE_NT_HEADERS)&((const unsigned char *)(buffer))[dos->e_lfanew];
if (pe->Signature != IMAGE_NT_SIGNATURE) {
    return NULL;
}

function = pe->OptionalHeader.AddressOfEntryPoint + buffer;
function();

您想要執行的應用程序在沒有固定重定位或導入的情況下運行的機會基本上是無限的,因此您應該使用現有的解決方案。

另外,請記住,大多數現在運行的PC都啟用了數據執行保護 ,因此您應該分配VirtualAllocate()

如果要動態加載函數,可以考慮使用動態庫。 您需要構建.so文件而不是exe文件。 在Linux上,這是dlopendlsym API。

http://man7.org/linux/man-pages/man3/dlopen.3.html

http://man7.org/linux/man-pages/man3/dlsym.3.html

在Windows上,您需要LoadLibrary ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM