수요일, 2월 15, 2017

[TIP] Visual Studio 2015 에서 Intel Pin 3.2 프로젝트 생성하기~



Pin 3.2 버전이 올라왔군요... @_@ !!!

[ Pin - A Binary Instrumentation Tool 다운로드 페이지 ]


Pin 2.14 버전은 VS2015 를 지원하지 않고~

Pin 3.0 은 작년에 올라왔다가 어느 순간 윈도우 버전 다운로드 링크가 사라져서 난감했는데...

Pin 3.2 버전으로 다시 올라왔네요~ :)


Pin 3.x 로 넘어오면서 프로젝트 생성 시 손봐줘야 될 것들이 많아졌는데~

기록보관 차원에서 포스팅해봅니다.


시작하기 전에


준비물 : Visual Studio 2015 Community, Pin 3.2 (윈도우용)

Pin 3.2 는 다운로드 페이지에서 받은 후, 원하는 곳에 압축을 풀어두면 됩니다.


프로젝트 생성 및 Pin 설정


Win32 응용 프로그램 - DLL - 빈 프로젝트

PinTool 은 DLL 형태이기 때문에~ DLL 을 선택한 후 "빈 프로젝트" 로 프로젝트를 생성합니다.

프로젝트에 파일이 하나도 없으면 '프로젝트 속성' 페이지에 'C/C++' 항목이 안보이니...

편의상 비어있는 cpp 파일이라도 하나 만들어서 프로젝트에 추가해줍니다.


이제 '프로젝트 속성' 페이지를 열어서~ 하나하나 만져주면 됩니다.

구성속성 - 일반
'구성속성' - '일반' 페이지에서 '문자 집합'"멀티바이트 문자 집합 사용" 지정해줍니다.


다음은 'C/C++' - '일반' 페이지의 '추가 포함 디렉터리' 에 Pin 관련 Include 폴더들을 추가해줍니다.

C/C++ - 일반 - 추가 포함 디렉터리
PinTool 프로젝트 생성시 제일 귀찮은 부분이 아닐까~ 싶네요.

이번 버전에 비해 포함시켜줘야 되는 폴더들이 많아졌습니다. oTL;;;;

압축을 풀어둔 폴더가 PIN_ROOT 라는 가정하에 아래의 폴더들을 추가하면 됩니다.
( 제 PC 의 경우 PIN_ROOT=E:\Work\Source\pin-3.2-81205-msvc-windows 가 되겠죠~ )

------------------------------------------------------------------------------------------------
%PIN_ROOT%\source\include\pin
%PIN_ROOT%\source\include\pin\gen
%PIN_ROOT%\extras
%PIN_ROOT%\extras\components\include
%PIN_ROOT%\extras\crt
%PIN_ROOT%\extras\crt\include
%PIN_ROOT%\extras\crt\include\arch-x86 (64비트용은 arch-x86_64)
%PIN_ROOT%\extras\crt\include\kernel\uapi
%PIN_ROOT%\extras\crt\include\kernel\uapi\asm-x86
%PIN_ROOT%\extras\libstdc++\include
%PIN_ROOT%\extras\stlport\include
%PIN_ROOT%\extras\xed-ia32\include\xed
( 64비트용은 %PIN_ROOT%\extras\xed-intel64\include\xed )
------------------------------------------------------------------------------------------------

일단 이 정도는 최소한으로 포함이 되어야 되는 걸로 보입니다.

없어도 되겠지 싶어서 폴더를 없애보면 컴파일 에러가... -_-;;;;;


C/C++ - 전처리기
'C/C++' - '전처리기' 페이지에서 아래 값들을 추가해줍니다.

------------------------------------------------------------------------------------------------
TARGET_IA32
(64비트용은 TARGET_IA32E)
HOST_IA32
(64비트용은 HOST_IA32E)
TARGET_WINDOWS
__PIN__=1
PIN_CRT=1
__i386__
(64비트용은 __LP64__ )
------------------------------------------------------------------------------------------------


다음은 'C/C++' - '코드 생성' 페이지~

C/C++ - 코드 생성
'C++ 예외 처리 가능' 항목을 "아니요" 로~

'런타임 라이브러리' 항목을 "다중 스레드(/MT)" 로~

'보안 검사' 항목을 "보안 검사 사용 안 함(/GS-)" 으로 지정해줍니다.


C/C++ - 언어
'C/C++' - '언어' 페이지에선 '런타임 형식 정보 사용' 항목을 "아니요(/GR-)" 로 지정합니다.


그리고 'C/C++' - '명령줄' 페이지의 '추가 옵션' 부분에~

"/FIinclude/msvc_compat.h" 를 입력해줍니다.

C/C++ - 명령줄



다음은 '링커' 항목입니다.

'링커' - '일반' 페이지의 '추가 라이브러리 디렉터리' 에 Pin 관련 라이브러리 폴더를 추가해줍니다.

링커 - 일반 - 추가 라이브러리 디렉터리
PIN_ROOT 를 기준으로 아래의 폴더들을 추가해줍니다.

------------------------------------------------------------------------------------------------
[ 32비트 ]

