본문 바로가기

My Study/Reversing

DLL 파일 EXE로 바꿔서 실행 시키기

이번에 해볼 내용은 DLL파일을 EXE파일로 바꿔서 실행시켜보는 내용입니다.
이에 대한 내용은 dll이 패킹 되어 있을 때 언패킹을 해서 실행시켜볼 때 유용한 방법이 되겠습니다.
그리고 보통 악성코드를 분석하다보면 대부분 virus는 특정 프로세스에 dll injection을 시도하게 됩니다.
대부분 explorer.exe가 대상이 되죠. 이 때 이 dll이 어떠한 일을 하는지 분석을 할 때 그 dll을 exe로 바꿔서 분석을 하면
훨씬 간편할 것입니다. 뭐 Injection 대상 프로세스의 함수를 후킹해서 어떠한 동작을 하는 dll이라면 해당 프로세스에 붙힌 상태로 분석을 해야겠지요?? ^^;

일단은 시작해보겠습니다.
====================================================
먼저 dll을 하나 만들어보겠습니다.

그냥 dll이 로딩되면 cmd창을 띄우고 끝나는 dll입니다.

그러면 이제 방법을 설명드리겠습니다. 어떠한 방법을 사용해서 dll을 exe처럼 인식하게 해서 실행을 시키는지..
1. PE구조에서 IMAGE_NT_HEADERS -> IMAGE_FILE_HEADER -> Characteristics
   부분을 수정시켜주어야 합니다. 해당 부분은 2Byte로 이루어져 있는데 여기서 파일이 dll로 인식되게 할 것인지 
   exe로 인식되게 할 것인지를 결정짓게 됩니다.
   보통 dll인 경우 해당 값이 0x2102이고 exe인 경우 0x010F 값을 지니게 됩니다.

2. 1번을 수행했다면 해당파일의 확장자를 dll에서 exe로 바꿔줍니다.

3. dll main을 보시면 fdwReason값이 DLL_PROCESS_ATTACH ( 1 )일 경우 동작을 하게 됩니다. 
   그렇기 때문에 강제적으로 fdwReason값을 무조건 1이 되도록 설정해버리면 됩니다.
위 3가지 과정이 전부입니다.
1번부터 보시겠습니다.


저기있는 값을 0F 01 로 수정시켜줍니다. ( 리틀 엔디언.. )

2번 입니다.


3번입니다.


PUSH ESI가 fdwReason부분이고
아래 그림을 보니 fdwReason이 1이 아니면 점프를 하게 됩니다.
그러면 점프를 못하게 하면 되므로 해당 점프문을 그냥 NOP처리하면 되겠지..라고 생각하신 분들은 잘못생각하셨습니다.
그냥 NOP처리해주거나 DllMain에서 fdwReason값만 1로 바꾸거나 그러면 런타임 오류가 뜨게 됩니다.


방법은 아에 DllMain을 들어오기 전부터 fdwReason의 값을 1로 바꿔주어야합니다.
처음에 해당 파일을 올디로 열었을 때 OEP부분을 보시겠습니다.

저기서 [EBP+C]값과 1 값을 비교하고 있는데 저 부분에 있는 값을 변경시켜주어야 합니다.
( 어디선가 저 값을 쓰나봅니다 ;; )
즉, [EBP+C]에 들어있는 값을 수정시켜주어야 합니다. 바로 1로 말이죠 ^^
그런데 코드를 어떻게 변경시켜주어야 할지 모르겠군요. ㅜㅜ 콜스택을 봐도 여기 OEP부분이 첫번째 함수입니다.
일단 [EBP+C]에 들어있는 값을 1로 변경시켜주고 실행시켜보겠습니다. ( 원래는 FFFFFFFF 들어있음.. )

제대로 실행은 되는군요.

어떻게 수정시켜주면 될까요?? 그것은 여러분의 과제입니다.

아무튼 위와 같이 1,2,3번 과정을 해주시면 dll파일을 exe파일로 바꾸어서 실행 성공입니다.

전 이 방법을 이렇게 사용했습니다.

1. 악성코드 분석 도중 Virus가 Packing되어 있는 dll을 생성시켜 explorer.exe에 붙혔다.
2. 분석을 하려 봤더니 패킹 되어 있었다.
3. 해당 dll을 exe로 바꾸고 MUP를 해서 다시 dll로 바꾸고 대상 프로세스에 Injection을 다시 시켜주었다.
4. 분석을 열심히 한다.