DLL Injection (2) - EAT 를 이용한 DLL Injection
이전 글에서 DLL Injection의 기본 개념에 대해서 언급하였다.
이제는 실제로 Injection 을 해보자.
이번 글에서는 EAT(Export Address Table)을 이용하여 DLL Injection을 해보겠다.
EAT를 이용하여 Injection하는 방법들 중에서 저는 주로 프로세스에서 로드하는 DLL을 확인하여 그와 같은 이름으르 DLL을 넣는 방법을 주로 사용합니다.
그럼 DLL 를 Injection 하는데 어떻게 같은 이름으로 DLL Injection하는가? 그건 MS에서 윈도우를 만들때 DLL을 호출하는 순서에 따른것을 이용합니다.
MSDN에서 찾은 내용인데, 첫번째를 보면 현재 프로세스의 실행 모듈이 있는 디렉터리를 우선 순위로 찾는 것을 알 수 있다.
즉, 아무리 정상적인 DLL이 들어있어도 실행 모듈에 가까운 비정싱적인 DLL이 있으면 비정상적인 DLL를 실행하는 것입니다.
하지만...
같은 이름을 가진 비정상적인 DLL 이더라도 정상적인 DLL을 호출하는 경우가 더 많습니다. ㅎㅎㅎㅎㅎㅎㅎ.......
그러면 어떻게 비정상적인 DLL를 로드시키느냐?
저는 걍 DLL 을 하나하나 다 만들어서 확인해봅니다.
먼저 프로세스에서 DLL 을 호출하는 목록을 확인하고 하나씩 확인해봅니다.(!?)
그러면 아래와 같은 에러가 발생합니다.
DLL을 확인하는 방법은 그냥 텍스트 파일을 생성해서 확장명을 .dll로 바꾸면 됩니다. 그러면 위와같은 에러가 발생합니다.
DLL을 확인했으면 EXPORT 함수들을 가져와 제작할 차례입니다.
[이렇게 EXPORT하는 DLL들이 적으면 만들기도 쉬워요 하핳]
디버거들 보시면 DLL 로드 하는 것도 볼 수 있고, EXPORT, IMPORT 함수들도 볼 수 있습니다.
여기서 EXPORT하는 함수 목록만 가져와서 저장합니다.
왜냐하면 똑같이 EXPORT해야지 정상적으로 실행이 되기 때문입니다.
이제 DLL을 제작할 차례입니다.
먼저 LoadLibrary 를 이용해서 똑같이 만들 타겟 DLL을 호출해줍니다.
LoadLibrary를 호출할 경우 성공했을 때 반환 값은 해당 DLL의 핸들 값입니다.
두번째는 GetProcAddress 를 사용하여 EXPORT하는 함수들을 전부 호출해줍니다.
GetProcAddress 는 해당 DLL의 함수 시작 주소를 반환합니다.
EXPORT하는 모든 함수를 위와 같은 방식으로 제작하셨으면 프로세스에서 해당 함수를 접근 했을 경우 정상적인 DLL처럼 작동하기 위해서 해당 함수로 넘겨주어야합니다.
어떻게???
이미 해당 함수 주소를 가지고 있기 때문에 그냥 해당 점프로 이동시켜 주면 끝납니다.
인라인 함수라는 편한게 있기 때문에 그냥 점프 시켜주면 정상적으로 실행이 되는 거죠.
[하지만 x64에서는 인라인 어셈이 되지 않습니다.]
NAKED??
__declspec(naked) 을 NAKED로 정의 해놓았습니다.
그럼 __declspec(naked) 는 무엇이냐?
간단합니다.
__declspec(naked)를 사용하면 어셈블리 코드에서 필요한 에필로그, 프롤로그 부분을 선언하지 않아도 됩니다.
이 파일을 컴파일한 뒤 실행파일이 있는 곳에 넣어주셔서 실행해주시면 됩니다.
만약 성공적이라면 여러분이 만든 함수가 DLL 로드가 될겁니다.
EAT Injection 과정을 PT 한장으로 요약하면 아래와 같습니다.
[PT를 스크립트를 제작하기 위한 글...? ㅎㅎ]
'My Study > System' 카테고리의 다른 글
API Hooking x86 x64 (0) | 2016.05.23 |
---|---|
DLL Injection (3) - Injector 사용 (0) | 2016.05.23 |
DLL Injection (1) - 간단 기본 개념 (0) | 2016.05.23 |
Memory : stack(스택) (0) | 2015.06.26 |
Calling Conventions(콜링 컨벤션) (0) | 2015.05.18 |