%PIN_ROOT%\ia32\lib
%PIN_ROOT%\ia32\lib-ext
%PIN_ROOT%\ia32\runtime\pincrt
%PIN_ROOT%\extras\xed-ia32\lib


[ 64비트 ]

%PIN_ROOT%\intel64\lib
%PIN_ROOT%\intel64\lib-ext
%PIN_ROOT%\intel64\runtime\pincrt
%PIN_ROOT%\extras\xed-intel64\lib
------------------------------------------------------------------------------------------------

라이브러리 폴더를 추가한 다음~ 실제 사용할 라이브러리를 지정해야되는데요...

링커 - 입력 - 추가 종속성

'링커' - '입력' 페이지의 '추가 종속성' 항목에 아래의 라이브러리들을 추가해줍니다.

------------------------------------------------------------------------------------------------
pin.lib
pinvm.lib
xed.lib
kernel32.lib
ntdll-32.lib (64비트는 ntdll-64.lib)
c-static.lib
m-static.lib
os-apis.lib
stlport-static.lib
crtbeginS.obj
------------------------------------------------------------------------------------------------

라이브러리 추가 후엔 '모든 기본 라이브러리 무시' 항목을 "예(/NODEFAULTLIB)" 로 지정합니다.

링커 - 입력


'링커' - '고급' 페이지에도 만져줘야 될 항목들이 있습니다.

링커 - 고급

'진입점' 항목에 "Ptrace_DllMainCRTStartup%4012" 를~ (64비트는 "Ptrace_DllMainCRTStartup" 만)

'기준 주소' 항목에 "0x55000000" 을~ (64비트는 "0xC5000000") 입력하고

'이미지에 안전한 예외 처리기 포함' 항목을 "아니요(/SAFESEH:NO)" 로 지정합니다.


마지막으로 '링커' - '명령줄' 페이지의 '추가 옵션'"/export:main" 을 입력~!!

링커 - 명령줄



꽤 번거롭긴(?) 하지만  일단 여기까지하면~

Pin 코드를 작성해서 테스트 해볼 수가 있습니다. @_@

빌드 성공


다음엔 게임 해킹툴 분석 시 도움이 될만한 PinTool 을 만들어보는 걸로~~ ㅋ :)








댓글 11개:

  1. 혹시 pin.H 에 에서 관련된 trait.h , char.h 에서 오류가뜨는데 왜이러시는지 아시나요?

    답글삭제
    답글
    1. 일단 include 폴더나 전처리기 설정 부분을 다시 확인해보시기 바랍니다.
      include 폴더 순서도 포스팅 내용과 동일하게 해보시길... ^^;;

      어떤 오류 메시지가 뜨는지 모르는 상태에서는 확실한 답변을 드리기가 어렵네요..

      삭제
    2. 작성자가 댓글을 삭제했습니다.

      삭제
    3. 답변감사합니다. 제가 몇번이고 정확히 똑같이 시도를 해봤는데 계속 이렇게 뜨는데 혹시 해결방법을 아시면 알려주시면 감사하겠습니다...

      https://3.bp.blogspot.com/-tOccZeRqjvg/WQXg0u3N15I/AAAAAAAAABY/xDEq-PBZDCctMnD5RTmPR0pmmtUEUWuhQCLcB/s320/%25EC%25BA%25A1%25EC%25B2%2598.PNG

      에러가 뜨는 사진입니다.

      삭제
    4. http://wusec.blogspot.kr/2017/04/error.html
      사진이 깨져 잘안보이시면 이걸봐주세요!

      삭제
    5. 에러를 봐선 프로젝트 설정이 뭔가 잘못된거 같은 느낌인데요...

      https://drive.google.com/open?id=0B3vk7mWod7ORQVZFZFdtemR4SG8

      제가 작성한 프로젝트 파일입니다.
      Visual Studio 2015 / Pin 3.2 기준이구요..
      PIN 폴더가 "E:\Work\Source\pin-3.2-81205-msvc-windows" 로 되어있는데..
      이 부분만 조금 맞춰주면 별 문제없을겁니다.
      한번 비교해보는게 어떨까 싶네요..

      삭제
    6. 감사합니다! 한번해보겟습니다

      삭제
  2. 저도 윗 분과 똑같은 현상이 있네요...ㅠㅠㅠ 어떻게 해야할까요?

    답글삭제
    답글
    1. https://drive.google.com/open?id=0B3vk7mWod7ORQVZFZFdtemR4SG8

      참고하셔서 프로젝트 설정 부분이 다른게 없는지 비교해보시는게 어떨까요.. ^^;;

      삭제
  3. 안녕하세요. 8월 21일에 올려주신 프로젝트 sin파일 열어서 포스트 내용처럼 환경설정후에 컴파일하였는데 https://www.dropbox.com/s/b4a2954uaidp2ud/%EC%BA%A1%EC%B2%981.PNG?dl=0
    같은 에러가 발생됩니다.
    혹시 어떻게 해야하는지 알수있을까요?

    답글삭제
    답글
    1. Debug 로는 빌드가 안되었던걸로 기억합니다.
      Release 로 빌드해보세요~ :)

      삭제