備忘録

備忘録

VisualStudioでx64アセンブリを書き、実行する方法

Ⅰ. はじめに

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. ビルドのカスタマイズをクリック

f:id:kagasu:20180103195402p:plain

3. masm(.targets, .props)を選択

f:id:kagasu:20180103195436p:plain

4. Native.asm を右クリックしてプロパティを開き、「Microsoft Macro Assembler」を選択する

f:id:kagasu:20180103195551p:plain

5. 実行結果

f:id:kagasu:20171217171626p:plain