anti importrec ?

Reverse Code Engineering 2010. 6. 18. 20:00 posted by jz-

unpack시 import dir 복구 툴중 제일 편하고 유명한 imprec 많이들 쓰시죠~

imprec에 간단한 버그..랄까.. 안되는 경우가 있고, 이를 이용해서 import 복구를 막는 packer도 있네요.

api redirection은 다 제거한 상태, 즉 exe image에 api 주소가 다 올라왔다고 가정하죠.

iat는 하나의 dll에서 import 하는 함수 포인터들의 array로 구성되죠? 그리고 끝은 0으로 마킹됩니다.


그리고 대부분의 패커는 import 관련 정보(dll명, func명)를 날려버리고 hash라던지 자신만의 방식으로 함수 정보를 저장하고 마지막에 (redirection여부를 떠나서) 해당 위치에 api 주소를 써주게 됩니다.

즉, 패커에게 저 00000000은 필요 없는 부분이죠. 프로세스 로더가 array의 끝을 인식하는데 쓰일 뿐이니까요.

그런데 imprec는 저 00000000을 사용하나봅니다. 0이 나올 때 까지 해당 dll의 api 주소를 수집하는거죠.

여기서 버그가 있는데, 저 00000000 부분에 쓰레기값을 넣으면 imprec가 iat복구를 하다가 (아마)에러로 인해 중단하는지, 복구가 제대로 되지 않습니다.

보죠.



먼저 만인의 연인 calc.exe를 upx로 팩해보죠.



팩이 끝나고, 언팩을 해야겠죠?

엔트리포인트입니다.





oep로 뛰는 부분입니다. 


이제 import가 복구돼 있겠죠?


복구되어 있고, 원본 exe가 그랬듯, array의 마지막은 0으로 잘 마킹이 돼있군요. 

그럼 이제 쓰레기 값을 넣어보죵~



이제 덤프를 뜨고 나서 imprec를 이용해 import를 복구해 보면





peview로 import 복구된 파일을 열어보죠.


mackt 가 importrec에 의해 생성된 section인데 , import directory table이 제대로 생성 안돼있죠?



이런 현상이 일어난다면, import address table을 찾아서, 쓰레기 값을 null로 채워주면 잘 동작하게 됩니다.