Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

승쨩개발공부

[SR] 프레임워크2 (DLL 파일 피싱) 본문

SR

[SR] 프레임워크2 (DLL 파일 피싱)

Unknowns 2021. 12. 10. 16:22

1. Free함수 순수 가상함수 처리

순수 가상함수로 처리하였기에 정의부 Free함수는 지워준다.

 

 

 

2. Defines 만들기

엔진 솔루션에 Defines 헤더파일 4개를 만들어준다

엔진 솔루션 .h파일이기에 엔진폴더 Public에 생성해준다.

 

 

 

#1. Engine_Typedef.h

메모리 관리를위해 자주쓰는 자료형을 typedef(별명) 을 잡아준다.

Signed 와 unsigned?

-> 정수 기반 자료형은 signed와 unsigned형식으로 나누어져있다

-> 사용할 데이터가 양수와 음수 값 모두 사용한다면 signed 자료형 을 선택하고,

-> 사용할 데이터가 양수 값만  사용한다면 unsigned 자료형을 선택해서 사용한다.

-> signed char 의 데이터 표현 범위 -128 ~ 127 총 256개의 값

-> unsigned char 의 데이터 표현 범위 0 ~ 255 총 256개의 값 

 

 

#2. Engine_Macro.h / DLL피싱 방법

필요한 메크로(Define)을 잡아준다.

 

1. #define MSGBOX

-> 메세지 박스를 메크로 잡아준다.

 

#2. #define BEGIN

-> namespace Engine 을 그냥 사용하면 코드가 깔끔해 보이지않는다

-> 이 기능은 후에 실제로 보여주도록 하겠다.

 

#3. #define END

-> #define BEGIN 에 괄호를 닫는 용도로 사용한다.

 

#4. ENGINE_EXPORTS

-> 엔진 프로젝트라고 정의되어있다면 dllexport를 사용하고

-> 엔진 프로젝트라고 정의되어있지않다면 dllimport를 사용한다

 

#5. _declspec

-> DLL 파일을 피싱(엔진 솔루션을 클라이언트 솔루션에 넘겨주는것) 하기 위해서는

-> _declspec 키워드를 넘겨주고 싶은 클래스의 헤더파일에 클래스명 앞에 명시해주어야한다.

-> _declspec 키워드에는 dllexprot와 dllimport가 있다.

-> dllexport : DLL에서 데이터, 함수, 클래스 또는 클래스 멤버함수를 내보낼 수 있다.     (보여주는 역활)

-> dllimport : .def 파일을 사용할 필요가 없도록 내보내기 지시문을 개체 파일에 추가한다. (보는 역활)

 

 

하지만 어떻게 엔진 프로젝트인지 클라이언트 프로젝트인지  구별하라고 알려주어야할까? 

엔진 솔루션 -> 우클릭 -> 속성 -> C/C++ -> 전처리기 -> 전처리기 정의 를

확인해보면 전처리기 정의가 ENGINE_EXPORT라고 되어있다

-> 클라이언트 전처리기 정의는 당연히 ENGINE_EXPORTS가 정의되어있지않다.

-> 이것으로 엔진 프로젝트인지 클라이언트 프로젝트인지 확인할 수 있다

 

 

 

#.3 Engine_Function.h

-> 일일히 초기화, 레퍼런스 증가, 감소/초기화 함수를 만들어서 치기에는 너무 귀찮다.

-> 다양한 자료형을 받을수있게 템플릿으로 정의해서 미리 만들어두고 필요할떄 사용하자.

 

 

 

#.4 Engine_Defines.h

-> using namespace 도 매번 치기도 귀찮다 어차피 선언부에 Defines.h 를 추가할거면 같이 추가하자.

-> 백터,행렬을 사용할거기에 d3d9.h, d3dx9.h 를 include 해준다.

-> d3dx9.h 를 사용할려면 당연히 경로와 종속성 추가를 해주어야한다.

-> DLL 피싱을 하면 클라이언트에서 d3dx9.h 를 읽지 못하기에 오류가 굉장히 많이 뜰것이다

-> Client 솔루션에도 똑같이 추가해준다.

 

 

 

 

 

 

3.Base

Engine 프로젝트에 있는 base 클래스에 macro에 잡아둔 기능을 사용하고 피싱준비를하자.

 

메크로를 사용하기 전

 

메크로를 사용한 후

base 는 모든 클래스에 부모클래스가 될거기에 abstract 를 붙여 추상화로 만든다.

 

abstract 란?

한국어로 추상으로 번역된다.

abstract는 상속을 강제하는 일종의 규제.

즉 abstract 클래스를 사용하기 위해서는 반드시 상속해서 사용하도록 강제한다.

 

 

 

 

 

4. MainApp

Clinet 프로젝트에 있는 MainApp 클래스에 base를 상속시키고 dll피싱을 받자

근데 클라이언트에서 base 클래스를 쓰고싶은데 

위 사진과 같이 굉장히 길게 작성해야하는 꼴받는 상황이 연출된다.

 

위 사진의 꼴받는 상황 해결과 피싱을 위해 Clinet프로젝트와 Engine프로젝트의 만남의 광장 폴더(Reference)를 만들어보자

Engine 헤더 파일과 lib 파일을 각각 넣을 폴더를 만들어놓는다.

근데 Engine .h파일은 넣는데 왜 .cpp파일은 안넣을까?

모든 cpp 구현부 파일은 dll파일에 담기게 된다

하지만 동적링크가 아니라 정적링크면 모든 구현부는 lib에 담기게된다

lib파일은 실행을 하면 .exe파일에 모든 기능이 녹아들어간다. 그래서 cpp는 lib파일로 대체가 가능하다.

 

 

Reference Librarys 폴더에

요 lib 파일을 복사 붙여넣기로 넣어주고

 

Headers 폴더에

모든 Engine 헤더를 복붙해주자

 

 

그리고 lib파일을 받기위해 클라이언트 프로젝트에서

링커 -> 입력 -> 추가종속성 -> Engine.lib을 추가해준다

 

그러면 lib 추가해줬으니까 빌드를 한번 해볼까하면 

이쁜 오류가 뜬다

왜?

경로를 지정해 주지 않았으니 어디에있는 lib파일을 찾으라는건지 모르는상황이다

그러면 아까말한 꼴받는상황과 이 상황을 동시에 해결하기위해 우리는 만남의 광장 폴더인

Reference폴더를 만든것이다

추가 라이브러리 디렉터리에 ../../Reference/Librarys/

나가서 나가서 Reference폴더에 들어가서 Librarys폴더로 들어가라! 를 해준다

그러면 

오류가 사라진다.

추가 포함 디렉터리에 ;../../Reference/Headers/해준다

그럼 이제 꼴받게 경로를 일일이 말고 바로 칠수있다

 

 

이제 피싱이 완료되었으니 코드를 수정할떄마다 Reference 폴더에있는

Header들과 lib을 빌드할떄마다 다시 복사 붙여넣기해야 정상적인 빌드가 될것이다

하지만 매번 복붙하기엔 너무 귀찮지않을까?

그걸 한번 해결해보자.

UpdateLib txt파일을 만들어준다

UpdateLib.bat로 다른이름으로 저장하자 그럼 bat파일이 생성된다

이걸 VisualStdio에 드레그 해서 복사 붙여넣기 코드를 작성해보자.

xcopy = 복사한다

/y = 덮어쓰기

/s = 하위폴더도 같이 옮겨줄것이냐

xcopy /y/s          ,           ,

첫번쨰 , : 어떤 파일에 있는

두번쨰,  : 어떤 폴더에 복사한다

 

xcopy /y/s        .\Engine\public\* .h        ,\Reference\Headers\

FrameWork -> Engine -> public -> *.h         : *.h 파일을.

FrameWork -> Reference -> Headers           : Headers폴더에 붙여넣어라.

 

 

 

 

Client_Defines.h 도 Engine_Defines.h처럼

이 이름공간을 사용하겠다라고 만들어두자

 

그리고 Client.cpp 에들어와서

어차피 Client_Defines는 MainApp.h에 잡혀있으니 바꿔주자

그리고 CMainApp을 nullptr로 초기화해준다

다시 MainApp.cpp로 들어와 Create()함수를 만들어준다

 

그리고 다시 Clinet.cpp 에 돌아와서

이렇게 해준다.

'SR' 카테고리의 다른 글

[SR] 버퍼(Buffer)  (0) 2022.05.24
[SR] #1. Rendering PipeLine  (0) 2021.12.23
[SR] Graphic_Device  (0) 2021.12.23
[SR] Time / GameInstance  (0) 2021.12.22
[SR] 프레임워크(1)  (0) 2021.12.09