2015. 5. 31. 23:54

후킹 관련된 정리.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안녕하세요.

오늘은 후킹 관련된 자료를 정리 할까 합니다.

최초로 후킹이란것에 관해서 알게 된게 2003년 인데요. 

후킹이란 것보다는 DLL injection 관련되서 보다가 알게된 내용입니다.

그 후 미국에서 책을 찾다가 90년대 중 후반에 이미 후킹관련되서 정리된 내용을 보고 아직 SW 갈길이 멀구나란걸 알게 되었습니다.


최근 Jit CLR 쪽을 후킹 해서 파라미터 로그를 찍는 기능 구현이 run time에 가능하다기에, 

간략히 그간 잊었던 후킹쪽을 찾아 보았는데요.


일전에 이해 못하던 내용이 이제 전체적으로 보여지기 시작하네요. 

참고로 위키 자료 입니다.


http://en.wikipedia.org/wiki/Hooking


대략 위의 내역이 핵심인데요.


1.1은 직접 바이너리를 고치는 방법 입니다.  이럴 경우 배보다 배꼽이 더 커집니다. 

하지만, 이런 과정을 도와주는 툴들이 많이 있는데요. 자유롭게 구사 할려면 직접 헤더 부분 부터 시작해서,

함수 CRC, 참조 하는 테이블까지 죄다 고쳐야 됩니다.


1.2은 런타임에 코드를 삽입 하거나, Address를 수정하는 방법인데요.

DLL injection이 이러한 방식으로 처리 되는 것들 입니다.

핵심은 참조 하는 어느 한곳의 address를 제가 집어 넣은 코드로 점프 시키는 방법 입니다.

 


---

2,1 VMT은 컴파일러에서 Virtual 함수 구현 관련되서 주어진 address pointer를 이용 해서 원하는 곳의 코드로 점프 시키는 방법입니다. 

2.2는 윈도우에서 제공되는 후킹 함수를 활용 하여 키보드 및 마우스 이벤트에 훅을 거는 방벙입니다. 

매크로로 반복 작업 할 때 가장 많이 사용 했던 방법입니다.

2.3은 직접 바이너리를 뜯어 고치는 방법인데요. 어느정도 어셈블리어를 알고 크랙을 해본 사람이라면 금방 알수 있는 내용입니다. 핵심 코드는 디버깅을 해봐야 알겠지만, 기존의 타겟 함수에 자신이 만든 함수 주소로 점프 시킨 후 리턴 값을 얻은 후 원복 처리 하는게 핵심입니다.( dll injection 필요 ) 


2.4는 리눅스에서 사용하는 방법인데요 저도 모릅니다. 


2.5는 IAT 후킹이라고 불리는건데요. Import Address Table 이라는건데요. 이 방법의 핵심 역시 참조 address를 변경 처리 해서 redirect 후 다시 원복 처리 입니다. 

소스를 작성해서 컴파일 하다 보면, 동적으로 올라오는 함수들 또는 정적으로 처리된 함수들의 주소를 프로세스가 갖고 있어야 합니다. 해당 import table의 주소를 바꿔치기 함으로써 저의 함수 (dll injection 후)를 호출하는 방식입니다.



----


공통적으로 알아야 할 부분이 메모리 영역의 권한 입니다.

특정 메모리 영역이 ReadOnly 부분을 Writable 로 바꾸는 부분이 필요 하며 , 해당 프로세스만이 바꿀수 있는지 등을 공부 해보면 좋을듯 합니다. 


그리고.. 포인터 뿐이네요. 


감사 합니다.