FreePascal Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
FreePacal 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

FreePascal Q&A
[53] 라자루스 1.0 64비트 문제의 원인
빌더(TWx) [builder] 2936 읽음    2012-09-09 10:37
Lazarus.exe (64bit) 와 Lazarus.exe 로 생성된 애플리케이션(64bit) 모두 파일오픈 다이얼로그 관련해서 문제를 보인다.

IDE 와 애플리케이션을 64bit Injection 방식으로 후킹해서 살펴 보면 아래와 같이 이상한 동작을 보이고 있음을 알수 있다.

...
[3896] Hooking: 64bit EXE ok...	
[3896] GetModuleHandleA(kernel32)	
[3896] GetModuleHandleA(kernel32)	
[3896] GetModuleHandleA(comctl32.dll)	
[3896] CoInitializeEx(2) -- 1)	
[3896] CoInitializeEx(2) -- 2)	
[3896] CoInitializeEx(2) -- 3)	
[3896] CoInitializeEx(6) -- 4)	
[3896] CoInitializeEx(2) -- 5)	
[3896] GetModuleHandleW(shell32.dll)	
[3896] GetModuleHandleW(USER32.DLL)	
[3896] CoInitializeEx(2) -- 6)	
[3896] CoUninitialize() -- 5)	
[3896] CoInitializeEx(6) -- 6)	
[3896] CoUninitialize() -- 5)	
[3896] CoInitializeEx(6) -- 6)	
[3896] CoUninitialize() -- 5)	
[3896] CoInitializeEx(6) -- 6)	
[3896] CoUninitialize() -- 5)	
[3896] CoInitializeEx(6) -- 6)	
[3896] CoUninitialize() -- 5)	
[3896] CoInitializeEx(6) -- 6)	
[3896] CoUninitialize() -- 5)	
[3896] CoInitializeEx(6) -- 6)	
[3896] CoUninitialize() -- 5)	
[3896] CoInitializeEx(6) -- 6)	
[3896] CoUninitialize() -- 5)	
[3896] CoInitializeEx(0) -- 6)	
[3896] GetModuleHandleW(ntdll.dll)	
[3896] CoInitializeEx(6) -- 7)	
[3896] CoInitializeEx(6) -- 8)	
[3896] GetModuleHandleW(ntdll.dll)	
[3896] CoInitializeEx(6) -- 9)	
[3896] CoUninitialize() -- 8)	
[3896] CoInitializeEx(6) -- 9)	
[3896] CoUninitialize() -- 8)	
[3896] CoInitializeEx(6) -- 9)	
[3896] CoInitializeEx(6) -- 10)	
[3896] CoInitializeEx(6) -- 11)	
[3896] CoUninitialize() -- 10)	
[3896] CoInitializeEx(6) -- 11)	
[3896] CoUninitialize() -- 10)	
[3896] CoInitializeEx(6) -- 11)	
[3896] CoUninitialize() -- 10)	
[3896] CoInitializeEx(6) -- 11)	
[3896] CoUninitialize() -- 10)	
[3896] CoInitializeEx(6) -- 11)	
[3896] CoUninitialize() -- 10)	
[3896] CoInitializeEx(6) -- 11)	
[3896] CoUninitialize() -- 10)	
[3896] CoInitializeEx(6) -- 11)	
[3896] CoInitializeEx(6) -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoUninitialize() -- 12)	
[3896] CoInitializeEx(6) -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoInitializeEx(6) -- 15)	
[3896] CoUninitialize() -- 14)	
[3896] CoInitializeEx(6) -- 15)	
[3896] CoUninitialize() -- 14)	
[3896] CoInitializeEx(6) -- 15)	
[3896] CoUninitialize() -- 14)	
[3896] CoInitializeEx(6) -- 15)	
[3896] CoUninitialize() -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] CoInitializeEx(6) -- 14)	
[3896] CoUninitialize() -- 13)	
[3896] GetModuleHandleW(ntdll.dll)	
[3896] CoUninitialize() -- 12)	
[3896] CoUninitialize() -- 11)	
[3896] CoUninitialize() -- 10)	
[3896] CoUninitialize() -- 9)	
[3896] CoUninitialize() -- 8)	
[3896] CoUninitialize() -- 7)	
[3896] CoUninitialize() -- 6)	
[3896] CoUninitialize() -- 5)	
[3896] CoUninitialize() -- 4)	
[3896] CoInitializeEx(0) -- 5)	
[3896] CoUninitialize() -- 4)	
[3896] CoInitializeEx(0) -- 5)	
[3896] CoUninitialize() -- 4)	
[3896] CoUninitialize() -- 3)	
[3896] GetModuleHandleW(KERNEL32)	
[3896] GetModuleHandleW(user32.dll)	
[3896] CoUninitialize() -- 2)	
[3896] Unhook: 64bit EXE
...



[3896]은 후킹된 64비트 프로세스의 핸들이므로 신경 쓸 건 없다.

문제는 COM Library를 사용 하면서 불필요 할 정도로 COM APartment Thread 가 초기화 되고 있다는 것이다.

마지막 부분인 "CoUninitialize () --2)" 의 경우, 정상적인 경우라면 카운트 값이 2가 아닌 0이 되어야 하는데,

COM APartment Thread가 정상적으로 해제 되지 않고 있다.


위와 같이... 라자루스는 COM 관련해서 문제가 있다는 것을 알수 있다.

그게 라자루스 자체 Install 프로그램의 버그로 인해, 레지스트리에 COM 모듈들의 정상적인 동작을 방해하는 엔트리가 쓰여

졌을 수도 있고, COM/OLE 관련한 라자루스 패키지, LCL 등의 코드가 64비트 COM 모델과 호환성을 갖도록 제대로 코딩 되지

못해서일 수도 있다.


시스템에 따라서 문제가 나타나기도 하고, 또는 그 반대로 나타나지 않기도 하는 것은...

COM은 MS사에 의해서 기본적으로 제공되는 것도 있지만, 써드파티 프로그램 들에 의해서 인스톨 과정에서 설치가 되는 경우도

있기 때문이다.

사용자의 시스템 환경에 따라서 COM 모듈의 전체적인 구성이 다르기 때문에..

어떤 시스템에서는 운좋게 문제가 발생하지 않은 것일 뿐... 라자루스는 위와 같이 COM과 관련해서 문제를 갖고 있음을 알수 있다.



인젝션 후킹 코드를 더 추가해서... 라자루스의 내부 동작을 더 자세하게 들여다 볼수도 있지만  별로 큰 의미는 없을 것 같다.

라자루스 만든 애들이 알아서 할것이므로...


....

+ -

관련 글 리스트
53 라자루스 1.0 64비트 문제의 원인 빌더(TWx) 2936 2012/09/09
60     Re:라자루스 1.0 64비트 문제의 원인 NeoDreamer 2762 2012/09/11
54     Re:라자루스 1.0 64비트 문제의 원인 MarunGuy 2770 2012/09/09
55         Re:Re:라자루스 1.0 64비트 문제의 원인 빌더(TWx) 2841 2012/09/10
56             Re:Re:Re:라자루스 1.0 64비트 문제의 원인 MarunGuy 2761 2012/09/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.