근 4달여만에 새로운 주제로 블로깅을 하려니 약간 낯선점이 많다. 그래도 이렇게 블로깅을 하려고 한 이유는 어떤 프로그램의 문제점을 알리기 위해서이다.





  최근 해외에 잠시 여행을 다녀왔는데, 그때도 원격으로 컴퓨터를 컨트롤하기 위해서 컴퓨터를 4일동안 켜두었다. 그런데 한 이틀정도 지나서 컴퓨터에 원격으로 접속을 해보니, 아래와 같은 메시지가 떠 있었다.






"컴퓨터의 메모리가 부족합니다."






참고로 컴퓨터의 사양은 아래와 같다.


CPU : Intel Core i7 2670QM 2.2Ghz (Turbo Boost 3.1Ghz)

RAM : TeamGroup DDR3 1333Mhz 8Gb * 2 = 16Gb

VGA : NVIDIA Geforce GT 540M  GDDR3 2048Mb

O/S : MS Windows 7 SP1 x64




  가만히 생각을 해보니, 필자가 윈도우NT/2000기반의 완전한 32비트 운영체제로 넘어오고나서, "메모리가 부족합니다" 라는 메시지를 본적이 기억에도 없는것 같은데, 몇일전에 이 메시지를 보고야 만것이다. 더군다나, 메모리를 16기가로 업그레이드한지 그리 오래되지 않았는데, 메모리 부족 메시지를 보고야 만것이다!  이 메시지를 처음 보고나서,  메모리가 쪼달리나? 싶어서,  보드만 지원된다면 16Gb메모리를 버리고, 32Gb 메모리를 달고 싶었으나, 샌디브릿지 모바일 플랫폼 최대 지원용량은 16Gb기 때문에 아쉬움이 밀려왔다.(?)


  어쨌든 16Gb Physical Memory 환경에서 아무런 작업도 없는 Idle 상태에서 메모리 부족 메시지가 떴다는것은 분명 어떠한 프로그램에서 메모리 할당 후 해제를 해주지 않아서 이러한 문제가 발생했을 가능성이 높다고 판단해서 얼른 작업관리자를 열어서 확인을 해보았다.





 자! 작업관리자로 가만히 살펴보니, Memory Commit으로 정렬해서 살펴보았지만 크게 메모리 누수라 할만큼 사이즈가 크게 잡힌 프로세스는 보이지 않았다. 그래서 핸들을 기준으로 정렬해보니,  oemmice.exe 라는 녀석이 당당하게도 윈도우NT 커널을 제치고 1등으로 핸들을 잡아먹고 있었다. 지금 이 글을 쓰는 시점에서도 oemmice.exe의 핸들은 2개씩 차곡차곡 쌓이고 있다. 시스템의 메모리는 내가 다 독차지 해버리겠다!!   라고 말하면서 메모리를 다 갉아먹는 벌레같이 보일 정도이다.


( 참고 : 컴퓨터를 이틀동안 켜놓았더니  oemmice.exe가 잡아먹는 핸들의 갯수는 무려 3만2천개였으며, 

Physical Memory 사용량은 99%였음 )





  도저히 저 프로그램이 뭐 길래, 어떤 부분에서 핸들을 오픈하고 닫지않는지를 살펴보기 위해서 Process Hacker를 이용해서 내부를 살펴보았다. 



  핸들 리스트를 살펴보니, 레지스트리 키가 계속 2개씩 오픈되고 있음을 확인할 수 있었다. 현재 프로그램의 흐름상 저것이 닫힐일은 절대 없는것이다. 지금 이 글을 쓰는 시점에도 계속 2개씩 열리고 있다.



 저 핸들이 도대체 뭘 하는것인가, 궁금해서 속성을 살펴보았다.


