라자루스 팀도 빌더님께서 지적하신 사항을 이미 알고 있겠죠?
하지만 왜 아직도 고쳐지지 않을까요?
비슷한 것이 오래전부터 라자루스 포럼에 올라오는 것 같던데요.
점점 더 64비트 시스템의 비중이 높아질 것 같은데 빨리 해결 되었으면 좋겠네요.
빌더(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과 관련해서 문제를 갖고 있음을 알수 있다.
:
:
:
: 인젝션 후킹 코드를 더 추가해서... 라자루스의 내부 동작을 더 자세하게 들여다 볼수도 있지만 별로 큰 의미는 없을 것 같다.
:
: 라자루스 만든 애들이 알아서 할것이므로...
:
:
: ....