본문 바로가기

프로그래밍

32 / 64bit 프로세스, DLL 관계 MS개발 이야기






출처 : http://devroid.com/80119600920


32비트 운영체제라면 수행되고 있는 모든 프로세스들은 전부 32비트 프로세스이다.

그런데, 만약 64비트 운영체제라면...

64비트 운영체제인 경우에는 수행되는 프로세스들이 32비트 프로세스도 있고 64비트 프로세스도 있다.

 물론 대부분의 서비스들과 시스템 프로세스들은 64비트 프로세스들이다..

하지만 아주 극소수의 프로세스들은 여전히 32비트이다.

익스플로러 같은 경우에는 32비트와 64비트 둘다 사용이 되는데, 그 이유는 기존의 많은 플러그인 들이 32비트 플러그인들이기 때문이다.

 

메시지후킹이나 API후킹을 하기 위해서는 각각의 프로세스로 침투할 DLL들을 만들어야 한다.

보통 API 후킹의 한 방법을 보자면,  침투하려는 프로세스 안에다가 remote thread를 만들어서 목적을 이루는 방법이 있다.

그런데.. 32비트 프로세스에서는 64비트 프로세스에다가 remote thread를 만들수가 없는 제한이 있다.

그러므로 인젝트 시키는 인젝터프로세스가 32비트인 경우에는 64비트 프로세스에다가는 DLL을 침투시킬수가 없는 결과를 가져온다.

그러므로 64비트 프로세스에도 침투를 시켜야만 된다면, 어쩔수 없이 인젝터프로세스도 64비트 프로세스여야 한다.

( 64비트 프로세스로 인젝터를 만든다면, 32비트 프로세스이든 64비트 프로세스이든 모두에게 침투가 가능해진다. )

 

인젝터인 경우는 위와 같은 규칙을 생각하면 되겠고,

인젝트되는 DLL의 경우도 몇가지 생각해볼 문제가 있다.

 

만약 침투하고자 하는 프로세스가 64비트인 경우에는 64비트 DLL만을 침투시킬 수가 있다.

기존에 로딩되어 있는 DLL들을 봐도 전부 64비트 DLL들만 로딩되어 있다.

( 64비트 프로세스에서 LoadLibrary로 32비트 DLL을 로드시키면 false가 떨어진다. )

 

그런데, 웃기는 것은 32비트 프로세스이다.

물론, 규칙은 같다. 32비트 DLL들만을 받아들이며, 64비트 DLL을 LoadLibrary하면 false가 떨어진다.

그런데, 기존에 로딩되어 있는 DLL들을 보면 64비트 DLL들도 로딩되어 있을수가 있다.

( 로딩되어 있다고 하더라도 동작은 안한다. )

 

결론적으로 보면 동일하기는 하다.

프로세스와 DLL의 비트는 일치해야 동작이 된다는것...

 

정리를 하자면...

64비트 운영체제 호환 프로그램을 만들시에... 인젝트역할을 하는 프로세스와 침투역할을 하는 DLL의 비트수에 대해 고려해야 하는데..

만약 64비트 프로세스들에도 침투해야 되는상황이라면(대부분 그럴 것이다.)

인젝터프로세스는 64비트로 만들어야 하고,

침투DLL은 32비트, 64비트 둘다 준비를 해야 한다는 것이다...

 

이렇게 해서.. 32비트 운영체제에서 동작할 때는 32비트 인젝터 프로세스가 수행되어서 32비트DLL을 침투시키면 되고,

64비트 운영체제에서 동작할 때는 64비트 인젝트 프로세스가 수행되어서 32비트DLL과 64비트DLL 모두를 침투시키면 되는 것이다. ( 모든 프로세스를 뒤져서 해당 프로세스가 32비트인지 64비트인지 조사해서 맞는 dll을 침투시켜도 되겠으나, 어차피 침투실패가 될 것이므로, 그냥 둘다 침투시키면 되는 것이다. )