최신목록

2017년 7월 20일 목요일

[windbg]IAT 테이블 이용해서 system function 찾기

windows 2012 r2에서 system process에서 LoadLibrary break 걸때는 bp kernel32!LoadLibraryW 하고 사용을 잘하고 있었는데.... windows 2016에서 계속 couldn't resolve error 가 떴다.

아래와 같이 심볼도 잘 올라왔고 kernel32에 있는 api가 아닌가??? msdn을 확인해봐도 kernel32에 있단다....뭐죠..?


windows 2016으로 오면서 kernel32가 변했나? dependency walker로 확인을 해보았다.


api가 정상적으로 export되있다. 근데 왜!!! 무엇때문에 windbg는 인식을 못하는걸까?
그럼 이번엔 process의 IAT 테이블을 이용해서 실제 process가 LoadLibrary를 어떤 모듈에서 가져오는지 확인해보기로하자.

IAT table은 process 의 IMAGE_NT_HEADERS>IMAGE_OPTIONAL_HEADER 의 DllCharacteristics에 존재한다. windbg는 해당 정보를 dh 명령어를 통해 자세히 보여준다.



하단에 Import Address Table Directory 옵셋(62D0)과 해당 테이블의 사이즈(450) 정보가 보인다. 이 옵셋을 해당 프로세스의 ImagebaseAddr과 결합하여 심볼정보를 보면 import된 API 심볼이 보일것이다. ImagebaseAddr은 'lm m <Module>'을 통해 볼 수 있다.



LoadLibrary로 검색해보면 API가 없고 kernelbase!LoadLibraryExW 가 존재한다. LoadLibrary기능중 호출될거 같은 놈이다 ㅎ break 걸고 LoadLibrary 호출상황을 만들어본다.


앗 여기...kernelbase!LoadLibraryA 가 .... kernel32를 안쓰고 kernelbase를 쓰네...

음 왠진 모르겠다. 여튼 bp kernelbase!LoadLibraryA 를 이용하는걸로....아시는분?

댓글 1개:

  1. 이유는 아래 URL 참고하시면 되겠음.
    https://msdn.microsoft.com/en-us/library/windows/desktop/dd371752.aspx?f=255&MSPPError=-2147217396
    kernel32와 advapi32 기능을 kernelbase로 나눠줬다는군요...
    2008 r2부터 그랬나본데 ... 이런 관찰력이 안좋은가 ... 이제야 알아차렸네요

    답글삭제