簡體   English   中英

Windows AT&T程序集中的MessageBoxA

[英]MessageBoxA in Windows AT&T Assembly

我正在嘗試使用gcc內聯直接在程序集中調用MessageBoxA()。 但是我需要以兩種方式執行此操作:首先使用動態尋址,使用LoadLibrary()和GetProcAddress() - 我找到了關於此的教程,嘗試遵循它。 但我也有興趣直接調用MessageBoxA的地址,在我的Windows SP3英語中是0x7e4507ea。

我正在嘗試執行此代碼:

/*
 *    eax holds return value
 *    ebx will hold function addresses
 *    ecx will hold string pointers
 *    edx will hold NULL
 *
 */


int main(int argc, char **argv)
{
asm("   xor %eax, %eax          \t\n\
        xor %ebx, %ebx          \t\n\
        xor %ecx, %ecx          \t\n\
        xor %edx, %edx          \t\n\
        push $0x0               \t\n\
        push $0x44444444        \t\n\
        push $0x44444444        \t\n\
        pop %ecx                \t\n\
        mov %dl,0x3(%ecx)       \t\n\
        mov $0x7e4507ea, %ebx   \t\n\
        push   %edx             \t\n\
        push   %ecx             \t\n\
        push   %ecx             \t\n\
        push   %edx             \t\n\
        mov $0x8, %ax           \t\n\
        call *%ebx              \t\n\
        ");
}

我不確定在Windows中是否可以這樣做,直接調用地址,而不指定庫(在這種情況下為user32.dll)。 我知道在Linux中調用write()系統調用很簡單,但在Windows中我還不太熟悉..

我希望看到一個帶有“DDDDDDDD”的消息框。 有人可以幫我嗎? 感謝任何幫助,還有教程鏈接!

非常感謝

首先在C中編寫它,編譯並查看程序集列表以查看編譯器生成的內容。 這是最簡單的學習方式。 如果您在英特爾指令集參考PDF中看到一條您不理解的指令。

我這樣做了:

int main ()
{
    asm("xorl %eax, %eax        \n"
        "xorl %ebx, %ebx        \n"
        "xorl %ecx, %ecx        \n"
        "xorl %edx, %edx        \n"
        "pushl %ecx             \n"
        "pushl $0x20206c6c      \n"
        "pushl $0x642e3233      \n"
        "pushl $0x72657375      \n"
        "movl %esp, %ecx        \n"
        "movl $0x7c801d7b, %ebx \n"
        "pushl %ecx             \n"
        "call *%ebx             \n"
        "movl $0xef30675e, %ecx \n"
        "addl $0x11111111, %ecx \n"
        "pushl %ecx             \n"
        "pushl $0x42656761      \n"
        "pushl $0x7373654d      \n"
        "movl %esp, %ecx        \n"
        "pushl %ecx             \n"
        "pushl %eax             \n"
        "movl $0x7c80ae40, %ebx \n"
        "call *%ebx             \n"
        "movl %esp, %ecx        \n"
        "xorl %edx, %edx        \n"
        "pushl %edx             \n"
        "pushl %ecx             \n"
        "pushl %ecx             \n"
        "pushl %edx             \n"
        "call *%eax             \n"
        "xorl %eax, %eax        \n"
        "pushl %eax             \n"
        "movl $0x7c81cb12, %eax \n"
        "call *%eax             \n"
    );
}

即使很難完全可以對函數的地址進行硬編碼,我更喜歡動態加載(雖然我硬編碼kernel32地址),因此它適用於任何Windows XP(SP1,2,3)

直接撥打地址

聽起來像一個大禁忌。 API調用沒有固定的地址。 這取決於它加載的內存在哪里。 雖然我確信在操作系統啟動時加載了User32.dll,但我不會指望它占用相同的空間。

要調用API例程,必須將其導入,以便操作系統為您提供正確的呼叫地址。

“直接”調用MessageBoxA實際上是不可能的。 是的,您可以添加對0x7e4507ea的調用,但這並不重要。 必須在導入地址表中添加一個條目,該條目表示您正在從user32.dll調用MessageBoxA ,並從那里調用。 當Windows加載您的可執行文件時,它會看到您正在調用MessageBoxA ,為您加載user32.dll,並修補MessageBoxA結束的實際地址。

暫無
暫無

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

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