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

FreePascal Q&A
[56] Re:Re:Re:라자루스 1.0 64비트 문제의 원인
MarunGuy [marunguy] 2756 읽음    2012-09-10 13:29
디버깅하기가 생각보다  훨씬 어렵고 꽤 까다롭겠네요. 디버깅환경 갖추는 것도.TT_TT;;
어쨌든 내공이 남다른 것 같습니다.

빌더(TWx) 님이 쓰신 글 :
: 상황이 재현되고, 라자루스 소스가 공개되어 있다고 해서, 라자루스 디버거를 이용한 디버깅이 가능한 건 아닙니다.
:
: OpenDialog.Execute;
:
: 에 의해서 일단 파일오픈 다이알로그 박스가 뜨면, 그 이후 부터의 동작은 fpc 프로그램 자체와는 아무런 관련이 없고
:
: 외부 COM 모듈들에 의해서 이루어지게 되기 때문 입니다.
:
:
: 윈도우즈 8의 경우...
:
: 다이얼로그 박스가 뜬 상태에서 "새로 만들기" 이외의 다른 동작들을 하고 다이얼로그 박스를 닫으면 아무런 문제가 발생하지 않고,
:
: 아래 그림 처럼 팝업메뉴에서 "새로 만들기"를 선택했을 때 만 fpc 프로그램이 다운 됩니다.
:
:
:
:
: 쉘 Verb 핸들러, 썸브네일, 프리뷰 등의 동작들은 fpc 프로그램 자체가 아닌 외부 COM 모듈들에 의해서 이루어지기 때문에
:
: 라자루스 디버거로는 디버깅이 불가하게 됩니다.
:
:
:
: 특히 COM 의 경우... 프로세스들 간에 IPC 가 사용되기도 하기 때문에...
:
: 문제의 원인을 정확하게 찾아 내기 위해선... 컴 2대를 이용해서 한쪽 PC에는 디버깅 정보를 포함하고 있는 Checked Build OS를
:
: 별도로 설치하고, 다른 쪽 PC에서는 "커널 디버거"를 실행해 놓은 상태에서 리모트 커널 디버깅으로 시스템 자체를 디버깅 해봐야
:
: COM 모듈들의 정상적인 동작을 방해하는 fpc 프로그램의 문제점을 알아 낼 수 있게 되죠.
:
:
: ...
:
:
:
:
:
:
: MarunGuy 님이 쓰신 글 :
: : 이런 분석까지 하다니 놀랍네요.
: : 라자루스는 소스가 공개되어 있으니 제 PC 에서도 상황이 재현되면 디버깅 해볼텐데요..
: : 아쉽네요(?)~~
: :
: : 빌더(TWx) 님이 쓰신 글 :
: : : 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) 2933 2012/09/09
60     Re:라자루스 1.0 64비트 문제의 원인 NeoDreamer 2759 2012/09/11
54     Re:라자루스 1.0 64비트 문제의 원인 MarunGuy 2765 2012/09/09
55         Re:Re:라자루스 1.0 64비트 문제의 원인 빌더(TWx) 2836 2012/09/10
56             Re:Re:Re:라자루스 1.0 64비트 문제의 원인 MarunGuy 2756 2012/09/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.