TLS 콜백 함수는 기본적으로 프로세스의 스레드 생성/종료시에 호출되게 된다. 그런데 이 함수는 ep 코드보다 먼저 실행이 되기 때문에 이를 이용해 debugging되고 있다면 바로 종료하는 방식으로도 할 수 있다. 이 TLS 콜백 함수를 만들게 되면 pe 정보에 IMAGE_NT_HEADERS - IMAGE_OPTIONAL_HEADER -IMAGE_DATA_DIRECTORY에 IMAGE_TLS_DIRECTORY라는 것이 생기게 된다. 그래서 TLS 콜백 함수를 추가하려면 IMAGE_TLS_DIRECTORY구조체를 추가하면 되는데 AddressOfCallBacks에 함수 주소 배열을 넣으면 된다. 그리고 그 배열의 원소에는 함수의 VA의 주소를 집어넣어주면 완성이다.
windows kernel버전이 6이상이면 시스템 프로세스는 seession id가 0으로 셋팅되고 user seesion id가 1부터 시작하게 된다. 그리고 CreateRemoteThread() 에서는 session 0의 프로그램을 대상으로 한다면 오류를 내뱉게 된다. 이것을 우회하기 위해서는 NtCreateThreadEx()를 이용하면 된다. p.s os 버전에 관한 정보는 GetVersionEx()함수를 이용하여 dwMajorVersion을 통해 커널 버전을 확인할 수 있다.
새로운 ZwResumeThread()함수 내용 - 원하는 dll을 자식 프로세스에 자동 injection 시켜주기 위해서 1. ZwQueryInformationThread()함수를 이용해서 현재 스레드의 정보를 읽어온다. 원래 ZwResumeThread의 인자가 자식 프로세스의 메인 스레드이다. 2. 1번에서 얻은 정보를 바탕으로 자식 프로세스의 PID를 얻어온다. 3. GetModuleFileName()을 통해 dll의 절대 주소를 얻어온다. 4. 그 dll의 경로를 바탕으로 dll을 인잭션 해준다. 5. 그런뒤에 정상적인 ZwResumeThread()를 실행시켜준다.
zwquerysysteminformation 후킹 1. CreateToolhelp32Snapshot()함수를 이용해 현재 실행되어 있는 모든 프로세스 정보를 얻어온다. 2. Process32First(), Process32Next()함수를 이용하면서 모든 프로세스에 dll을 인잭션한다. dll 내용 1. zwquerysysteminformation()함수의 첫 5바이트를 jmp(0xe9) XXXXXXXX로 바꾼다. XXXXXXXX = 새로운 주소 - 원래 API 주소 - 5(0xe9 주소 바이트 포함) 이 방식의 한계 점 : 나중에 생성되는 프로세스에 대해서는 후킹을 진행하지 않기 때문에 새로 작업관리자 등을 실행시키면 프로세스를 숨길 수 없게 된다. 기존 코드 패치 방식의 문제점 : 한 스레드에서는 실..
debugging을 이용해서 후킹 1. DebugActiveProcess()함수를 통해 PID에 해당하는 프로세스를 디버깅을 셋팅한다. 2. WaitForDebugEvent를 통해 debug event debug event 예 = CREATE_PROCESS_DEBUG_EVENT : 프로세스 생성 or attach EXCEPTION_DEBUG_EVENT : 디버거한테 전해지는 예외 (ex : int 3(0xcc) ) EXIT_PROCESS_DEBUG_EVENT : 디버깅 중인 프로세스 종료 3. CREATE_PROCESS_DEBUG_EVENT일 경우, 즉 처음 attach 될 때 3 - 1. GetProcAddres() 와 GetModuleHandle()을 이용해 후킹할 API 주소 알아내기 3 - 2. ..