stat() 함수로 파일 유무를 검사한다면, 당연히 공격자도 stat() 함수를 후킹하려고 할테다.
이 때 한번 더 공격자를 귀찮게 해주자.
일종의 안티 후킹 기법이다.
stat() 함수 구현부 코드가 어디에 있는지 주소검증을 진행한다.
구현부 코드의 위치가 시스템 라이브러리인 libsystem_kernel.dylib 주소공간이 아니라면 100% stat() 함수가 후킹되었다고 확신할 수 있다.
탐지 원리는 아래 포스트 참고.
주소공감 검증 (stat 함수 후킹여부 탐지)탐지 코드 추가
포스트에서 사용했던 기존의 코드에 아래의 코드만 추가하였다.
// stat() 함수 또한 후킹됐을 가능성이 있다. // stat() 함수의 출처가 시스템 라이브러리가 아니라면, 공격자로부터 변경됐다는 뜻이다. int ret; Dl_info dylib_info; int (*func_stat)(const char *,struct stat *) = stat; //함수포인터에 담음(사실 이건 굳이 안해도..) if ((ret = dladdr(func_stat, &dylib_info))) { //실패 시 0, 성공 시 non-null 리턴. NSLog(@"[TEST_LIB] lib:%s",dylib_info.dli_fname); //라이브러리 이름 출력 // 시스템 라이브러리가 아니라면 100% 후킹임을 확신할 수 있다. // "/usr/lib/system/libsystem_kernel.dylib"와 동일한 경우만 통과. if (strcmp(dylib_info.dli_fname, "/usr/lib/system/libsystem_kernel.dylib")) { exit(1); } }