티스토리 뷰
64비트 MASM으로 작성한 IAT Hooking 자료.
이번 포스팅에서는 위 링크에서 MASM으로 작성한 x64 IAT Hooking 코드를 C언어로 변경한 코드를 소개한다. 자료가 없어서 직접 변경한 소스코드이며, MASM 코드는 x32 IAT Hooking 코드와 크게 다르지 않기 때문에 별도로 포스팅하지 않는다.
[ IAT64.dll ]
[4-5] : x64 환경에서는 주소를 8Byte로 처리하기 때문에 편리를 위해 선언한다.
[7] : lpApiMessageBoxA 변수는 Library의 실제 API의 주소가 저장되는 변수이다.
IAT 변조 후 기존 API를 호출할 방법이 없기 때문에 저장한다.
[8] : lpIATMessageBoxA 변수는 IAT상 Target API가 존재하는 주소를 저장하는 변수이다.
이 변수를 통해 PatchAddress를 호출하여 변조하고, 원상복구한다.
[12-16] : Target API를 변조할 Hooking Function이다.
GetFunctionTable은 IAT 상에서 Target API가 존재하는 주소를 반환하는 함수이다. 이 주소를 lpIAT 변수에 저장해 해당 주소를 패치해 IAT Hooking을 진행하게 된다.
[28] : hModule에 0x3C를 더한 부분은 해당 모듈의 e_lfanew 인데, 이 부분은 PQWORD가 아니라,
PDWORD로 형변환해야한다. PE32+ Header도 대부분의 RVA는 4Byte로 저장하기 때문이다.
( 당연하지만 hModule은 QWORD로 형변환 해야한다. hModule은 VA이기 때문이다!! )
64비트 PE파일이라고 해도 크게 Header의 차이는 없다. 구조체가 32, 64로 구분되서 사용되는게 아니라면 나머진 동일하다. 예를들어 OPTIONAL_HEADER가 있다.
[30-34] : x32 환경과 다르게 16을 더 더해줘야한다 !!
왜냐하면 OPTIONAL_HEADER은 32비트와 64비트 다르게 구조체가 존재하기 때문이다.
[37-39] : 여기서 IMAGE_IMPORT_DESCRIPTOR 구조체의 Name변수를 통해 내가 원하는 DLL명과
동일한지 확인한다.
[40] : IMAGE_IMPORT_DESCRIPTOR 구조체의 OriginalFirstThunk(INT) 배열을 따라 순환하기 위해
배열의 첫 번째 Element를 변수에 저장한다.
[43-45] : INT의 Element는 IMAGE_IMPORT_BY_NAME 구조체 배열인데 이 구조체의 Name 변수를
통해 내가 찾는 Target API인지 확인한다. 아니라면 dwCount를 8 증가시킨다.
[46-48] : 내가 찾는 Target API라면 INT가 아니라 IAT의 주소를 반환해야하기 때문에
IMAGE_IMPORT_DESCRIPTOR 구조체의 FirstThunk(IAT) 의 주소에 dwCount를 더해 반환한다.
PatchAddress 함수는 lpOrgProc 의 주소가 참조하는 곳을 lpNewProc 으로 덮어씌워 IAT Hooking을 진행하는 함수이다. 참조하는 곳을 덮어씌워야 한다는 점을 기억하자.
이외에는 특별한건 없다!
실습
victim_64.exe 프로그램은 화면의 아무곳이나 누르면 위와같이 메세지창이 뜨고 누르는 버튼에 따라서 다른 메세지창이 출력되는 간단한 프로그램이다.
내가 위에서 작성한 코드는 어떤 버튼을 눌러도 취소를 눌렀을 때처럼 cancel 문구가 담긴 메세치창을 띄우도록 한 코드이다. 제대로 동작하는지 확인해보자.
원래 예를 누르면 이렇게 yes가 담긴 메세지창이 떠야한다.
IAT Hooking을 위해 DLL을 Injection 해보자.
인젝션이 성공적으로 됐음을 알 수 있다.
( 물론 ProcessExplorer로 자세하게 확인해 볼 수 있다. )
이제 "예" 버튼을 눌러도 cancel 메세지 창이 뜨는 것을 확인할 수 있다.
[출처]
'Reversing > Concept' 카테고리의 다른 글
[Reversing] x64 IAT Hooking을 이용한 NotePad WriteFile API Hooking실습 (C언어) (0) | 2020.04.13 |
---|---|
[Reversing] x32 IAT Hooking을 이용한 API Hooking (C언어) (0) | 2020.04.09 |
[Reversing] x64 Trampoline API Hooking을 이용한 메모장 실습 (0) | 2020.03.17 |
[Reversing] Trampoline API Hooking 전체코드. (0) | 2020.03.14 |
[Reversing] x86 환경 5Byte 패치를 통한 Trampoline API Hooking (0) | 2020.03.14 |