Reference 카운트도 1임을 보면, 여러곳에서 참조를 해서 사용하고 있는것도 아니다. 즉, 단발성으로 Open - Use - Close 형식으로 작성되어져 있을것이다.





  그럼 이제 저 문자열로 레지스트리 키가 오픈된다는것은 알았으니 , RegOpenKey 또는 RegOpenKeyEx 등의 API로 저 경로의 레지스트리를 오픈할것이기 때문에,  API와 문자열을 바탕으로 프로그램의 속을 훑어보았다.



  위 부분은 SCX-1750 Series라는 키와 SCX-1770F Series 라는 키가 오픈될때 사용되는 루틴이다. 사실 SCX-1750과 SCX-1770F라 두 문자열에서 하나의 서브루틴을 사용하는 형태로 프로그램을 짜면 될텐데, 두 문자열이 각각의 루틴을 가지고 있었다. 어쨌든 루틴을 살펴보면, 앞서 언급한 문자열을 파라메터로 넘기면서 RegOpenKeyExA를 호출하고 있음을 확인할 수 있다. 여기까지는 아주 정상적으로 보였다. RegOpenKeyExA가 성공하면 0x00000000 성공이라는 리턴을 뱉을것이고, TEST EAX,EAX를 거친 뒤, JE 점프문에서 점프를 해서 아래로 실행이 쭉쭉 될것이다. 


이제 JE점프문을 따라가보자.

  잉? 앞서 RegOpenKeyExA를 성공하고 JE점프문을 따라서 그대로 내려왔는데, 또 똑같은 파라메터를 전달하면서 RegOpenKeyExA를 호출하고 있다!  즉, 결과적으로 RegOpenKeyExA가 두번 호출되고나서, 아래에서 RegSetValueExA를 이용해서 원하는 작업을 수행한 뒤, RegCloseKey를 수행해서 핸들을 닫는것이다.


즉 수행 루틴은 다음과 같다.

RegOpenKeyExA   ->  RegOpenKeyExA -> RegSetValueExA -> RegCloseKey



이 루틴은 다음과 같은 두 키를 대상으로 두번씩 반복적으로 진행된다.

HKLM\SOFTWARE\Wow6432Node\Samsung\DigitalImaging\CIPToolbox\Samsung SCX-1750 Series

HKLM\SOFTWARE\Wow6432Node\Samsung\DigitalImaging\CIPToolbox\Samsung SCX-1770F Series



이거 아무리 봐도 개발자가 개발하다가 귀찮아서 Copy & Paste를 했거나, 실수로 못봤을 가능성이 크다.



이 프로그램의 정체가 도대체 뭔가 싶어서 바이너리 정보를 살펴봤더니, 다음과 같았다.


 잉? 삼성 디지털 이미징?  생각해보니, 필자는 현재 삼성 SCX-1490W 라는 잉크젯 복합기를 사용중이다. 그럼 SCX-1490W 프린터를 사용하는 사람은 죄다 이 프로그램이 시스템 메모리에 상주하고 있을텐데, 죄다 이런 현상을 겪고 있는건가?

근데 생각해보니 나는 SCX-1490W 모델을 쓰고있는데,  레지스트리 핸들은 왜 SCX-1750 시리즈와 SCX-1770F 시리즈가 열리고 있는거지? 내가 저 프린터 모델을 쓰고 있는것도 아닌데? 아하! 이 프로그램을 여러 모델에서 돌려쓰고 있을 것이다. 그러면...이 문제는 SCX-1490W만의 문제가 아닌, 여러 프린터 모델에도 해당되는 문제일 것이다.



더 큰 문제는 Oemmice 프로그램이 윈도우 시작시 자동실행되고 있다는점이다.


Oemmice Application이라고 떡하니 이름을 올리고 있다!   그렇다면 윈도우 부팅때부터 야금야금 메모리를 잡아먹을 것이다.




핸들 누수는 심각한 문제로 판단되어져서, 프로그램에 임의로 패치를 해야될 필요가 있다. 

(원래는 삼성에서 개선해줘야 하는 문제이다.)

RegOpenKeyExA 가 두번 호출되는것을, 한번 호출되는 형태로 바꿔주어야 될것이다.

따라서 두번째 호출되는 RegOpenKeyExA는 NOP처리를 해주어야 한다.


결론적으로, 패치할 부분은 아래 두군데 이다. (SCX-1750, SCX-1770F 두군데.)













패치를 수행했더니 핸들 테이블이 아래와 같이 아주 깨끗한 상태임을 확인할 수 있었다.







아래는 패치된 파일이다. (만약을 대비해서 원본파일을 백업해두고 덮어씌울것을 권장한다.)

덮어씌울때는 작업관리자에서 oemmice.exe를 강제종료 시킨 뒤, 파일을 교체하고 다시 실행하면 된다.


oemmice.exe






아울러, 삼성에서도 이 문제를 인지하고 프로그램을 개선해야될것이다.


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
by Sone 2012.07.04 13:01
| 1 |

티스토리 툴바