Ⅰ. はじめに
2018/01/03時点、VisualStudioでプラットフォームをx64と指定した場合インラインアセンブリ(__asm)がサポートされていない為使えません。
エラー C4235 非標準の拡張機能が使用されています: '__asm' キーワードはこのアーキテクチャではサポートされていません
この記事では直接x64アセンブリを書き、実行する方法を紹介します。
Ⅱ. やり方
今回はサンプルとしてNtWriteVirtualMemoryをx64アセンブリで実装します
WOW64向けの解説はこちら
http://kagasu.hatenablog.com/entry/2017/12/17/174108
1. サンプルプログラムを書く
Native.asm
.code NtWriteVirtualMemory proc mov r10, rcx mov eax, 3Ah syscall ret NtWriteVirtualMemory endp end
Source.cpp
#include <Windows.h> #include <iostream> extern "C" NTSTATUS NtWriteVirtualMemory(HANDLE processHandle, PVOID baseAddress, PVOID buffer, ULONG numberOfBytesToWrite, PDWORD numberOfBytesWritten); int main() { auto x = 100; auto y = 999; std::cout << "x:" << x << std::endl; DWORD numBytesWritten = 0; NTSTATUS success = NtWriteVirtualMemory(GetCurrentProcess(), &x, &y, sizeof(y), &numBytesWritten); std::cout << "x:" << x << std::endl; return 0; }
2. ビルドのカスタマイズをクリック
3. masm(.targets, .props)を選択
4. Native.asm を右クリックしてプロパティを開き、「Microsoft Macro Assembler」を選択する