프로그래밍 일반/프로그래밍 기타

Visual Studio 2019에서 어셈블리 64bit 프로젝트 생성

지노윈 2020. 9. 13. 12:08
반응형

어셈블리를 위한 프로젝트 생성

새 빈 콘솔 프로젝트를 만듭니다.

64Bit로 변경합니다.

빌드 종속성에서 masm을 체크합니다.

.asm 파일과 .cpp 파일을 하나씩 추가 합니다.

asm 파일의 속성을 선택합니다.

asm 파일의 항목 형식이 Microsoft Macro Assemply로 선택된 것을 확인 합니다.


어셈블리에서 표준 함수들 사용 할 수 있도록 하자

printf, scanf와 같은 표준 함수들을 어셈블리에서 사용할 수 있게 하려면 다음과 같이 두 개의 라이브러리를 추가해주어야 합니다.

프로젝트 속성의 링커 -> 일반 -> 추가 속성에서 다음과 같이 두 라이브러리를 추가 합니다.

  • legacy_stdio_definitions.lib
  • legacy_stdio_wide_specifiers.lib

예제 코드

Assembly 코드 : 

; ----------------------------------------------------------------------------------------------------------- 
; Our variables
; ----------------------------------------------------------------------------------------------------------- 
_DATA SEGMENT
 hello_msg db "Hello world", 0
 info_msg  db "Info", 0
_DATA ENDS
 
; ----------------------------------------------------------------------------------------------------------- 
; Text or code segment
; ----------------------------------------------------------------------------------------------------------- 
_TEXT SEGMENT
 
; Needed windows functions to show a MessageBox
EXTERN MessageBoxA: PROC
EXTERN GetForegroundWindow: PROC
 
; The PUBLIC modifier will make your function visible and callable outside
PUBLIC hello_world_asm
 
hello_world_asm PROC
 
 push rbp ; save frame pointer
 mov rbp, rsp ; fix stack pointer
 ;sub rsp, 8 * (4 + 2) ; allocate shadow register area + 2 QWORDs for stack alignment
 sub rsp, 32
 ; Get a window handle
 call GetForegroundWindow
 add rsp, 32
 mov rcx, rax ; rax contains window handle
 
 ; WINUSERAPI int WINAPI MessageBoxA(
 ;  RCX =>  _In_opt_ HWND hWnd,
 ;  RDX =>  _In_opt_ LPCSTR lpText,
 ;  R8  =>  _In_opt_ LPCSTR lpCaption,
 ;  R9  =>  _In_ UINT uType);
 
 mov rdx, offset hello_msg
 mov r8, offset info_msg
 mov r9, 0 ; MB_OK
 
 sub rsp, 32
 ;and rsp, not 8 ; align stack to 16 bytes prior to API call
 ;sub rsp, 8 ; mess up the alignment
 call MessageBoxA
 add rsp, 32
 ; epilog. restore stack pointer
 mov rsp, rbp
 pop rbp
 
 ret 
hello_world_asm ENDP
 
 
_TEXT ENDS
 
END

cpp 코드 :

#include <SDKDDKVer.h>
#include <stdio.h>
#include <Windows.h>
#include <iostream>
 
// External assembly functions we want to call from here
extern "C"
{
    void hello_world_asm(); 
};
 
 
int main()
{
 hello_world_asm();
 return 0;
}

실행 결과 :

참고: onipot.altervista.org/how-to-create-assembly-project-visual-studio-2019-64-bit/

 

HOW TO Create Assembly project Visual Studio 2019 | 64 bit Assembly

HOW TO create a 64 bit Assembly project in Visual Studio 2019. I will show you all the needed steps to get a working x64 Assembly project in VS2019.

onipot.altervista.org

 

'프로그래밍 일반 > 프로그래밍 기타' 카테고리의 다른 글

[어셈블리] OllyDbg 소개  (0) 2020.09.13
Visual Studio 인라인 어셈블리 x86 예제  (0) 2020.09.13
CPU 레지스터  (0) 2020.09.12