티스토리 뷰

반응형
이전 포스팅에서 MASM을 이용해 작성한 32bit IAT Hooking에 대해서 소개했다.
이번 포스팅에서는 이 어셈블리 코드를 C언어로 변환해 작성한 코드를 소개한다. 리버싱 핵심원리 책에서 제공된 코드는 현재 환경에서 정상적으로 동작하지 않고, C언어로 작성된 해당 코드가 없기 때문에 진행했다.

MASM 32Bit IAT Hooking 포스팅
 

[MASM] MASM으로 작성한 IAT Hooking을 통한 API Hooking

 

ch4njun.tistory.com

 

[ IAT32.DLL ]

 

[5] : lpApiMessageBoxW 변수는 Dynamic Library상에서 실제 API가 존재하는

      주소를 저장하는 공간이다. Hooking 되지 않은 기존 API 호출을 위해 저장한다.

[6] : IAT 상에서 Target API의 주소가 저장된다.

      이 주소가 참조하는 곳을 변조해 IAT Hooking을 진행한다.

 

 

 

GetFunctionTable 함수는 IAT에서 후킹하고자하는 Target API가 위치하는 주소를 찾아 반환해준다. 어느 부분을 내가 정의한 Hooking Function으로 정의해야 하는지 결정하는 역할이다.

 

[19] : dwCount는 Target API가 IAT상에서 몇 번째에 위치하는지를 세기 위한 변수이다.

[21, 22] : MASM에서는 Register에 해당 구조체의 주소를 넣고 assume 명령어를 사용해

            형 변환을 진행했지만, C언어에서는 위와같이 구조체 포인터변수를 사용하면 된다.

              ( 포인터로 하는 이유는 배열이기 때문이다. ++ 연산을 했을 때 다음 Index로 이동되도록 )

[30] : 해당 모듈의 시작주소에 0x3C를 더하면 e_lfanew의 VA 주소를 얻을 수 있다.

        이 주소의 참조값(NT_Header Offset의 RVA)에 다시 hModule을 더하면, 결과적으로

        searchIID_point에는 NT_Header Offset의 VA를 저장할 수 있다.

 


형변환에 대해서 너무 어렵게 생각하지 말고 아래와 같이 정리해보자

1. 해당 주소를 참조해야할 경우에는 P가 붙은 포인터 변수로 형변환한다.
2. 더하기를 할 때에는 해당 주소에서 4Byte를 사용할거면 DWORD, 1Byte를 사용할거면 BYTE로 형변환한다.
3. 예를 들어서 47번 라인에서 pImportDescriptor->Name에는 이름이 저장되어 있는 4Byte의 주소를 hModule과 더해야 하는 것이기 때문에 hModule을 (DWORD)로 형변환한 후 더하기를 지행해야 한다.
4. 또 한가지 예를 들자면 30번 라인에서 hModule을 PBYTE로 형변환 하는 이유는 0x3C를 더한 주소의 참조값을 통해 NT_Header의 Offset을 구해야하기 때문에 포인터변수로 형변환을 해야한다.

 

[46] : 마찬가지로 IMAGE_IMPORT_DESCRIPTOR 구조체 배열에서 OriginalFirstThunk(INT),

        FristThunk(IAT) 가 존재하지 않을 때 까지 순환한다. 사실 IAT는 재줄필요 없는데

        아예 IAT가 비어있을 경우 순환하지 않도록 하기 위함인 것 같다.

[47-50] : IMAGE_IMPORT_DESCRIPTOR 구조체의 Name 변수를 통해 DLL Name이 저장된

            VA를 구한 후 strcmp를 통해 내가 찾는 DLL인지 확인한다.

[52-55] : IMAGE_IMPORT_DESCRIPTOR 구조체의 OriginalFirstThunk(INT) 변수를 통해

            내가 찾는 Target API를 찾기위해 INT를 순환한다.

[58] : INT는 IMAGE_IMPORT_BY_NAME 구조체 배열로 이루어져 있는데 이 구조체의

        Name 변수를 통해 내가 찾는 Target API 인지 확인한다.

[63-66] : 내가 찾는 Target API라면 IMAGE_IMPORT_DESCRIPTOR의 FirstThunk(IAT) 를 통해

            dwCount만큼 추가된 Target API가 IAT상에 위치하는 주소를 반환한다.

[71, 74] : 구조체 포인터에 저장해뒀기 때문에 그냥 증가연산자만 사용해도 그 크기만큼 증가한다.

 

 

 

PatchAddress 함수는 lpOrgProc가 참조하는 곳에 lpNewProc을 덮어써 API Hooking을 진행하는 함수이다. 참조를 해야하기 때문에 lpOrgProc을 PDWORD로 형변환하는 것을 확인할 수 있다.

 

 

 

GetModuleHandle의 인자로 들어가는게 대상 프로세스명인데 여기선 victim.exe를 사용했다.

 

 


실습

우선 32Bit 기준이기 때문에 x86으로 컴파일을 진행한다.

 

 

victim.exe를 실행하고 화면의 아무곳이나 클릭하면 메세지박스가 뜨고 버튼 클릭시 무슨 버튼을 클릭했는지 다시 한번 메세지창이 뜨는 Program이다.

 

 

 

이제 SimpleInjector(x86) 프로그램을 사용해 victim.exe에 내가 만들어낸 IAT32.dll을 Injection해보고 그리고 victim.exe 프로그램이 어떻게 동작하는지 확인해보자.

 

 

똑같이 "예" 항목을 눌렀지만 기존 의도와 다르게 cancel 메세지 창이 뜨는 것을 확인할 수 있다.

 

코드 및 DLL파일 다운로드.

 

C_IAT32.zip

 

drive.google.com

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   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
글 보관함