64位內聯匯編


編寫涉及系統特性的一些底層程序,特別是ShellCode,不可避免地要采用直接編寫匯編代碼的方式。

在目標平台為x86模式時,可以直接使用內聯匯編,這個很多人都比較熟悉了,也非常地方便。

但是當目標平台為x64時,微軟不再允許直接內聯匯編了,這給我們編程造成了一些不便。

 

 

主要過程:

一、在asm文件中單獨編寫功能函數

比如造一個加法函數:

ULONG64 myadd(ULONG64 u1, ULONG64 u2);

 

在源文件下添加一個asm文件

 

 

 

 

 

 新建一個myadd.asm文件

 

 

 二:在源文件中申明我們要用的函數

EXTERN_C ULONG64 add(ULONG64 u1, ULONG64 u2);

、設置asm文件的生成方式

右鍵項目名,左鍵屬性

從生成中排除:選擇否

項類型:自定義生成工具

 

 

 

 

 然后,我們繼續對 .asm 文件進行設置,將其包含到項目工程中來編譯鏈接。選中“myadd.asm”文件,右擊選擇“屬性”,來到“myadd.asm”屬性頁進行設置。在 命令行 中輸入“ml64 /c %(fileName).asm”,在 輸出 中輸入“%(fileName).obj”,其它保持默認即可,點擊“確定”即可完成設置。

 

 

 

 對於 64 位程序在 .asm 中寫代碼,需要遵循以下幾個規則:

  • 會變文件 .asm 文件必須以關鍵字 .CODE 開始,關鍵字 END 結束,大小寫都可以。
.code
    ; 此處寫匯編指令代碼
end
  • 所有的匯編代碼以函數方式組織在一起。也就是說,我們要將匯編代碼封裝成一個個匯編函數。要注意 64 位匯編中的函數聲明以及調用約定
.code
  //myadd是匯編函數
myadd    proc
    //此處寫匯編函數的代碼
myadd    endp
end

其中, myadd 是匯編函數的名稱,proc 是匯編函數的關鍵字,endp 是匯編函數的結尾關鍵字。

在主函數中使用

#include <iostream>
#include <windows.h>
#include <tchar.h>

//聲明引用外部函數
EXTERN_C ULONG64 myadd(ULONG64 u1, ULONG64 u2);

int main(int argc, _TCHAR* argv[])
{
    ULONG64 result = myadd(0x111111111, 0x333333333);
    printf("result = 0x%I64X\n", result);
    return 0;
}

 

 

 

 參考

https://www.cnblogs.com/achillis/p/5369658.html

https://writebug.com/article/1599.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM