목차


1. Thread Injection & API 후킹 코드패치 

1.1 분석 사용도구 

1.2 분석 목적 

1.3 수행 기간 

1.4 Thread Injection&API 후킹 코드패치 

1.4.1 Thread Injection이란? 

1.4.2 DLL Injection/Thread Injection 그림설명 

1.4.3 Notepad.exe API후킹 코드패치 동작설명 

1.4.4 Notepad.exe API WriteFile함수 분석 

1.4.5 Thread Injection 코드 작성 

1.4.6 Thread Injection & API 코드패치 Hooking 결과 

 

2. 메모리 변조 탐지 프로그램 

2.1 분석 사용도구 

2.2 분석 목적 

2.3 수행 기간 

2.4 메모리 변조 탐지 프로그램 

2.4.1 메모리 보호 기능 및 구조 설명 

2.4.2 메모리 변조 탐지 

2.4.3 안티 디버그 

2.4.4 안티 DLL인젝션 

2.4.5 결론 


프로젝트명

Thread Injection&API 후킹 코드패치

수행기간

7

사용 도구

Microsoft Visual Studio 2010 C언어, CheatEngine6.6

목적

Thread Injection 공격방식을 알기위함

1.Thread Injection 이란?


- 주로 Code Injection 이란 용어로도 불리고 있는데 같은 의미라고 보여집니다. 먼저 같은 Injection 방법인 DLL Injection 설명을 드리자면 Injectior.exe에서 DLL을 주입하기 위하여 대상프로세스에 쓰레드공간 할당을 받고 할당받은 공간에 미리 작성해둔 Injection시킬 DLL경로를 입력하게됩니다

그리고 빈공간에 작성한 쓰레드를 실행 하기 위해선 CreateRemoteThread 함수를 사용하여 LoadLibrary 함수 주소를 강제로 실행함과 동시에 DLL 경로작성을 한 쓰레드 공간을 실행합니다

하지만 DLL Injection은 무조건 LoadLibrary 함수를 이용하여 작성을 하기 때문에 흔적이 남기 쉽고 DLL 또한 눈에 보이게 됩니다

하지만 Thread Injection은 단순히 코드만 인젝션 시키기 때문에 흔적을 찾기가 어렵고 사용또한 DLL Injection 보단 복잡합니다

그럼 Thread Injection의 방법을 말하자면 

1. DLL Injection -> EXE -> 쓰레드 공간할당/생성 -> LoadLibrary 함수실행 -> DLL경로 쓰레드 실행 -> DLL 기능 작동 이라면 

2. Thread Injection -> EXE -> 쓰레드 공간할당/생성 -> 쓰레드실행 -> 기능작동 이라고 볼수 있습니다

DLL인젝션은 DLL을 통해 기능 작동이되지만 Thread InjectionLoadLibrary 함수를 넣는게 아니라 처음부터 자신이 원하는 API,구조체를 일일이 작성하여 실행될 Thread를 바로 넣어버리기 때문에 흔적이 남지 않습니다.


2.DLL Injection/Thread Injection 그림설명

[DLL Injection]


[Thread Injection]


3. Notepad.exe API후킹 코드패치 동작설명


- 대상 프로그램 Notepad.exe (메모장)은 내용물을 저장을 할 수 있습니다. 이 내용물을 저장하는 API부분을 Thread Injection을 사용하여 코드패치 한 후 다른 내용으로 저장을 하게끔 해보겠습니다.


4. Notepad.exe API WriteFile함수 분석

- WriteFile 함수에 브레이크 포인터를 걸고 내용을 “save save save” 적고 저장

- 현재 스택들이 쌓인곳을 알려주는 ESP 레지스터 주소를 찾아 들어감 메모장 내용은 쌓인지 얼마 안됬을거라 추측을 하고 4바이트씩 하나 하나 30 4C 00 01 -> 01004C30 형식으로 바꿔가며 해당 어드레스 값들을 찾아본 결과 파랑색 어드레스 안에서 발견



- 파랑색 D8 61 47 05 -> 054761D8로 변경후 어드레스 확인하니 저장되는 내용을 볼수 있습니다. 이러한 과정을 Thread Injection을 사용하여 WriteFile 후킹 및 내용 변경까지 해보겠습니다.


5. Thread Injection 코드 작성

- WriteProcessMemory API 재정의 , 파라메터 값 저장하는 곳 생성

- 파라메터 정보를 재정의해준 API에 전달 , 후킹하여 inline 어셈이 작동하도록 작성. ESP안에서의 저장되는 내용물을 가져왔기 때문에 ESP 주소부터 시작

- API에게 전달하여야 하는 파라메터값에게 저장 jmp xxxxxxxx 변경해줄 주소 지정

- 각 쓰레드 인젝션 및 실행

6. Thread Injection & API 코드패치 Hooking 결과


- 정상적으로 작성 및 실행



프로젝트명

메모리 변조 탐지 프로그램

수행기간

4

사용 도구

Microsoft Visual Studio 2010 C언어, 핀볼게임, DLL , CheatEngine6.5

목적

메모리 변조 탐지를 위해 어떤 방법들이 있는지 알기 위함

1.메모리 보호 기능 및 구조 설명


- 메모리 보호 대상을 핀볼게임(PINBALL.EXE)으로 하였습니다.

메모리 변조가 가능할 경우 PINBALL.EXE+13C98 = 핀볼 점수에 관한 주소값을 자신만의 코드로 점프 시킨 후 점수를 받는 ECX 레지스터를 9999999 점수로 조작이 가능하게 됩니다.

이런 메모리 변조를 탐지하며 DLL인젝션을 통하여 메모리변조 가능성도 막기 위하여 감지하며, 디버깅 기능 또한 탐지.


2.메모리 변조 탐지

- 메모리 탐지를 할 영역은 PINBALL.EXE로 하였습니다. 해당 프로세스의 모듈 값을 기본 주소로 잡고 모듈 값 기본주소 ~ 기본주소+설정 까지 실행 시키면서 CheckSum을 이용한 결과값을 리턴 시킨후 결과값 = 원본CheckSum값이 일치하는지 확인하는 방식입니다.

- MemoryDetection.h에 실행중인 CheckSum 구하는 중


PINBALL.EXE 모듈값을 먼저 얻어옴

<GetRemoteModuleHandle.h>

PINBALL.EXE ProcessID를 구한 후 CreateToolhe32Snapshot()을 이용하여 모듈을 불러옴 Module32First()modEntry 인자값을 받고 modEntry.hModule EXE모듈값을 구할 수있습니다.


<MemoryDetection.h>

위에서 받아온 모듈값 영역 기반으로 메모리값이 고정인 반면 변조가 되었을 시 손해를 볼 수 있는 구간을 지정 합니다. VirtualQueryEx 대상 프로세스의 메모리 영역 정보를 가져 올수 있으며, 필요없는 값이 들어 있는 메모리 부분을 걸러낼 수 있습니다. MBI.Type 메모리영역 정보를 불러온 타입 정보 중에 IMAGE 페이지 타입 과 MEM_COMMIT 페이지 상태인 것 만 구분 시킵니다. IF문을 지나가게 되면 RPM API를 통하여 해당 어드레스 1바이트의 값을 CheckSum에 저장 시킵니다.



<MemoryHashCMP.h>


CheckSum 리턴값을 받은 후 원본 CheckSum 결과값이랑 일치하는지 판단하여 일치하지 않는다면 디텍터 프로세스와 보호대상 프로세스를 종료 시킵니다.


<변조 전>


<변조 후> 대상 프로세스 종료 메시지창 확인 후 디텍터 프로세스 종료.


3.안티 디버그

 

ZwQueryInformationProcess 함수에서 디버거가 사용되는 0x7 포트를 감지하는 형식으로 해당 프로세스에 0x7 포트가 있는지 판단 후 상황 대처를 하게 됩니다. hProcess를 통하여 보호대상 프로세스를 지정 , GetCurrentProcess()를 사용하여 디텍터 자기 자신 프로세스를 보호


<디버거 사용 전>


<디버거 사용 후>



4.안티 DLL인젝션


어떤식으로 DLL인젝션을 체크하여야 하는지 생각하다가 윈도우에서 지원해주는 기본 DLL들을 걸러낸 후 외부에서 DLL이 들어오게 될 경우 해당 DLL의 모듈값을 구한 후 DLL인젝션에서 주로 사용되는 CreateThread() 함수가 해당 DLL에서 사용이 되는지 확인하는 방식으로 만들었습니다.

그리고 CreateThread()뿐만 아니라 의심가는 API를 해당 DLL에서 호출하는지 확인 후 소스에

추가를 해주면 됩니다.



여기서 사용 된 감지는 ChreateThread() 호출 하는 DLL을 감지를 하겠습니다.

메모리안의 ChreateThreadDLL.dllCreateThread 함수를 호출하는 값이 존재하는지 Window에서 지원하는 DLL을 제외 후 외부에서 인젝션 된 DLL을 검사합니다. 검사 방식은 메모리변조와 동일한 방식으로 검사 할려는 값을 CreateThread 호출 값으로 바꾸었습니다.



CreateThread() 함수를 호출하는 DLL명을 검출 및 해당 주소에서 감지 되었다 문자열이 출력되도록 하였습니다.


5.결론

처음에 시도하였을땐 생각으로만 대충 알고 있었지만 막상 해볼려니 필요한 함수들이 많았습니다. 또 그 해당 함수들의 이해가 필요로 하다보니 이해 할려는 부분에서 시간을 많이 사용 한 것 같습니다. 현재 프로그램에서 추가를 하게 된다면 CheckSum 부분을 암호화 시키는 형식입니다. 암호화 알고리즘은 그나마 사용했었던 디지털 이미지 보안에서의 DES 암호 알고리즘을 추가하거나 일방향 CRC알고리즘을 알아보아야 할 것 같습니다. 그리고 보호프로그램 또한 변조되지 않도록 해시값을 통하여 변조 유무도 추가되어야 하며 안티디버깅 방법들은 많아서 여러 가지를 추가하여도 좋은거 같습니다




블로그 이미지

_B_G_

,