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; }
參考
//www.cnblogs.com/achillis/p/5369658.html
//writebug.com/article/1599.html